2012-04-23 134 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值。