2012-04-23 6 views
8

私はfolowwingのSQLクエリMySQLのグループによって非常に遅い

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

にクエリを持っているが1140万行上で実行され、非常に遅い実行されます。実行には3分以上かかります。グループ別を削除すると、1秒未満で実行されます。何故ですか?

のMySQL Serverバージョン '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

テーブルスキーマ(テーブルのスクリプトを作成)を転記することができます –

+2

実際のクエリを投稿したかどうかわかりません。しかし、このクエリでは、グループ化関数がない場合、 'GROUP BY'の必要性は何ですか? –

+0

Aziz、customerID – Treach

答えて

17

は(日付、得意先)にインデックスを入れてみてください。

は、クエリでグループを最適化するためのMySQLのマニュアルを見てください: - Group by optimization

あなたは次のようにEXPLAINを使用する場合、MySQLは結果を生成する方法を見つけることができます: -

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

この意志をmysqlがクエリを最適化するために使用しているインデックス(もしあれば)を教えてください。これは、インデックスを作成し、mysqlがインデックスを使用するかどうかを調べることができるように、どのインデックスに対してどのインデックスが動作するかを学習するときに非常に便利です。したがって、mysqlが集計クエリをどのように計算するかを完全に理解していなくても、試行錯誤によって有用なインデックスを作成できます。

+1

クエリとテーブルのオプトマイズを始めたばかりの人は、この小さなナゲットは非常に貴重でした。ありがとうございました。 –

+0

@ArthurGoldsmith心配する必要はありません:) mysql distinctの – rgvcorley

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

は、グループの特別なケースです。http://dev.mysql.com/doc/refman/5.1/de/distinct-optimization.html – cproinger

1

私は同じ問題を抱えていた、私は同じ照合にキーフィールドを変更し、それが問題を修正。テーブルを結合するフィールドには、異なるCollat​​e値があります。