Долго выполняэться запрос. Помогите оптимизировать.

Yurich

Новичок
Запрос выполянэться 11-12 секунд. В базе 350 000 записей. Почему так долго - не пойму. Помогите оптимизировать пожалуйста, или как нибуть переделать. буду очень признателен.
PHP:
SELECT id, song, artist
FROM mp3
WHERE (
(
song LIKE '%dear%'
OR artist LIKE '%dear%'
)
AND (
song LIKE '%mama%'
OR artist LIKE '%mama%'
)
AND 1 
)
ORDER BY song ASC 
LIMIT 0 , 20
Структура таблици простая(id, song, artist, album..., индекс по полям id, song и artist), остальные запросы выполняються за доли секунды.
 

zerkms

TDD infected
Команда форума
Потому что LIKE '%...%' всегда выполняется фуллсканом, т.е. полным перебором всех записей. И нет, это никак нельзя оптимизировать
 

Yurich

Новичок
Может как-то подругому сформировать запрос, или использовать два обеденённых запроса, или использовать временныэ таблыцы... Мне надо чтобы эти два слова оба присутствовали в каждом результате запроса, в любой последовательности. (поиск по двом полям)
 

zerkms

TDD infected
Команда форума
"Полнотекстовый поиск" или "sphinx"
В гугл по обоим
 

Yurich

Новичок
Спасибо всем за помощ. Немного почитал про Полнотекстовый поиск. Пришел к такому решению:
Поля song, artist зделал FULLTEXT index
И использовал запрос:
PHP:
SELECT id, song, artist
FROM mp3
WHERE MATCH (
song, artist
)
AGAINST (
'+dear +mama'
IN BOOLEAN
MODE 
)
LIMIT 0 , 30
Скорость увеличилась на порядок!
 

newARTix

Новичок
Yurich
вот только достоверность снизилась. тоже примерно на пол порядка, причем самое обидное, что вводишь целиком song, копипастишь тупо, а оно уже не находит! вот незадача... меня заказчики задрали с этим багом. Ладно, это можно hash index решить, а копипаст части названия со stop words? И тут-то задумываешься про sphinx.
 
Сверху