У меня есть этот запрос, который я пытаюсь оптимизировать, я хочу заменить LIKE, который вызывает полное сканирование таблицы, командой MATCH AGAIN.
Это оригинальный запрос, он работает отлично, но слишком медленно
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
Я создал запрос ниже, чтобы заменить Like на MATCH AGAIN, но второй запрос не дал мне результата. Мне интересно, где проблема?
Ниже приведен второй запрос, который я создал
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
Любая помощь или советы будут с благодарностью.
Большое спасибо заранее