Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL Uses Internal Temporary Table / 11 сообщений из 11, страница 1 из 1
08.09.2015, 12:57:19
    #39045728
ClonCD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL Uses Internal Temporary Table
Здравствуйте. Версия моего MySQL -- 5.5
Запрос
Код: sql
1.
2.
3.
4.
SELECT max(gp.x_time) as end_time
FROM   x_point       gp
WHERE  gp.x_time between STR_TO_DATE('01.09.2015 00:00:00', '%d.%m.%Y %H:%i:%s')
                         and STR_TO_DATE('04.09.2015 23:59:59', '%d.%m.%Y %H:%i:%s')


-- работает секунду. EXPLAIN говорит мне о том, что "Выражение SELECT без использования объединений или подзапросов. Извлекаются только строки данного ранга, для выбора строк используется индекс". Всего выбирается 10526572 строк.
Таблица секционирована по полю x_time, PRIMARY KEY составной, построен по полям x_time и x_control.
Немного усложним запрос, добавим строчку группировки по x_control:

Код: sql
1.
2.
3.
4.
5.
SELECT max(gp.x_time) as end_time
FROM   x_point       gp
WHERE  gp.x_time between STR_TO_DATE('01.09.2015 00:00:00', '%d.%m.%Y %H:%i:%s')
                         and STR_TO_DATE('04.09.2015 23:59:59', '%d.%m.%Y %H:%i:%s')
GROUP BY gp.x_control


В профиле появляется вот такая штука: "Copying to tmp table", 17,59 cекунд, 99,99%
EXPLAIN при этом не меняется совсем.
Как-нибудь можно избежать копирования во временную таблицу? Или это нормальное поведение агрегатных функций?
...
Рейтинг: 0 / 0
08.09.2015, 13:56:47
    #39045800
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL Uses Internal Temporary Table
а на кой тебе группировка по полю которого нет в выборке?
...
Рейтинг: 0 / 0
08.09.2015, 14:15:54
    #39045828
ClonCD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL Uses Internal Temporary Table
ScareCrow,

Какая разница, есть поле в выборке или нет? Я получаю столько строк, сколько у меня уникальных x_control в таблице.
Наличие или отсутствие этого поля никак не влияет на создание in-memory таблиц
...
Рейтинг: 0 / 0
08.09.2015, 16:57:02
    #39046076
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL Uses Internal Temporary Table
ClonCDИли это нормальное поведение агрегатных функций?Скорее, это нормальное поведение сортировки, для выполнения которой не используется индекс и которая не влезает в специальные буфера в памяти.
К сожалению, сомневаюсь, что индекс можно здесь применить. Но можно попробовать увеличить память для сортировки.
ClonCDТаблица секционирована по полю x_timeКак именно? DDL таблицы?
...
Рейтинг: 0 / 0
08.09.2015, 17:16:41
    #39046096
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL Uses Internal Temporary Table
Если не поможет индекс по комбинации полей (x_control, x_time), то для этого запроса придётся смириться с tmptable.
Возможно, чуть получше будет время (но не план) выполнения для такой версии запроса:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT sq.end_time
FROM
(
  SELECT gp.x_control, max(gp.x_time) as end_time
  FROM   x_point       gp
  WHERE  gp.x_time <= STR_TO_DATE('04.09.2015 23:59:59', '%d.%m.%Y %H:%i:%s')
  GROUP BY gp.x_control
) sq
WHERE sq.end_time >= STR_TO_DATE('01.09.2015 00:00:00', '%d.%m.%Y %H:%i:%s')
...
Рейтинг: 0 / 0
10.09.2015, 16:17:00
    #39048271
ClonCD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL Uses Internal Temporary Table
miksoft,

