简体   繁体   English

MySql全文搜索似乎很慢,如何使它更快? 是否需要任何优化?

[英]MySql FullText Search seems slow, How can I make this faster? Any Optimization required?

I have a table with 1 million records and want to apply faster way to fetch record against any search query. 我有一个包含100万条记录的表,并希望应用更快的方法来针对任何搜索查询获取记录。 As I am bad with mysql fulltext search. 由于我对mysql全文搜索不好。

I made following tests: 我做了以下测试:

  • Initially I applied MATCH AGAINS on single column it return result fast. 最初,我将MATCH AGAINS应用于MATCH AGAINS ,它可以快速返回结果。
  • Secondly I applied MATCH AGAINS on two columns and return very slow. 其次,我将MATCH AGAINS应用于两列,返回速度非常慢。
  • Then I made column optimization and combined two columns into one and applied MATCH AGAINS on computed column. 然后,我进行了列优化,将两列合并为一列,并在计算列上应用了MATCH AGAINS It returns very slow on first time but reasonably fast on second attempt with same search term. 第一次返回时返回的速度非常慢,但是在使用相同搜索词的第二次尝试中返回的速度却相当快。

Is there any issue with my query how I should amend this with more optimization? 我的查询有任何问题,我应该如何通过更多优化对其进行修改?

 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;

Note: nameandmeaning is combinition of name, meaning . 注: nameandmeaning是联合而成的name, meaning

My Table Structure is as follow: 我的表结构如下:

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;
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;

Then these should work fast: 然后这些应该可以快速工作:

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

When you upgrade to InnoDB, you should have all 3 of these (if you are doing all 3 of those MATCHes): 升级到InnoDB时,应该具有以下所有三个功能(如果要执行所有这三个匹配):

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM