MySQL: оптимизация GROUP BY с несколькими ключами - PullRequest
2 голосов
/ 12 октября 2010

У меня есть таблица ПЛАТЕЖЕЙ в базе данных MySql:

CREATE TABLE `PAYMENTS` (
    `ID` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `USER_ID` BIGINT(20) NOT NULL,
    `CATEGORY_ID` BIGINT(20) NOT NULL,
    `AMOUNT` DOUBLE NULL DEFAULT NULL,
    PRIMARY KEY (`ID`),
    INDEX `PAYMENT_INDEX1` (`USER_ID`),
    INDEX `PAYMENT_INDEX2` (`CATEGORY_ID`),
    INDEX `PAYMENT_INDEX3` (`CATEGORY_ID`, `USER_ID`)
) ENGINE=InnoDB;

Я хочу получить итоговую сумму для каждого пользователя в каждой категории. Вот скрипт:

select sum(AMOUNT), USER_ID, CATEGORY_ID
from PAYMENTS
group by USER_ID, CATEGORY_ID;

Команда MySql EXPLAIN показывает Extra: «Использование временного; Использование сортировки файлов»

Как избавиться от использования временных & filesort?

1 Ответ

6 голосов
/ 12 октября 2010

У вас есть индекс для (CATEGORY_ID, USER_ID), но вы группируете по USER_ID, CATEGORY_ID.

Заказ имеет значение! Создайте индекс, который охватывает GROUP BY предложение, которое вы на самом деле используете - с полями в том же порядке.

...