2010-10-12 4 views
2

J'ai une table PAIEMENTS dans la base de données MySql:MySQL: Optimisation GROUP BY plusieurs clés

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; 

Je veux obtenir quantité de synthèse pour chaque utilisateur dans la catégorie ech. Voici le script:

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

commande EXPLIQUEZ de MySql montre supplémentaire: "L'utilisation temporaire L'utilisation filesort"

Comment débarrasser de l'utilisation & temporaire filesort?

Répondre

5

Vous avez un index sur (CATEGORY_ID, USER_ID) mais vous le regroupez par USER_ID, CATEGORY_ID.

L'ordre est important! Créez un index qui couvre la clause GROUP BY que vous utilisez actuellement, avec les champs dans le même ordre.

+0

Merci! J'ai changé l'ordre des champs dans l'index et cela fonctionne sans Extras maintenant! – semitkin

+0

@VoteyDisciple - En supposant qu'il n'y ait pas de "PAYMENT_INDEX3", pouvons-nous utiliser des index individuels dans la clause group by? – Umer