2012-04-23 71 views
8

我有folowwing SQL查詢的MySQL組由非常緩慢

SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID 

該查詢超過1140萬行執行和運行速度非常慢。它需要3分多鐘才能執行。如果我刪除組,部分會在1秒以內運行。這是爲什麼?

MySQL服務器的版本是 '5.0.21社區-NT'

Here is the table schema: 
CREATE TABLE `sales` (
    `ID` int(11) NOT NULL auto_increment, 
    `DocNo` int(11) default '0', 
    `CustomerID` int(11) default '0', 
    `OperatorID` int(11) default '0', 
    PRIMARY KEY (`ID`), 
    KEY `ID` (`ID`), 
    KEY `DocNo` (`DocNo`), 
    KEY `CustomerID` (`CustomerID`), 
    KEY `Date` (`Date`) 
) ENGINE=MyISAM AUTO_INCREMENT=14946509 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 
+1

你可以發表表架構(創建表的腳本) – 2012-04-23 10:34:31

+2

不知道你是否發佈了實際的查詢。但是在這個查詢中,如果沒有分組函數,那麼'GROUP BY'需要什麼? – 2012-04-23 10:38:54

+0

Aziz,我需要返回customerID的唯一值 – Treach 2012-04-23 10:44:43

回答

17

嘗試把一個索引(日期,客戶ID)。

看一看MySQL手冊供查詢優化組: - Group by optimization

你可以找出MySQL是如何產生的結果,如果你使用EXPLAIN如下: -

EXPLAIN SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID 

這將告訴你mysql正在使用哪些索引(如果有的話)來優化查詢。在學習哪些索引適用於哪些查詢時,這非常方便,因爲您可以嘗試創建索引並查看mysql是否使用它。所以,即使你不完全理解mysql如何計算聚合查詢,你也可以通過試驗和錯誤來創建一個有用的索引。

+1

作爲一個剛剛開始認識查詢和表格的人,這個小塊塊是非常寶貴的。謝謝。 – 2015-04-28 18:29:39

+0

@ArthurGoldsmith無後顧之憂:) – rgvcorley 2015-04-29 16:03:50

0

這難道不會快得多嗎?

SELECT DISTINCT CustomerID FROM sales WHERE `Date` <= '2012-01-01' 

確保放在Date指數,當然。我不完全確定,但索引CustomerID也可能有幫助。

3

不知道你的表模式是什麼樣的,這很難確定,但如果你在DateCustomerID上添加了多列索引,這可能會有所幫助。這樣可以節省MySQL爲GROUP BY聲明執行全表掃描的麻煩。所以請嘗試ALTER TABLE sales ADD INDEX (Date,CustomerID)

1

試試這個:

SELECT distinct CustomerID FROM sales WHERE `Date` <= '2012-01-01' 
+1

in mysql distinct只是一個特殊情況的羣組http://dev.mysql.com/doc/refman/5.1/de/distinct-optimization.html – cproinger 2013-07-20 21:15:15

1

我有同樣的問題,我改的重點領域,以相同的排序規則和解決問題。加入表的字段具有不同的Collat​​e值。