【问题标题】:MySql FullText Search seems slow, How can I make this faster? Any Optimization required?MySql 全文搜索似乎很慢,我怎样才能让它更快?需要优化吗?
【发布时间】:2015-12-19 05:50:22
【问题描述】:

我有一个包含 100 万条记录的表,并希望应用更快的方法来针对任何搜索查询获取记录。因为我不擅长 mysql 全文搜索。

我做了以下测试:

  • 最初我在单个列上应用了MATCH AGAINS,它快速返回结果。
  • 其次,我在两列上应用了MATCH AGAINS,返回速度很慢。
  • 然后我进行了列优化,将两列合二为一,并在计算列上应用了MATCH AGAINS。它第一次返回非常慢,但在第二次尝试使用相同的搜索词时返回相当快。

我的查询是否有任何问题,我应该如何通过更多优化来修改它?

 select name, meaning, m.gender, m.similar
        FROM
        NAMES n
        INNER JOIN meta m ON m.nameid = n.id
        WHERE MATCH (nameandmeaning) AGAINST ('searchterm*' IN BOOLEAN MODE) 
        AND meaning IS NOT NULL
        ORDER BY LENGTH(m.similar) DESC
        LIMIT 0 , 10;

注意:nameandmeaningname, meaning 的组合。

我的表结构如下:

CREATE TABLE NAMES (
  id BIGINT(20) NOT NULL AUTO_INCREMENT,
  name VARCHAR(100) NOT NULL,
  meaning VARCHAR(2000) DEFAULT NULL,
  nameandmeaning VARCHAR(2000) DEFAULT NULL,
  PRIMARY KEY  (id),
  FULLTEXT KEY constains_name(name,meaning),
  FULLTEXT KEY contains_namemeaing (nameandmeaning)
) ENGINE=MYISAM AUTO_INCREMENT=67846 DEFAULT CHARSET=latin1;

【问题讨论】:

  • 请张贴从表中创建

标签: mysql performance optimization full-text-search


【解决方案1】:
CREATE TABLE NAMES (
  id BIGINT(20) NOT NULL AUTO_INCREMENT,
  name VARCHAR(100) NOT NULL,
  meaning VARCHAR(2000) DEFAULT NULL,
  -- skip this:  nameandmeaning VARCHAR(2000) DEFAULT NULL,
  PRIMARY KEY  (id),
  FULLTEXT KEY constains_name(name, meaning),
  -- skip this:  FULLTEXT KEY contains_namemeaing (nameandmeaning)
) ENGINE=MYISAM AUTO_INCREMENT=67846 DEFAULT CHARSET=latin1;

那么这些应该可以快速工作:

MATCH(name) AGAINST (...)
MATCH(meaning) AGAINST (...)
MATCH(name, meaning) AGAINST (...)

当你升级到 InnoDB 时,你应该拥有所有这 3 个(如果你正在做所有这 3 个 MATCHes):

  FULLTEXT (name),
  FULLTEXT (meaning),
  FULLTEXT (name, meaning)

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 2020-12-27
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    相关资源
    最近更新 更多