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
upper是我的搜索查询。谁能告诉我这是一个好习惯?因为我想按字搜索并按结果的准确性排序。
答案 0 :(得分:1)
你所拥有的将会非常缓慢 - OR
和REGEXP
都很慢;所有行都将进行繁琐的扫描。
在MATCH...
子句中使用WHERE
代替or + regexp。
如果MATCH
需要进一步细化......(例如,MATCH
行数过多,LIKE
或REGEXP
可能会过滤掉一些内容。 )然后做
WHERE MATCH ...
AND ((other filtering conditions))
这是有效的,因为优化器总是(?)优先于FULLTEXT
部分而不是另一部分。并且FULLTEXT
比LIKE
或REGEXP
更快。
ORDER BY accurat DESC
- 这没关系,但你可能会对它选择的顺序嗤之以鼻。太糟糕了;它就是它。
旁注...如果您使用InnoDB的FULLTEXT
,则需要删除任何太短或在禁用词列表中的'字词'。否则MATCH
将失败。 (这是MyISAM的变化。)