Спасибо, но не помогло.
Увеличил sort_buffer_size до 200Мб, значительно снизил диапазон выборки... В итоге даже для 10000 записей создаётся временная таблица (для такого числа записей очень быстро, но сам факт)
Секции через DDL нарезаны, да. В 5.5 уже можно по datetime столбцу делать range-секции.
...
Рейтинг: 0 / 0
10.09.2015, 16:33:40
    #39048301
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL Uses Internal Temporary Table
ClonCDСекции через DDL нарезаны, да. В 5.5 уже можно по datetime столбцу делать range-секции.Ну так сам DDL покажите.
Что через DDL сделано - и так понятно. Другого способа нет. :)
...
Рейтинг: 0 / 0
10.09.2015, 16:35:15
    #39048302
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL Uses Internal Temporary Table
ClonCDВ итоге даже для 10000 записей создаётся временная таблица (для такого числа записей очень быстро, но сам факт)Временная таблиц или временный файл на диске?
Первое нормально, так сортировка устроена. А избежать нужно именно файла.
...
Рейтинг: 0 / 0
10.09.2015, 17:20:55
    #39048349
ClonCD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL Uses Internal Temporary Table
Вот такой 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.
CREATE TABLE x_point (
  x_time datetime NOT NULL,
  x_control bigint(20) NOT NULL,
  filtered bit(1) NOT NULL,
  point tinyblob DEFAULT NULL,
  processed_time timestamp NULL DEFAULT NULL,
  resolved bit(1) NOT NULL,
  x_prev blob DEFAULT NULL,
  PRIMARY KEY (x_time, x_control)
)
ENGINE = INNODB
AVG_ROW_LENGTH = 126
CHARACTER SET utf8
COLLATE utf8_general_ci
PARTITION BY RANGE COLUMNS (`x_time`)
(
PARTITION p2015_01 VALUES LESS THAN ('2015-02-01') ENGINE = INNODB,
PARTITION p2015_02 VALUES LESS THAN ('2015-03-01') ENGINE = INNODB,
PARTITION p2015_03 VALUES LESS THAN ('2015-04-01') ENGINE = INNODB,
PARTITION p2015_04 VALUES LESS THAN ('2015-05-01') ENGINE = INNODB,
PARTITION p2015_05 VALUES LESS THAN ('2015-06-01') ENGINE = INNODB,
PARTITION p2015_06 VALUES LESS THAN ('2015-07-01') ENGINE = INNODB,
PARTITION p2015_07 VALUES LESS THAN ('2015-08-01') ENGINE = INNODB,
PARTITION p2015_08 VALUES LESS THAN ('2015-09-01') ENGINE = INNODB,
PARTITION p2015_09 VALUES LESS THAN ('2015-10-01') ENGINE = INNODB,
PARTITION p2015_10 VALUES LESS THAN ('2015-11-01') ENGINE = INNODB,
PARTITION p2015_11 VALUES LESS THAN ('2015-12-01') ENGINE = INNODB,
PARTITION p2015_12 VALUES LESS THAN ('2016-01-01') ENGINE = INNODB
);



Проблема у меня именно в in-memory таблице, на 10 млн записей уже критично. А на диске ничего не создаётся. Может быть стоит помельче секции нарезать, по дням, например? MySQL случайно не будет сортировки параллелить если несколько секций будет в запросе использоваться?
...
Рейтинг: 0 / 0
10.09.2015, 17:25:10
    #39048356
ClonCD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL Uses Internal Temporary Table
miksoft,
я правильно понял, первый вариант запроса без group by работает моментально, потому что даже не лезет в таблицу, а выдаёт крайнее значение ключа индекса?
...
Рейтинг: 0 / 0
10.09.2015, 18:01:43
    #39048408
ClonCD
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MySQL Uses Internal Temporary Table
Всем спасибо за помощь. Поглядел на свой DDL, почитал документацию . Действительно, дополнительный индекс (x_control, x_time) позволил избежать этой сортировки. В explain получаю запись вида Using index for group-by -- и всё значительно ускорилось.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL Uses Internal Temporary Table / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]