|
|
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Запрос требующийся оптимизировать (время выполнения от 0.7-1 секунды). Можно ли его ещё ускорить?: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Ранее этот же выше представленный запрос был мной оптимизирован, вот так он первоначально выглядел (время выполнения от 2.5 -3 сек): Код: 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. Explain и SHOW INDEX : ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 13:34:03 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
1) count(game_views.id) заменить на count(*) 2) сделать индекс (`date`,game_id) на таблице game_views. После создания индекса сделать ANALYZE TABLE всем задействованным таблицам. okuznetsovРанее этот же выше представленный запрос был мной оптимизирован, вот так он первоначально выгляделЗапросы совсем не эквивалентные, так что сравнивать их бессмысленно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 14:02:59 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Перепишите подзапрос как Код: sql 1. 2. 3. 4. 5. 6. и создайте индекс по (date,game_id). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 14:09:00 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Akina, посмотрел ваш вариант, работает раза в два в среднем быстрее, но это не совсем тот запрос у вас получился что в первоначальном виде у меня в топике. Мне нужно получить помимо ID игр ещё и все данные по ним из таблицы `game`, а у вас в запросе таблица `game` не участвует. Понятно, что на этом как раз и происходит выйгрыш в производительности, при этом индекс по (date,game_id) я создал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 15:07:29 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoft, Создал составной индекс: CREATE INDEX date_game_id ON game_views(`date`, `game_id`); В принципе скорость выполнения повысилась, но не скажу, что существенно, хотелось бы ещё побыстрее. Запрос стал выполняться с 0.5 - 0.8 сек. Может бы можно ещё как-то улучшить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 15:12:59 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
[quot okuznetsov]miksoft, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 15:14:53 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsov, Первый пункт забыли сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 15:17:32 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoft, Предполагаю, что вы на 2-ом скриншоте увидили запрос, поэтому подумали, что не менял на count(*). На самом деле это старая строчка с предыдущего скриншота, я не стал её изменять на новую. Изменение на count(*) не чего существенного не дали, максимум если и улучшилось то не более чем в среднем не более 0.05 сек Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 15:33:24 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovИзменение на count(*) не чего существенного не дали, максимум если и улучшилось то не более чем в среднем не более 0.05 секТем не менее, лучше писать через звездочку, если не нужно принципиально иначе. На план это повлияло? Еще можно попробовать увеличить max_heap_table_size и tmp_table_size, чтобы временный файл не падал на диск, а оставался в оперативке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 15:50:24 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoft, со звёздочкой или без неё на план выполнения ни как не повлияло, explain выдаёт абсолютно одинаковые данные просто интересно: почему советуете через звёздочку? почему так лучше? max_heap_table_size и tmp_table_size я ранее настраивал когда оптимизировал mysql несколько месяцев назад, нашёл оптимальные настройки, uptime сервера стабилизировал и остановился на этом. И теперь побаиваюсь трогать. Сейчас они установлено 64Мб. На сколько требуется увеличить приблизительно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 16:15:32 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
забыл уточнить - может быть удалить оставшиеся два индекса: date и game_id, которые были созданы мной ранее до составного (date, game_id)? или пусть будут все три? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 16:21:53 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovпросто интересно: почему советуете через звёздочку? почему так лучше?Во-первых, так выше читаемость - сразу понятно, что нужно количество записей в группе, не надо понимать, а что это за поле такое подсунуто. Во-вторых, в вашем случае MySQL догадался что это поле NOT NULL и по факту его можно не проверять. Но я не поручусь, что он будет догадываться об этом всегда. Т.е. внезапно он может решить, что нужно прочитать это поле из таблицы, что сломает всю логику использования индекса и резко увеличит время работы запроса. okuznetsovmax_heap_table_size и tmp_table_size я ранее настраивал когда оптимизировал mysql несколько месяцев назад, нашёл оптимальные настройки, uptime сервера стабилизировал и остановился на этом. И теперь побаиваюсь трогать. Сейчас они установлено 64Мб. На сколько требуется увеличить приблизительно?Сложно сказать, по идее 64 МБ должно быть достаточно. Если общий запас оперативки позволяет, то попробуйте увеличить до 256 МБ в конкретной сессии, где выполняется этот запрос. Если поможет - подбирайте пороговое значение половинным делением и сделайте запас в 20% и на рост данных в будущем. Если не поможет - можно ничего не делать, просто закрыть текущую сессию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 16:31:31 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovзабыл уточнить - может быть удалить оставшиеся два индекса: date и game_id, которые были созданы мной ранее до составного (date, game_id)? или пусть будут все три?Если они не используются в других запросах, то имеет смысл удалить, т.к. они замедляют операции модификации данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 16:32:26 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovэто не совсем тот запрос у вас получился что в первоначальном виде у меня в топикеЯ вообще-то русским по белому пишу, что это ТОЛЬКО ПОДЗАПРОС. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 16:33:33 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Akina, Прошу прощения, невнимательность с моей стороны. Попробовал ещё раз ваш вариант, изменений не произошло. План выполнения запроса не изменился и такой же как на 2 скриншоте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 16:42:09 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovПлан выполнения запроса не изменился и такой же как на 2 скриншоте.Вы хотите сказать, что сервер не стал использовать покрывающий индекс и продолжил использовать индекс по полю date? Что-то неладно в королевстве Датском... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 17:07:17 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoftokuznetsovпросто интересно: почему советуете через звёздочку? почему так лучше?Во-первых, так выше читаемость - сразу понятно, что нужно количество записей в группе, не надо понимать, а что это за поле такое подсунуто. Во-вторых, в вашем случае MySQL догадался что это поле NOT NULL и по факту его можно не проверять. Но я не поручусь, что он будет догадываться об этом всегда. Т.е. внезапно он может решить, что нужно прочитать это поле из таблицы, что сломает всю логику использования индекса и резко увеличит время работы запроса. Спасибо за развёрнутый ответ. Сейчас всё понял. okuznetsovmax_heap_table_size и tmp_table_size я ранее настраивал когда оптимизировал mysql несколько месяцев назад, нашёл оптимальные настройки, uptime сервера стабилизировал и остановился на этом. И теперь побаиваюсь трогать. Сейчас они установлено 64Мб. На сколько требуется увеличить приблизительно?Сложно сказать, по идее 64 МБ должно быть достаточно. Если общий запас оперативки позволяет, то попробуйте увеличить до 256 МБ в конкретной сессии, где выполняется этот запрос. Если поможет - подбирайте пороговое значение половинным делением и сделайте запас в 20% и на рост данных в будущем. Если не поможет - можно ничего не делать, просто закрыть текущую сессию. Честно говоря не знаю как увеличить до 256 МБ в конкретной сессии, поэтому увеличил для всех сессий и протестировал в реальных условиях. увеличивал до 384 Мб и затем снижал, в принципе не увидел какого-то существенного результата, поэтому поставил 64Мб ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 17:08:45 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
AkinaokuznetsovПлан выполнения запроса не изменился и такой же как на 2 скриншоте.Вы хотите сказать, что сервер не стал использовать покрывающий индекс и продолжил использовать индекс по полю date? Что-то неладно в королевстве Датском...Дык стал же, насколько я вижу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 17:10:10 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovЧестно говоря не знаю как увеличить до 256 МБ в конкретной сессии Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 17:13:38 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoftДык стал же, насколько я вижуМда... совсем слепой стал... Но дальше я лично не вижу путей оптимизации именно запроса - теперь только и остаётся что настройками рулить. Что мне в данном случае представляется сомнительным - из индекса выгребается в сорт-буфер миллион записей, это метров 16-20, да 70к записей во второй таблице со сканом по первичному индексу - чего там ещё растить-то, на какие потребности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 17:20:01 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
Есть еще путь - группировку выделять в предрассчитанную таблицу. Может пострадать оперативность и точность, но насколько это важно - зависит от задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.07.2015, 17:29:55 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoftokuznetsovЧестно говоря не знаю как увеличить до 256 МБ в конкретной сессии Код: sql 1. Спасибо, буду теперь знать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2015, 11:02:30 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
miksoftЕсть еще путь - группировку выделять в предрассчитанную таблицу. Может пострадать оперативность и точность, но насколько это важно - зависит от задачи. Реализация задачи выглядит следующим образом: посетители кликают по радиобоксу, в результате отрабатывается данный запрос, после чего на странице отображается 28 самых играемых (популярных) игр за месяц. В данном случае важна оперативность, а точностью можно пренебречь. Важно чтобы посетители при клике быстро получали результат, пусть будет немного не достоверным. При этом при сегодняшней нагрузке на сайте в 1 секунду одновременно могут выполняться от 2 до 4 запросов, при этом есть ещё несколько других не оптимизированных запросов которые тоже участвуют в формировании отображаемой страницы, поэтому нужно чтобы данный запрос максимально быстро выполнялся. Не совсем понял про решение "группировку выделять в предрассчитанную таблицу"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2015, 11:21:46 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
AkinamiksoftДык стал же, насколько я вижуМда... совсем слепой стал... Но дальше я лично не вижу путей оптимизации именно запроса - теперь только и остаётся что настройками рулить. Что мне в данном случае представляется сомнительным - из индекса выгребается в сорт-буфер миллион записей, это метров 16-20, да 70к записей во второй таблице со сканом по первичному индексу - чего там ещё растить-то, на какие потребности? Честно говоря не я первоначальный разработчик данных запросов и таблиц, до меня их было даже несколько. Поэтому сейчас я тоже разбираюсь логике работы и вообще всего происходящего. После вашего ответа, начал разбираться и сегодня, обнаружил, что при добавлении новых игр - в таблицу game добавляется одна запись, а в таблицу game_views около 10 000, и так происходит вроде бы ежедневно уже более года. Зачем и для чего это сделано - для меня пока загадка, но понимаю, что так не должно быть и соответственно сейчас начал решать эту первоочередную проблему. Планирую разобраться и устранить запись такой пачки данных в таблицу game_views, а затем почистить саму таблицу. соответственно данных в таблице станет меньше как минимум в несколько сотен раз и запрос будет выполняться быстрее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2015, 11:39:03 |
|
||
|
Требуется помощь в оптимизации запроса
|
|||
|---|---|---|---|
|
#18+
AkinamiksoftДык стал же, насколько я вижуМда... совсем слепой стал... Но дальше я лично не вижу путей оптимизации именно запроса - теперь только и остаётся что настройками рулить. Что мне в данном случае представляется сомнительным - из индекса выгребается в сорт-буфер миллион записей, это метров 16-20, да 70к записей во второй таблице со сканом по первичному индексу - чего там ещё растить-то, на какие потребности? А че гадать то с max_heap_table_size и tmp_table_size, посмотри размер файлов в /tmp файлы типа #sql_****.MYD. еще, индекс вы создали и mysql его использует, но key_len то 3 байта. значить сработал только часть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2015, 12:03:57 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38997903&tid=1832962]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
39ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
72ms |
get tp. blocked users: |
1ms |
| others: | 229ms |
| total: | 374ms |

| 0 / 0 |
