Технический сбой

Сайт временно работает в режиме только для чтения, идут восстановительные работы. Приносим свои извинения за неудобства.
DLE FAQ » Все вопросы » Общие вопросы по PHP » Как оптимизировать sql запросы?

Как оптимизировать sql запросы?


     Общие вопросы по PHP, MySQL    4932

вопрос
Приветствую, проверил время отклика сайта, и выявились несколько медленных запросов, но как их ускорить, оптимизировать просто понятия не имею, вот пример медленных запросов с временем выполнения:

0,10511804 сек. - [ SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.full_story as full_story2, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.day_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE category regexp '[[:<:]](1|2|3|4|5|6|7|8|9|10|11|12|13|14|21|22|23|708|709|710|711|712|713)[[:>:]]' AND approve=1 AND date < '2015-06-09 21:18:28' ORDER BY day_read DESC, news_read DESC LIMIT 0,6 ]


0,02097297 сек. - [ SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.full_story as full_story2, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE category regexp '[[:<:]](30|31)[[:>:]]' AND approve=1 AND date < '2015-06-09 21:18:28' ORDER BY date DESC LIMIT 0,5 ]


0,02827621 сек. - [ SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.full_story as full_story2, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE category regexp '[[:<:]](1|2|3|4|5|6|7|8|9|10|11|12|13|14|21|22|23|708|709|710|711|712|713)[[:>:]]' AND p.date >= '2015-06-09 21:18:28' - INTERVAL 7 DAY AND p.date < '2015-06-09 21:18:28' AND approve=1 ORDER BY news_read DESC LIMIT 0,7 ]

Ответил: D0Gmatist


Кешируйте... иначе никак... если я понял у вас категорий на китайскую стену хватит... если я правильно вижу то у вас категории от 1 до 713

и если мне память не отшибло то условие изначально кривое
в WHERE условия выполняются по порядку как записаны

правильнее будет так
1) выбрать по дате (быстро обрабатывает) date < '2015-06-09 21:18:28'
2) отсеять по статусу (быстро обрабатывает) approve = 1
3) выбрать категории (регулярка по дольше) category regexp '[[:<:]](30|31)[[:>:]]'

11 комментариев

ПафНутиЙ
Админ

ПафНутиЙ - -

Не используйте мультикатегории, сразу будет значительная экономия за счёт удаления регулярки из запроса.

Каков вопрос - таков и ответ. Просто помните об этом.

follor
Юзер

follor - -

К сожалению в моём случае не вариант, основная информация выводится как раз из мультикатегорий...

D0Gmatist
Юзер

D0Gmatist - -

***Комментарий удален***

follor
Юзер

follor - -

D0Gmatist, да, категорий много, как нибудь в будущем переделаю это всё, но на данный момент пока что так. Что касается Ваших рекомендаций, как я упомянул в sql я мало что понимаю, и не совсем понял как применить Ваши рекомендации.

D0Gmatist
Юзер

D0Gmatist - -

Пример
Среднее время Запрос занял 0.0009 сек
SELECT * FROM `dle_marketplace_purchase` WHERE `datetime_purchase` < '2014-11-24 03:14:34' AND `pay_price` > '500.00'

Среднее время Запрос занял 0.0012 сек
SELECT * FROM `dle_marketplace_purchase` WHERE `pay_price` > '500.00' AND `datetime_purchase` < '2014-11-24 03:14:34'

D0Gmatist
Юзер

D0Gmatist - -

Оптимизируем условия
Теперь настало время произвести оптимизацию самих условных операторов SQL. Большинство запросов используют директиву SQL WHERE, поэтому, оптимизируя условия, можно добиться значительной производительности запросов. При этом почему-то лишь небольшая часть приложений для БД используют оптимизацию условий.

AND
Очевидно, что в серии из нескольких операторов AND условия должны располагаться в порядке возрастания вероятности истинности данного условия. Это делается для того, чтобы при проверке условий БД не проверяла остальную часть условия. Эти рекомендации не относится к БД Oracle, где условия начинают проверяться с конца. Соответственно, их порядок должен быть обратным – по убыванию вероятности истинности.

follor
Юзер

follor - -

Как всё сложно конечно,,,(( Но принцип я понял, пытаюсь что то пробовать на практике, но не могу найти как изменить запросы которые у меня в примере, сначала смотрел в engin.php, но понял что их я там не найду, их же создаёт custom. Из этого появляется очередной глупый вопрос, как применить эти рекомендации к запросам из того же custom блока?

D0Gmatist
Юзер

D0Gmatist - -

Было
SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.full_story as full_story2, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.day_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE category regexp '[[:<:]](1|2|3|4|5|6|7|8|9|10|11|12|13|14|21|22|23|708|709|710|711|712|713)[[:>:]]' AND approve=1 AND date < '2015-06-09 21:18:28' ORDER BY day_read DESC, news_read DESC LIMIT 0,6

Должно быть
SELECT p.id, p.autor, p.date, p.short_story, CHAR_LENGTH(p.full_story) as full_story, p.full_story as full_story2, p.xfields, p.title, p.category, p.alt_name, p.comm_num, p.allow_comm, p.fixed, p.tags, e.news_read, e.day_read, e.allow_rate, e.rating, e.vote_num, e.votes, e.view_edit, e.editdate, e.editor, e.reason FROM dle_post p LEFT JOIN dle_post_extras e ON (p.id=e.news_id) WHERE date < '2015-06-09 21:18:28' AND approve=1 AND category regexp '[[:<:]](1|2|3|4|5|6|7|8|9|10|11|12|13|14|21|22|23|708|709|710|711|712|713)[[:>:]]' ORDER BY day_read DESC, news_read DESC LIMIT 0,6

follor
Юзер

follor - -

Спасибо большое за помощь, но без перелопачивания кучи литературы я не разберусь как изменить эти запросы, если их нет в файлах движка(

D0Gmatist
Юзер

D0Gmatist - -

Это должен сам "Целкасофт" разработчик DLE сделать... )

follor
Юзер

follor - -

Значит единственный выход в моём случае это всё закэшировать, что я и сделал!

Похожие вопросы

наверх