|
|
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
Есть таблица users (300к записей), там данные о игроках, есть таблица games (2кк записей), это сыгранные игры игроками. Задача: вывести топ 10 игроков по убийствам за последнюю неделю. Т.е. мы берем таблицу games, в ней есть id игрока и kills сколько он убил за конкретную игру, для каждого id суммируем его убийства в каждой игре (которая прошла не позже чем неделю назад (время сыгранной игры в поле date)), делаем сортировкой по убийствам топ 10, и по полученным id этих игроков, из таблицы users достаем поля fname, lname, photo_50. Это мое представление того, как все делается, и написал такой запрос (только нет условия на то, что игра должна быть сыграна не позже чем неделю назад, не знал уже куда втулить): Код: sql 1. 2. 3. 4. 5. 6. Проблема в том, что запрос выполняется 15 секунд. Такой запрос: Код: sql 1. выполняется 3.5 сек., а такой: Код: sql 1. выполняется 0.0007 сек. Индексы: таблица users - primary индекс по полю id таблица games - индекс по полю id, и индекс по двум полям kills,date. Всем кто отзовется огромное спасибо, уже кучу времени убил на этот запрос, никак не поддается. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2015, 04:35:36 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
Насколько мне известно, сортировка по SUM на больших данных - это проблема, которую одним запросом не обойти. Рискну предложить вариант с временной таблицей. Что-то вроде: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. Условие для даты зависит от изначального формата поля. Запросы выше созданы для таких таблиц: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2015, 14:34:58 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
TurboDizel, планы смотри. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2015, 15:23:05 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
TurboDizel, вывести топ 10 игроков по убийствам за последнюю неделю. ну и где у тебя "за последнюю неделю" ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2015, 16:38:43 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
ScareCrowTurboDizel, планы смотри. какие планы, если запрос в принципе не оптимизируется? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2015, 16:41:15 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
GROUP BY games.id group by у тебя неправильный. WHERE games.id=users.id where возможно тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2015, 16:45:04 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
jucusНасколько мне известно, сортировка по SUM на больших данных - это проблема, которую одним запросом не обойти. Рискну предложить вариант с временной таблицей. А если этот запрос будет выполнятся по 10-20 раз в секунду? Игроки как бы будут заходить, смотреть на ТОП и все такое. Это не будет слишком тяжко для базы данных?). И ещё, запрос к бд идет из php, может в таком случае некоторую часть лучше переместить для обработки уже в php скрипте? Если нет, то попробую с временной таблицей сделать. MasterZivну и где у тебя "за последнюю неделю" ? Я же написал. TurboDizel(только нет условия на то, что игра должна быть сыграна не позже чем неделю назад, не знал уже куда втулить) Не хотелось бы грубить, конечно, учитывая, что я хочу получить помощь, но как Вы даете мне советы, если вопрос мой полностью не прочитали? Учитывая, что написали 3 сообщения и ни одного совета. MasterZivGROUP BY games.id group by у тебя неправильный. WHERE games.id=users.id where возможно тоже. Я понимаю, что мой запрос в общем не правильный (как минимум потому, что он выполняется 15 секунд), поэтому и обратился за помощью, в надежде услышать советы, как, например, от jucus . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2015, 18:51:05 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
Или наверное было бы плавильным делать такой запрос раз в час например, и класть данные в отдельную таблицу, и брать данные уже из этой таблицы. Т.е. обновлять ТОП раз в час. тогда запросы будут не такими объемными. Или Вы это и имели в виду?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2015, 18:57:33 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
TurboDizelИли наверное было бы плавильным делать такой запрос раз в час например, и класть данные в отдельную таблицу, и брать данные уже из этой таблицы. Т.е. обновлять ТОП раз в час. тогда запросы будут не такими объемными. Или Вы это и имели в виду?) Если есть необходимость выдавать этот результат часто, то определенно, я кешировал бы результат (да хоть в файл). Стратегия и средства кэширования это уже другая история - все зависит от условий задачи и имеющихся средств. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2015, 19:56:04 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
[quot TurboDizel][q Я понимаю, что мой запрос в общем не правильный (как минимум потому, что он выполняется 15 секунд), поэтому и обратился за помощью, в надежде услышать советы, как, например, от jucus .[/quot сначала запрос должен быть правильным, а затем уже быстрым. в неправильном запросе нет смысла, все равно быстро он выполняется или долго. как ты думаешь, что проще и быстрее, просчитать сумму по 2 мнл записей, или по 5 тысячи за последнюю неделю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2015, 13:50:34 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
TurboDizelИли наверное было бы плавильным делать такой запрос раз в час например, и класть данные в отдельную таблицу, и брать данные уже из этой таблицы. Т.е. обновлять ТОП раз в час. тогда запросы будут не такими объемными. Или Вы это и имели в виду?) ты запрос то сначала напиши, а потом уже думать будешь, когда его пускать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.02.2015, 13:52:16 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
MasterZivкак ты думаешь, что проще и быстрее, просчитать сумму по 2 мнл записей, или по 5 тысячи за последнюю неделю? А, блин, логично. Попробовал вот так. Код: sql 1. Уже 0.72 сек. Данные из таблицы users не нужны, теперь мне нужно просто получить те данные, которые я уже вот получаю этим запросом, только быстрее. Вообще, если не ограничивать на 10 человек, то в итоге получается 90к записей, и я так понимаю вся тягота запроса в том, что он сортирует по не проиндексированному полю сумм kills среди 90к записей. Как мне в этом моменте ускорить запрос можно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2015, 05:08:19 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
TurboDizelВообще, если не ограничивать на 10 человек, то в итоге получается 90к записей, и я так понимаю вся тягота запроса в том, что он сортирует по не проиндексированному полю сумм kills среди 90к записей. Как мне в этом моменте ускорить запрос можно?Никак. Только предагрегация. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2015, 07:37:38 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
TurboDizelВообще, если не ограничивать на 10 человек, то в итоге получается 90к записей, и я так понимаю вся тягота запроса в том, что он сортирует по не проиндексированному полю сумм kills среди 90к записей. Как мне в этом моменте ускорить запрос можно? хуже того, этот запрос сортирует по вычисляемому полю . больше его уже никак не ускорить, при условии что есть индекс по дате игры, он используется, и условие join game and user у тебя правильное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2015, 11:36:55 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
TurboDizel, мне кажется, что 0.7 для такого запроса вполне приемлемо. часто он вызывался не должен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2015, 11:38:38 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
вариант не расмотрели Код: sql 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2015, 11:50:08 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
Правильно ли будет делать такой запрос раз в минуту? Запишу эти данные в отдельную таблицу, а игроки пусть из неё уже тянут топ. А то по всей видимости же пока БД этот мой запрос будет 0.7 сек делать, то все остальные запросы от игроков будут ждать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2015, 14:15:16 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
TurboDizelПравильно ли будет делать такой запрос раз в минуту? Запишу эти данные в отдельную таблицу, а игроки пусть из неё уже тянут топ. Ещё раз. Если этот запрос и так редко пользователем вызывается, то нет смысла его "кэшировать". Но решать тебе -- кроме тебя твою задачу никто не знает. TurboDizelА то по всей видимости же пока БД этот мой запрос будет 0.7 сек делать, то все остальные запросы от игроков будут ждать. Не будут. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.02.2015, 19:22:29 |
|
||
|
Оптимизировать запрос в больших таблицах
|
|||
|---|---|---|---|
|
#18+
MasterZivЕщё раз. Если этот запрос и так редко пользователем вызывается, то нет смысла его "кэшировать". TurboDizelА если этот запрос будет выполнятся по 10-20 раз в секунду? Игроки как бы будут заходить, смотреть на ТОП и все такое. Ну ладно, кроном сделаю вызов раз в минуту или лучше раз в 5 минут, так как будет ещё один ТОП с похожей выборкой. Спасибо за ответы! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.02.2015, 01:24:29 |
|
||
|
|

start [/forum/topic.php?fid=47&tid=1833530]: |
0ms |
get settings: |
4ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
40ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 290ms |

| 0 / 0 |
