SELECT *,
MATCH (name,
tag) AGAINST ('keyword1 keyword2') AS accurat
FROM table_company
WHERE (name REGEXP 'keyword1 | keyword2'
OR tag REGEXP 'keyword1 | keyword2')
AND apg_status=1
ORDER BY accurat DESC
上面是我的搜索查询。任何人都可以告诉我这是一个好习惯吗?因为我想按单词搜索并按结果的准确性排序。
最佳答案
你拥有的东西会非常慢——OR
和 REGEXP
都很慢;所有行都将被繁琐地扫描。
在 WHERE
子句中使用 MATCH...
而不是 or+regexp。
如果 MATCH
需要一些进一步的细化...(例如,MATCH
获得太多行,但是 LIKE
或 REGEXP
可以过滤掉一些东西。)然后做
WHERE MATCH ...
AND ((other filtering conditions))
这是有效的,因为优化器总是(?)优先执行 FULLTEXT
部分而不是其他部分。而且 FULLTEXT
比 LIKE
或 REGEXP
快很多。
ORDER BY accurat DESC
-- 这没问题,但您可能会质疑它选择的顺序。太糟糕了;就是这样。
旁注...如果您使用的是 InnoDB 的 FULLTEXT
,则需要删除任何太短或在停用词列表中的“词”。否则 MATCH
将失败。 (这是对 MyISAM 的更改。)
关于mysql - MATCH AGAINS 和 REGEXP 的组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33605028/