Оптимизировать sql запрос

Kot Matroskin
На сайте с 29.08.2007
Offline
185
306

Всем привет.

Есть sql запрос на поиск информации в БД (mySQL)

Поиск идёт всего по ~4000 строкам, но кажется запрос тяжёлый ибо поиск идёт очень долго.

Есть может идеи как можно оптимизировать сие чудо ?

Немного поясню:

IN NATURAL LANGUAGE MODE используется для сортировки по релевантности, так что-бы первыми были те записи, у которых ключ встречается чаще.

А IN BOOLEAN MODE используется ибо требуется только полное совпадение. Т.е. например "ключ" а не "ключица"

А умножение как раз и отсекает такие случаи...

Буду очень благодарен за помощь!! спасибо

SELECT 

people.id as peopleids,
............................................

MATCH(people.a1) AGAINST ('$search_term_procceded' IN BOOLEAN MODE) AS score1,
MATCH(people.a2) AGAINST ('$search_term_procceded' IN BOOLEAN MODE) AS score2,
MATCH(people.a3) AGAINST ('$search_term_procceded' IN BOOLEAN MODE) AS score3,
MATCH(people.a4) AGAINST ('$search_term_procceded' IN BOOLEAN MODE) AS score4,
MATCH(people.a5) AGAINST ('$search_term_procceded' IN BOOLEAN MODE) AS score5,


MATCH(people.a1) AGAINST ('$search_term_procceded' IN NATURAL LANGUAGE MODE) AS score6,
MATCH(people.a2) AGAINST ('$search_term_procceded' IN NATURAL LANGUAGE MODE) AS score7,
MATCH(people.a3) AGAINST ('$search_term_procceded' IN NATURAL LANGUAGE MODE) AS score8,
MATCH(people.a4) AGAINST ('$search_term_procceded' IN NATURAL LANGUAGE MODE) AS score9,
MATCH(people.a5) AGAINST ('$search_term_procceded' IN NATURAL LANGUAGE MODE) AS score10

FROM people
INNER JOIN rabota ON rabota.vid = people.id

HAVING ((score1+score2+score3+score4+score5)>0)
AND ((score6+score7+score8+score9+score10)>0.5)

AND country IN $search_country,
AND univerid IN $search_univs

ORDER BY ((score1*score6)+(score2*score7)+(score3*score8)+(score4*score9)+(score5*score10)) DESC
Я пользовался 11 разными хостингами. Есть только один ЛУЧШИЙ: ★ он тут ★ (https://goo.gl/R6v3zH) Пишите в ЛС за скидкой. VPS тоже в наличие ! Рекомендую.
edogs software
На сайте с 15.12.2005
Offline
775
#1

inner замените на left, т.к. учитывая having у Вас первая таблица всё равно должна существовать.

having можно спокойно заменить на where, having нужно только при группировке, что бы фильтровать данные после группировки, если группировки нет - он не нужен, а where заведомо быстрее и лучше

country и univerid должны иметь ключи

учитывая что селект Вы полностью не привели - возможно там выбирается туева хуча данных. Если так, то order by может жестко тормозить.

Возможно есть смысл в таком случае сначала выбрать people.id с order by, а потом уже вторым запросом довыбрать все остальное. При этом если country и univerid относятся к таблице people, то в первом запросе джоин вообще не нужен, что опять же изрядно ускорит.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
lutskboy
На сайте с 22.11.2013
Offline
170
#2

IN BOOLEAN MODE и так не найдет вам ключица если вы ищите ключ

и все ети условые лично для меня полный бред

достаточно MATCH(...) AGAINST ('$search_term_procceded' IN NATURAL LANGUAGE MODE)

оно как раз и выдает по релевантности

тяжелый так как много MATCH(...) AGAINST

хотя 4000 строк ето очень мало. возможно из-за INNER JOIN.

у меня такое было. но у меня было 1500000 строк и один MATCH(...) AGAINST

я разбивал на два запроса

первый MATCH(...) AGAINST собирает айди

а потом кидаем их в нужную таблицу. но ето было в моем случае. у вас видимо етот JOIN нужен.

Kot Matroskin
На сайте с 29.08.2007
Offline
185
#3

Спасибо за помощь! Внёс правки согласно рекомендациям.

Заменить having на where не даёт, пишет что нету такой колонки..

А вообще у меня такие чудеса вот.. Похоже самое тяжелое в запросе это вот это первое условие

((score1+score2+score3+score4+score5)>0)

Если поменять местами первое и второе условие

((score1+score2+score3+score4+score5)>0)
((score6+score7+score8+score9+score10)>0.5)

Скорость возрастает в два раза.

Есть совсем убрать первое условие, то скорость вырастает в три раза.

Если убрать второе условие, эффекта нет.

edogs software
На сайте с 15.12.2005
Offline
775
#4
Kot Matroskin:
Заменить having на where не даёт, пишет что нету такой колонки..

Используйте в where не альяс, а оригинал, т.е. матч агаинст вместо скоре.

Kot Matroskin:
А вообще у меня такие чудеса вот.. Похоже самое тяжелое в запросе это вот это первое условие
Если поменять местами первое и второе условие
Скорость возрастает в два раза.
Есть совсем убрать первое условие, то скорость вырастает в три раза.
Если убрать второе условие, эффекта нет.

Эксплеин обоих вариантов покажите.

Вместо с1+с2 >0 попробуйте так же c1>0 or c2>0 - возможно будет быстрее, т.к. отрицательных значений там нет, то в данном случае плюс будет эквивалентен or логически.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий