Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化具有多个结果的MySQL/MyISAM全文搜索_Mysql_Performance_Full Text Search_Bigdata - Fatal编程技术网

如何优化具有多个结果的MySQL/MyISAM全文搜索

如何优化具有多个结果的MySQL/MyISAM全文搜索,mysql,performance,full-text-search,bigdata,Mysql,Performance,Full Text Search,Bigdata,我有一个MySQL MyISAM表,在关键字列和2000万行上有一个全文索引。当搜索稀有词时,它工作得很好,例如: SELECT count(*) FROM books WHERE MATCH(keywords) AGAINST ('+DUCK' IN BOOLEAN MODE) (0.005s,2k结果) 但当我搜索更常见的术语时,速度要慢得多: SELECT count(*) FROM books WHERE MATCH(keywords) AGAINST ('+YES' IN BOOLE

我有一个MySQL MyISAM表,在关键字列和2000万行上有一个全文索引。当搜索稀有词时,它工作得很好,例如:

SELECT count(*) FROM books WHERE MATCH(keywords) AGAINST ('+DUCK' IN BOOLEAN MODE)
(0.005s,2k结果)

但当我搜索更常见的术语时,速度要慢得多:

SELECT count(*) FROM books WHERE MATCH(keywords) AGAINST ('+YES' IN BOOLEAN MODE)
(5秒,200万结果)

这很有意义,因为最后一个返回的行要多得多,但是如何在文本搜索之前预过滤这些行呢?这不起作用:

SELECT count(*) FROM books WHERE date > "2019-09-23" AND MATCH(keywords) AGAINST ('+YES' IN BOOLEAN MODE)
(5s,0结果)

MyISAM的(可能还有InnoDB的)全文将始终首先进行匹配,然后是任何其他子句。因此,添加额外的过滤器无助于提高速度


这样想吧。。。构造一个FT索引来测试整个表的MATCH子句。在开始工作之前,它还没有准备好处理任何过滤。因此,您必须首先使用FT,然后以另一种方式过滤结果,但不使用任何索引。

我建议删除MyISAM,因为MySQL开发人员正在准备将MyISAM弃用并删除(可能很快),因为InnoDB的性能比MyISAM(如果配置正确)好几英里。。为什么我认为MySQL开发人员准备弃用MyISAM?MySQL手册中有一个提示,当MySQL需要使用基于(磁盘)的临时表处理查询时,您总是能够设置。。。但请注意“在MySQL 8.0.16及更高版本中,磁盘上的内部临时表始终使用InnoDB存储引擎;在MySQL 8.0.16中,此变量已被删除,因此不再受支持。”我切换到MyISAM,因为InnoDB的性能通常很差。我使用MySQL 5.7。例如,第一个查询可能需要1s才能运行(MyISAM为0.005s),顺便说一句,
YES
是MyISAM FTS中的停止字。所以它永远不会被索引;搜索也不会返回任何结果。所以基本上,没有搜索到任何单词,这就是为什么它看起来像是一个完整的表扫描。在这里查看完整的停止词列表:good catch@MadhurBhaiya我没有注意到。。。无论如何,我知道你没有配置MySQL来使用InnoDB,如果你声称/测试MyISAM比InnoDB快。。。但是除了停止字,您还必须处理,因为设置默认为4,因此如果从停止字列表中删除
yes
,它仍然没有索引。。