Не нравятся результаты поиска? Попробуйте другой поиск!
dle-faq.ru FAQ (все вопросы) Общие вопросы по PHP Как оптимизировать sql запросы?

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


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

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

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)

ПафНутиЙ
1065

3395 | 2433

ПафНутиЙ - 9 июня 2015 21:55 - Админ

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

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

follor
1

243 | 10

follor - 9 июня 2015 22:25 - Юзер

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

D0Gmatist
225

794 | 281

D0Gmatist - 9 июня 2015 22:45 - Местный

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

Каждый программист знает - в правильном софте все должно быть прекрасно:
и пользовательский интерфейс, и программные решения, и гениальные ошибки!
Болтовня ничего не стоит. Покажите мне код.

follor
1

243 | 10

follor - 9 июня 2015 22:48 - Юзер

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

D0Gmatist
225

794 | 281

D0Gmatist - 9 июня 2015 22:52 - Местный

Пример
Среднее время Запрос занял 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
225

794 | 281

D0Gmatist - 9 июня 2015 23:01 - Местный

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

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

Каждый программист знает - в правильном софте все должно быть прекрасно:
и пользовательский интерфейс, и программные решения, и гениальные ошибки!
Болтовня ничего не стоит. Покажите мне код.

follor
1

243 | 10

follor - 9 июня 2015 23:06 - Юзер

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

D0Gmatist
225

794 | 281

D0Gmatist - 9 июня 2015 23:09 - Местный

Было
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
1

243 | 10

follor - 9 июня 2015 23:16 - Юзер

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

D0Gmatist
225

794 | 281

D0Gmatist - 9 июня 2015 23:17 - Местный

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

Каждый программист знает - в правильном софте все должно быть прекрасно:
и пользовательский интерфейс, и программные решения, и гениальные ошибки!
Болтовня ничего не стоит. Покажите мне код.

follor
1

243 | 10

follor - 9 июня 2015 23:19 - Юзер

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

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

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