Я делаю запрос "select sum (foo) из bar" в базе данных MySQL, который суммирует записи 7.3 мм и занимает около 22 секунд за запуск. Есть ли уловка для ускорения сумм в MySQL?
Можно ли увеличить сумму() в MySQL?
Ответ 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
Если ваш запрос действительно такой простой, нет... но если вы используете более сложный запрос (и сокращенно здесь), вы могли бы (вероятно) - как использовать лучшие соединения...