Подтвердить что ты не робот

Можно ли увеличить сумму() в MySQL?

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

4b9b3361

Ответ 1

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

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

Ответ 2

Включите 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/

Ответ 3

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

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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