|
|
|
MySQL Uses Internal Temporary Table
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Версия моего MySQL -- 5.5 Запрос Код: sql 1. 2. 3. 4. -- работает секунду. EXPLAIN говорит мне о том, что "Выражение SELECT без использования объединений или подзапросов. Извлекаются только строки данного ранга, для выбора строк используется индекс". Всего выбирается 10526572 строк. Таблица секционирована по полю x_time, PRIMARY KEY составной, построен по полям x_time и x_control. Немного усложним запрос, добавим строчку группировки по x_control: Код: sql 1. 2. 3. 4. 5. В профиле появляется вот такая штука: "Copying to tmp table", 17,59 cекунд, 99,99% EXPLAIN при этом не меняется совсем. Как-нибудь можно избежать копирования во временную таблицу? Или это нормальное поведение агрегатных функций? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 12:57:19 |
|
||
|
MySQL Uses Internal Temporary Table
|
|||
|---|---|---|---|
|
#18+
а на кой тебе группировка по полю которого нет в выборке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 13:56:47 |
|
||
|
MySQL Uses Internal Temporary Table
|
|||
|---|---|---|---|
|
#18+
ScareCrow, Какая разница, есть поле в выборке или нет? Я получаю столько строк, сколько у меня уникальных x_control в таблице. Наличие или отсутствие этого поля никак не влияет на создание in-memory таблиц ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 14:15:54 |
|
||
|
MySQL Uses Internal Temporary Table
|
|||
|---|---|---|---|
|
#18+
ClonCDИли это нормальное поведение агрегатных функций?Скорее, это нормальное поведение сортировки, для выполнения которой не используется индекс и которая не влезает в специальные буфера в памяти. К сожалению, сомневаюсь, что индекс можно здесь применить. Но можно попробовать увеличить память для сортировки. ClonCDТаблица секционирована по полю x_timeКак именно? DDL таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 16:57:02 |
|
||
|
MySQL Uses Internal Temporary Table
|
|||
|---|---|---|---|
|
#18+
Если не поможет индекс по комбинации полей (x_control, x_time), то для этого запроса придётся смириться с tmptable. Возможно, чуть получше будет время (но не план) выполнения для такой версии запроса: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.09.2015, 17:16:41 |
|
||
|
MySQL Uses Internal Temporary Table
|
|||
|---|---|---|---|
|
#18+
miksoft, Спасибо, но не помогло. Увеличил sort_buffer_size до 200Мб, значительно снизил диапазон выборки... В итоге даже для 10000 записей создаётся временная таблица (для такого числа записей очень быстро, но сам факт) Секции через DDL нарезаны, да. В 5.5 уже можно по datetime столбцу делать range-секции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2015, 16:17:00 |
|
||
|
MySQL Uses Internal Temporary Table
|
|||
|---|---|---|---|
|
#18+
ClonCDСекции через DDL нарезаны, да. В 5.5 уже можно по datetime столбцу делать range-секции.Ну так сам DDL покажите. Что через DDL сделано - и так понятно. Другого способа нет. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2015, 16:33:40 |
|
||
|
MySQL Uses Internal Temporary Table
|
|||
|---|---|---|---|
|
#18+
ClonCDВ итоге даже для 10000 записей создаётся временная таблица (для такого числа записей очень быстро, но сам факт)Временная таблиц или временный файл на диске? Первое нормально, так сортировка устроена. А избежать нужно именно файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2015, 16:35:15 |
|
||
|
MySQL Uses Internal Temporary Table
|
|||
|---|---|---|---|
|
#18+
Вот такой DDL Код: 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. Проблема у меня именно в in-memory таблице, на 10 млн записей уже критично. А на диске ничего не создаётся. Может быть стоит помельче секции нарезать, по дням, например? MySQL случайно не будет сортировки параллелить если несколько секций будет в запросе использоваться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2015, 17:20:55 |
|
||
|
MySQL Uses Internal Temporary Table
|
|||
|---|---|---|---|
|
#18+
miksoft, я правильно понял, первый вариант запроса без group by работает моментально, потому что даже не лезет в таблицу, а выдаёт крайнее значение ключа индекса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2015, 17:25:10 |
|
||
|
MySQL Uses Internal Temporary Table
|
|||
|---|---|---|---|
|
#18+
Всем спасибо за помощь. Поглядел на свой DDL, почитал документацию . Действительно, дополнительный индекс (x_control, x_time) позволил избежать этой сортировки. В explain получаю запись вида Using index for group-by -- и всё значительно ускорилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.09.2015, 18:01:43 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39045828&tid=1832731]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
77ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
| others: | 237ms |
| total: | 409ms |

| 0 / 0 |
