Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Диапазон, group by, Using temporary / 8 сообщений из 8, страница 1 из 1
27.05.2017, 17:54
    #39460885
Vao
Vao
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон, group by, Using temporary
Есть с виду простейшая задача, которую не могу решить.

Есть таблица, 3 колонки. Нужно выбрать срез по времени и сгруппировать по колонке hash. Проблема в том, что если используется ключ hash, то перебираются все записи, вне зависимости от среза по времени. Если использовать составной индекс (ctime, hash), то используется только часть индекса + создается временная таблица.

В итоге нужно сделать группировку по срезу времени без использования временной таблицы (Using temporary). Увы, у меня не получается

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE `_table` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `hash` VARCHAR(32) NOT NULL,
    `ctime` INT(10) UNSIGNED NOT NULL DEFAULT '0',
    PRIMARY KEY (`id`),
    INDEX `ctime` (`ctime`),
    INDEX `hash` (`hash`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;


Код: sql
1.
SELECT `hash` FROM `_table` WHERE `ctime` > 1490979600 and `ctime` < 1495904399 GROUP BY `hash` ORDER BY null;
...
Рейтинг: 0 / 0
27.05.2017, 21:52
    #39460941
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон, group by, Using temporary
VaoЕсли использовать составной индекс (ctime, hash), то используется только часть индекса + создается временная таблица.Речь про Using filesort или про Using temporary ?
Сколько записей получается в результате?
Зачем в запросе ORDER BY null ? Я бы предложил убрать.
...
Рейтинг: 0 / 0
27.05.2017, 22:11
    #39460944
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон, group by, Using temporary
Код: sql
1.
SELECT `hash` ... GROUP BY `hash` ...


Долго думал? Или ни разу не читал про DISTINCT?
...
Рейтинг: 0 / 0
28.05.2017, 00:40
    #39460975
Vao
Vao
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон, group by, Using temporary
miksoftРечь про Using filesort или про Using temporary ?Vaoбез использования временной таблицы (Using temporary)
miksoftСколько записей получается в результате?
Много. Все зависит от интервала, в таблице 20 млн записей.

miksoftЗачем в запросе ORDER BY null ? Я бы предложил убрать.
Убираем и получаем filesort. А сортировка здесь вовсе не нужна.

Akina
Код: sql
1.
SELECT `hash` ... GROUP BY `hash` ...


Долго думал? Или ни разу не читал про DISTINCT?
Ну давай похоливарим. Чего можешь о DISTINCT сказать, кроме того, происходит не явный вызов GROUP BY?
...
Рейтинг: 0 / 0
28.05.2017, 01:58
    #39460988
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон, group by, Using temporary
VaomiksoftЗачем в запросе ORDER BY null ? Я бы предложил убрать.
Убираем и получаем filesort.А что со временем выполнения?

VaoА сортировка здесь вовсе не нужна.Ну так и не факт, что она вредит.
filesort - это не всегда физическая запись на диск.

VaomiksoftСколько записей получается в результате?
Много. Все зависит от интервала, в таблице 20 млн записей.Из того, что много записей в таблице, нельзя сделать вывод о количестве записей в результате группировки.
...
Рейтинг: 0 / 0
28.05.2017, 20:15
    #39461108
Vao
Vao
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон, group by, Using temporary
miksoftА что со временем выполнения?
Запрос работает менее минуты. Тут дело не во времени, я согласен и на большее время, но есть одно но. Данные льются в таблицу, при этом запрос создает блокировку и все остальные пользователи ждут. Я понимаю, что после этих слов мне предложат много других идей (делать запрос не в режиме реального времени, таблицы двойники и т.д.), но задача пока как есть.
miksoftИз того, что много записей в таблице, нельзя сделать вывод о количестве записей в результате группировки.
За день в результат попадет ~60к записей. Если отчет формируют за пару месяцев, то результатов для группировки более 3 млн.
miksoftНу так и не факт, что она вредит.
filesort - это не всегда физическая запись на диск.
Любая сортировка = увеличение времени выполнения запроса. Особенно когда сортируются миллионы.
...
Рейтинг: 0 / 0
28.05.2017, 22:46
    #39461146
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон, group by, Using temporary
VaoДанные льются в таблицу, при этом запрос создает блокировку и все остальные пользователи ждут.Вроде бы не должно быть у InnoDB таких эффектов.
Vaoтаблицы двойникиДа, создать предагрегированные таблицы, например, по дням, имело бы смысл попробовать.
VaoЛюбая сортировка = увеличение времени выполнения запроса.Не любая.
Для выполнения группировки существует не так уж много методов, и сортировка - один из них. И тогда ORDER BY, совпадающий с GROUP BY, достается фактически бесплатно.

https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sort_buffer_size If you see many Sort_merge_passes per second in SHOW GLOBAL STATUS output, you can consider increasing the sort_buffer_size value to speed up ORDER BY or GROUP BY operations that cannot be improved with query optimization or improved indexing.Думаю, имеет смысл попробовать увеличить sort_buffer_size и посмотреть эффект. Причем как с исходным ORDER BY null, так и без него.




Случайно подвернулось в доке вот такое (это новое для меня):
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_sql_buffer_result sql_buffer_result

If set to 1, sql_buffer_result forces results from SELECT statements to be put into temporary tables. This helps MySQL free the table locks early and can be beneficial in cases where it takes a long time to send results to the client. The default value is 0.Возможно, имеет смысл попробовать в вашем случае, если уж переживаете за время блокировки исходной таблицы.
...
Рейтинг: 0 / 0
29.05.2017, 07:56
    #39461205
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Диапазон, group by, Using temporary
VaoЧего можешь о DISTINCT сказать, кроме того, происходит не явный вызов GROUP BY?
Могу сказать, что чем ниже селективность, тем больше разница в скорости выполнения. В пользу DISTINCT, конечно. Остальное неинтересно.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Диапазон, group by, Using temporary / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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