Mysql用MATCH AGAINST代替LIKE

时间:2019-01-20 02:05:23

标签: mysql sql

我正在尝试优化此查询,我想通过MATCH AGAIN命令替换引起全表扫描的LIKE。

这是原始查询,效果很好,但速度太慢

SELECT DISTINCT a.*, (CASE WHEN a.title LIKE :keywords THEN 300 ELSE 0 END) +
(CASE WHEN a.title LIKE :word_0 THEN 10 ELSE 0 END) +
(CASE WHEN a.description LIKE :word_0 THEN 10 ELSE 0 END) +
(CASE WHEN cl.name LIKE :word_0 THEN 5 ELSE 0 END) +
(CASE WHEN cpl.name LIKE :word_0 THEN 2 ELSE 0 END) +
(CASE WHEN cl.description LIKE :word_0 THEN 1 ELSE 0 END) +
(CASE WHEN cpl.description LIKE :word_0 THEN 1 ELSE 0 END) as relevance,
FROM lara237posts as a
INNER JOIN lara237categories as c ON c.id=a.category_id AND c.active=1
LEFT JOIN lara237categories as cp ON cp.id=c.parent_id AND cp.active=1
LEFT JOIN (SELECT MAX(id) max_id, post_id FROM lara237payments WHERE active=1 GROUP BY post_id) mpy ON mpy.post_id = a.id AND a.featured=1
LEFT JOIN lara237payments as py ON py.id=mpy.max_id
LEFT JOIN lara237packages as p ON p.id=py.package_id
LEFT JOIN lara237categories as cl ON cl.translation_of=c.id AND cl.translation_lang = :translationLang
LEFT JOIN lara237categories as cpl ON cpl.translation_of=cp.id AND cpl.translation_lang = :translationLang
WHERE a.country_code = :countryCode AND (a.verified_email = 1 AND a.verified_phone = 1) AND a.archived != 1 AND a.deleted_at IS NULL AND a.reviewed = 1
GROUP BY a.id, relevance
HAVING relevance >= :average
ORDER BY p.lft DESC, relevance DESC, a.created_at DESC
LIMIT 0, 16

我已经在下面创建了查询,用MATCH AGAIN替换了Like,但是第二个查询没有结果。我想知道问题出在哪里? 以下是我创建的第二个查询

SELECT DISTINCT a.*, (CASE WHEN MATCH(a.title, a.description) AGAINST(:keywords IN NATURAL LANGUAGE MODE) THEN 300 ELSE 0 END) +
(CASE WHEN MATCH(cl.name) AGAINST(:word_0 IN NATURAL LANGUAGE MODE) THEN 5 ELSE 0 END) +
(CASE WHEN MATCH(cpl.name) AGAINST(:word_0 IN NATURAL LANGUAGE MODE) THEN 2 ELSE 0 END) +
(CASE WHEN MATCH(cl.description) AGAINST(:word_0 IN NATURAL LANGUAGE MODE) THEN 1 ELSE 0 END) +
(CASE WHEN MATCH(cpl.description) AGAINST(:word_0 IN NATURAL LANGUAGE MODE) THEN 1 ELSE 0 END) as relevance, py.package_id as py_package_id
FROM lara237posts as a
INNER JOIN lara237categories as c ON c.id=a.category_id AND c.active=1
LEFT JOIN lara237categories as cp ON cp.id=c.parent_id AND cp.active=1
LEFT JOIN (SELECT MAX(id) max_id, post_id FROM lara237payments WHERE active=1 GROUP BY post_id) mpy ON mpy.post_id = a.id AND a.featured=1
LEFT JOIN lara237payments as py ON py.id=mpy.max_id
LEFT JOIN lara237packages as p ON p.id=py.package_id
LEFT JOIN lara237categories as cl ON cl.translation_of=c.id AND cl.translation_lang = :translationLang
LEFT JOIN lara237categories as cpl ON cpl.translation_of=cp.id AND cpl.translation_lang = :translationLang
WHERE a.country_code = :countryCode AND (a.verified_email = 1 AND a.verified_phone = 1) AND a.archived != 1 AND a.deleted_at IS NULL AND a.reviewed = 1
GROUP BY a.id, relevance
HAVING relevance >= :average
ORDER BY p.lft DESC, relevance DESC, a.created_at DESC
LIMIT 0, 16

任何帮助或提示将不胜感激。

非常感谢您

0 个答案:

没有答案
相关问题