【问题标题】:MySQL MATCH() AGAINST() vs. REGEXP for matching whole wordsMySQL MATCH() AGAINST() 与 REGEXP 匹配整个单词
【发布时间】:2019-07-25 02:23:54
【问题描述】:

我正在尝试优化在我的字典中的搜索(109,000 个条目,MyISAM,FULLTEXT),我现在将MATCH() AGAINST() 的性能与REGEXP '[[:<:]]keyword1[[:>:]]' AND table.field REGEXP '[[:<:]]keyword2[[:>:]]' 的性能进行比较。

使用两个关键字,我得到(在 PhpMyAdmin 内)0.0000 seconds0.0010 seconds 用于 MATCH() AGAINST() 查询与 0.1962 seconds0.2190 秒 用于正则表达式查询。速度是这里唯一重要的指标吗?我应该更喜欢哪个查询(两者似乎产生完全相同的结果)?是不是很明显——速度更快?

以下是完整的查询:

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

【问题讨论】:

  • 如果答案(对于这个问题)不明显,那么它是基于意见的。
  • 同意。但我在 MySQL 方面经验不足,可能会遗漏一些东西,这就是我问这个的原因。
  • 对不起,如果我在笑。但与 SO 上 99% 的问题(答案)相比,您是专家(如果您编写了这些查询):-)
  • 是的,我做到了(写他们)。当然,经过相当多的实验和阅读。谢谢你:)
  • 在某些情况下FULLTEXT 不起作用。它们主要围绕“单词”的异常定义,或者一种与英语的模仿程度不足以让 FT 工作的语言。但是当它起作用时,FT 比REGEXPLIKE很多

标签: mysql regex match-against


【解决方案1】:

MATCH/AGAINST 解决方案使用 FULLTEXT 索引,它搜索索引的效率很高。

REGEXP 解决方案不能使用索引。它总是强制进行表扫描并使用正则表达式测试每一行。随着表的增长,执行与行数成线性比例的REGEXP 查询将需要更长的时间。

几年前我做了一个演示 Full Text Search Throwdown,我将全文索引方法与 LIKEREGEXP 进行了比较。对于 740 万行的样本数据,REGEXP 花费了 7 分 57 秒,而在布尔模式下搜索 InnoDB FULLTEXT 索引花费了 350 毫秒 — MATCH/AGAINST 查询快了 1,363 倍。

您拥有的行数越多,差异就会越大。

【讨论】:

  • 我的数据库不太可能增长,实际上它会变得更小,因为它目前包含许多单数术语和复数术语(英语)的实例,在保加利亚语中具有相同的单数翻译(更多超过一半的条目已经处理)。但是,0.0010 秒和 0.2190 秒之间的差异仍然很大。这就是我想知道的——如果速度是这里的最终标准。谢谢。
猜你喜欢
  • 2012-06-22
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
相关资源
最近更新 更多