2010-10-12 113 views
2

我在MySQL數據庫中的表付款:MySQL的:優化GROUP BY多個按鍵

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; 

我想彙總量爲ECH類別中的每個用戶。下面是腳本:

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

MySQL的EXPLAIN命令顯示了額外的:「使用臨時;使用文件排序」

如何擺脫使用臨時&文件排序的?

回答

5

你有一個索引(CATEGORY_ID, USER_ID),但你正在編組USER_ID, CATEGORY_ID

訂單很重要!創建一個涵蓋您實際使用的GROUP BY子句的索引 - 字段順序相同。

+0

謝謝!我已經改變了索引中字段的順序,它現在不需要額外的工作! – semitkin 2010-10-12 14:11:44

+0

@VoteyDisciple - 假設沒有「PAYMENT_INDEX3」,我們可以在group by子句中使用單獨的索引嗎? – Umer 2015-10-13 07:21:28