Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Прошу помощи в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Приветствую! В новостном сайте есть один противный запрос, который постоянно валится в лог медленных запросов: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. таблицы Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. Запрос вроде бы простой, но работает плохо... размер базы articles ~500 mb, categories - 1.2 mb. На локальной машине запрос не выполняется вообще: висит пару минут со статусом "Copying to tmp table", после чего останавливается по таймауту. На хостинге бывает по разному, от 2-3 до 7 секунд, но не всегда. В основном отрабатывает шустро. Но проблема, как я понимаю, тем не менее присутствует. Подскажите, как можно оптимизировать данный запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 14:40 |
|
||
|
Прошу помощи в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Какая селективность по каждому из полей в условиях связывания и отбора? Почему для последнего условия не использована форма Код: sql 1. ? Где собственно EXPLAIN запроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 14:49 |
|
||
|
Прошу помощи в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
AkinaКакая селективность по каждому из полей в условиях связывания и отбора? что вы имеете в виду? AkinaПочему для последнего условия не использована форма пробовал и через IN, и через JOIN. Везде показывает одинаковый план запроса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 15:09 |
|
||
|
Прошу помощи в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Забыл написать, в articles ~150 тыс. строк, в categorys 100 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 15:11 |
|
||
|
Прошу помощи в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Victor256 , для таблицы categories явно напрашивается индекс по (id,id_parent). Для таблицы articles - как минимум по (id_section, enable)... хотя не исключаю, что не хуже будет и по (id_section, date_add), а также один из них с добавлением других полей. Victor256что вы имеете в виду? Да собственно именно селективность. Грубо - какой в среднем процент записей отбирается из всего массива при отборе по определённому значению поля. Victor256пробовал и через IN, и через JOIN. Везде показывает одинаковый план запроса Было бы удивительно, коли не так - запрос-то один и тот же, просто формы его записи разные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 15:21 |
|
||
|
Прошу помощи в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Опять же - по второй таблице можно и покрывающий индекс создать. Большой только получится, зараза... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.07.2017, 15:23 |
|
||
|
Прошу помощи в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Victor256, 1, если категории меняют id_parent очень редко или не менют вообше, то можно вынести (денормализировать) id_parent в таблицу articles. и избавится от жоинта вообше. 2. насколько надо показывать старые артикли? какая часть новостей может быть активна?. Это к тому, что если допустимо по бизнес логике , добавьте, например ...АНД ( t1.date_add > NOW() - 30 дней) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.07.2017, 00:42 |
|
||
|
Прошу помощи в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
В общем экспериментировал с разными индексами, сильно смущало наличие "using temporary" в плане, т.к. именно на этом этапе запрос долго подвисал в списке процессов. потом в какой-то момент внезапно начал использоваться индекс по полю date_add. И несмотря на цифры в плане, выполняется на 2-3 порядка быстрее: На всякий случай прописал USE INDEX. Буду наблюдать. javajdbc1, если категории меняют id_parent очень редко или не менют вообше, то можно вынести (денормализировать) id_parent в таблицу articles. и избавится от жоинта вообше. категории меняются, к сожалению постоянно. Вынести нельзя. По уму, вообще надо было сделать отдельно таблицу articles с полями, занимающими много места и отдельно всё остальное из той же таблицы. И либо джоинить таблицу с текстами последней либо отдельным запросом выбирать уже по готовым айди. javajdbc2. насколько надо показывать старые артикли? какая часть новостей может быть активна?. Это к тому, что если допустимо по бизнес логике , добавьте, например ...АНД ( t1.date_add > NOW() - 30 дней) Допустимо. Очень хорошая идея. Попробовал, получилось вместо полной таблицы теперь просматриваются порядка 5тыс. строк. Можно уменьшить кол-во дней и ещё больше сократить диапазон. Ну и запросы теперь, учитывая кеширование выполняются за 0.001-0.005 сек. Всем большое спасибо за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2017, 13:37 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39484976&tid=1830553]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 375ms |

| 0 / 0 |
