我正在尝试优化词典中的搜索(109,000个条目,myisam,fullText),现在我将MATCH() AGAINST()
的性能与REGEXP '[[:<:]]keyword1[[:>:]]' AND table.field REGEXP '[[:<:]]keyword2[[:>:]]'
的性能进行了比较。
使用两个关键字,我得到(内部phpmyadmin) 0.0000秒或 0.0010秒 MATCH() AGAINST()
查询与 0.1962 secount> 0.2190秒 for Regex查询。速度是唯一重要的指标吗?我应该更喜欢哪个查询(似乎都产生完全相同的结果)?是显而易见的吗?
这是完整的查询:
SELECT * FROM asphodel_dictionary_unsorted
JOIN asphodel_dictionary_themes ON asphodel_dictionary_unsorted.theme_id = asphodel_dictionary_themes.theme_id
LEFT JOIN asphodel_dictionary_definitions ON asphodel_dictionary_unsorted.term_id = asphodel_dictionary_definitions.term_id
WHERE MATCH (asphodel_dictionary_unsorted.english)
AGAINST ('+boiler +pump' IN BOOLEAN MODE)
和
SELECT * FROM asphodel_dictionary_unsorted
JOIN asphodel_dictionary_themes ON asphodel_dictionary_unsorted.theme_id = asphodel_dictionary_themes.theme_id
LEFT JOIN asphodel_dictionary_definitions ON asphodel_dictionary_unsorted.term_id = asphodel_dictionary_definitions.term_id
WHERE asphodel_dictionary_unsorted.english REGEXP '[[:<:]]boiler[[:>:]]'
AND asphodel_dictionary_unsorted.english REGEXP '[[:<:]]pump[[:>:]]'
ORDER BY asphodel_dictionary_unsorted.theme_id, asphodel_dictionary_unsorted.english
MATCH/AGAINST
解决方案使用完整索引,并且非常有效地搜索索引。
REGEXP
解决方案无法使用索引。它总是迫使桌子扫描并用正则表达式测试每一行。随着表的增长,与行数成比例的REGEXP
查询需要更长的时间。
我几年前进行了全文搜索的全文搜索投掷,在那里我比较了完整的索引方法与LIKE
和REGEXP
。REGEXP
的样本数据为740万行,需要7分钟57秒,而在布尔模式下搜索InnoDB FULLTEXT
索引的时间为350毫秒 - MATCH/AGAINST
查询的查询更快1,363倍。
差异越大,您的行越大。