|
|
|
Анализ запроса DISTINCT, GROUP BY
|
|||
|---|---|---|---|
|
#18+
Версия MySQL: 5.6.27 Задача: вывести список уникальных пар id с одинаковыми title. Есть таблица(упрощенная версия): Код: sql 1. 2. 3. 4. 5. Реализовал два решения и пытаюсь разобраться почему одно работает быстрее другого. Если есть другие решения так же бы на них посмотрел. Дополнительные индексы добавлять не надо. 1ый запрос: Код: sql 1. 2. 3. 4. 5. EXPLAIN: +----+-------------+-------+------+---------------+------+---------+------+------+----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+----------------------------------------------------+ | 1 | SIMPLE | i | ALL | NULL | NULL | NULL | NULL | 106 | Using temporary | | 1 | SIMPLE | im | ALL | NULL | NULL | NULL | NULL | 106 | Using where; Using join buffer (Block Nested Loop) | +----+-------------+-------+------+---------------+------+---------+------+------+----------------------------------------------------+ EXPLAIN FORMAT=JSON: Код: javascript 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. 2ой запрос: Код: sql 1. 2. 3. 4. EXPLAIN: +----+-------------+-------+------+---------------+------+---------+------+------+----------------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+----------------------------------------------------+ | 1 | SIMPLE | i | ALL | NULL | NULL | NULL | NULL | 106 | Using temporary | | 1 | SIMPLE | im | ALL | NULL | NULL | NULL | NULL | 106 | Using where; Using join buffer (Block Nested Loop) | +----+-------------+-------+------+---------------+------+---------+------+------+----------------------------------------------------+ EXPLAIN FORMAT=JSON: Код: javascript 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. Теперь непосредственно к вопросу: Как можно обьяснить, что 2ой запрос работает быстрее? Где можно почитать про расшифровку explain'a в формате json? Возможно есть более оптимальный путь решения этой задачи? Если посмотреть на простой explain, то они одинаковые и сделать вывод почему один быстрее другого сделать сложно(во всяком случае мне). А как этот вывод сделать из формата json я пока не совсем понимаю. Интересно было бы понять, что происходит под капотом. Возможно ответ находится в описание distinct, group by, temporary table, количестве данных в этой таблице? Не понятно для меня так же почему в 2ом запросе с DISTINCT используется временная таблица( https://docs.oracle.com/cd/E17952_01/refman-5.6-en/internal-temporary-tables.html ). Буду рад любым ответам, спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2015, 14:06:00 |
|
||
|
Анализ запроса DISTINCT, GROUP BY
|
|||
|---|---|---|---|
|
#18+
devKP Код: sql 1. Можно использовать строгое "меньше" (или "больше"). Заодно избавишься и от LEAST/GREATEST, и от DISTINCT... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.12.2015, 17:38:48 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=47&tid=1832409]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
28ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 301ms |

| 0 / 0 |
