Оптимизация простого выбора MySQL на большой таблице (75M + строки) - PullRequest
0 голосов
/ 04 марта 2012

У меня есть статистическая таблица, которая растет с большой скоростью (около 25M строк / день), которую я хотел бы оптимизировать для выбора, таблица помещается в память, и на сервере есть много свободной памяти (32G, таблица4G).

Мой простой сводный запрос:

EXPLAIN select FROM_UNIXTIME(FLOOR(endtime/3600)*3600) as ts,sum(numevent1) as success , sum(numevent2) as failure from stats where endtime > UNIX_TIMESTAMP()-3600*96 group by ts order by ts;
+----+-------------+--------------+------+---------------+------+---------+------+----------+----------------------------------------------+
| id | select_type | table        | type | possible_keys | key  | key_len | ref  | rows     | Extra                                        |
+----+-------------+--------------+------+---------------+------+---------+------+----------+----------------------------------------------+
|  1 | SIMPLE      | stats        | ALL  | ts            | NULL | NULL    | NULL | 78238584 | Using where; Using temporary; Using filesort |
+----+-------------+--------------+------+---------------+------+---------+------+----------+----------------------------------------------+

Stats - это таблица innodb, для конечного времени есть нормальный индекс. Как мне оптимизировать это?

Примечание: я планирую добавить сводные таблицы, но в настоящее время это то, с чем я застрял, и мне интересно, можно ли это исправить без дополнительного кода приложения.

Ответы [ 2 ]

1 голос
/ 04 марта 2012

Я проводил локальные тесты.Попробуйте следующее:

alter table stats add index (endtime, numevent1, numevent2);

И удалите order by, как это должно быть неявно в group by (я думаю, парсер просто игнорирует order by в этом случае, но на всякий случай :)

0 голосов
/ 04 марта 2012

Поскольку вы используете InnoDB, вы также можете попробовать следующее:

a) Измените innodb_buffer_pool_size на 24 ГБ (требуется перезапуск сервера) - это гарантирует, что вся ваша таблица может быть загружена в память, поэтому ускорит сортировку даже по мере увеличения таблицы

b) Добавьте innodb_file_per_table, чтобы InnoDB помещал каждое новое табличное пространство в свою собственную таблицу. Необходимо удалить существующую таблицу и воссоздать ее

в) Используйте наименьший доступный размер столбца, который может соответствовать данным. Не видя фактических определений столбцов и некоторого примера, я не могу предоставить какие-либо конкретные идеи. Можете ли вы предоставить пример схемы и, возможно, 5 строк данных

...