Можно ли ускорить sum () в MySQL? - PullRequest
23 голосов
/ 01 февраля 2010

Я делаю запрос «select sum (foo) from bar» в базе данных MySQL, который суммирует 7,3-миллиметровые записи и занимает около 22 секунд на цикл. Есть ли хитрость для ускорения сумм в MySQL?

Ответы [ 6 ]

35 голосов
/ 01 февраля 2010

Нет, вы не можете ускорить саму функцию. Проблема здесь в том, что вы выбираете 7,3 миллиона записей. MySQL должен сканировать всю таблицу, и 7,3 миллиона - это довольно большое число. Я впечатлен тем, что на самом деле все заканчивается так быстро.

Стратегия, которую вы могли бы использовать, состояла бы в том, чтобы разбить ваши данные на меньшие подмножества (возможно, по дате? Месяцу?) И сохранить общую сумму для старых данных, которая не изменится. Вы можете периодически обновлять сумму, и общее значение можно рассчитать путем добавления суммы и любых новых данных, которые были добавлены с тех пор, что будет значительно меньшим числом строк.

11 голосов
/ 01 февраля 2010

Включите QUERY CACHE в MySQL. По умолчанию кэширование отключено. Вам нужно установить mysql ini файл.

-- hint mysql server about caching
SELECT SQL_CACHE sum(foo) FROM bar;

Оптимизатор MySQL может вернуть кеш, если в таблицу не было внесено никаких изменений.

Подробнее здесь: http://www.mysqlperformanceblog.com/2006/07/27/mysql-query-cache/

8 голосов
/ 01 февраля 2010

Две вещи здесь:

1) Не следует регулярно вносить суммы для записей 7,3 млн. - вводить промежуточные таблицы для удовлетворения бизнес-потребностей (по дням, месяцам, годам, отделам и т. Д.) И заполнять их по расписанию, возможно, использовать эти таблицы вместо исходная «необработанная» таблица (например, выберите итоговое значение для каждого дня, когда вам нужен интервал в несколько дней и т. д.)

2) проверьте настройки транзакции

http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read

3 голосов
/ 01 февраля 2010

Нет, не совсем.Он всегда должен будет перечислять все строки в таблице.

Вы можете создать дополнительную таблицу и обновлять сумму там при каждой вставке, обновлении, удалении?

1 голос
/ 01 февраля 2010

Возможно, вы можете попробовать добавить индекс в поле bar.foo. Индекс будет содержать все значения столбца bar, но он меньше, поэтому его быстрее сканировать, чем в исходной таблице foo, особенно если в foo много других столбцов.

0 голосов
/ 01 февраля 2010

Если ваш запрос действительно так прост, нет ... но если вы используете более сложный запрос (и сокращаете его здесь), вы могли бы (вероятно) - например, использовать лучшие объединения ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...