MySQL组 - 非常慢

时间:2012-04-23 10:32:32

标签: mysql performance group-by

我有下面的SQL查询

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

查询执行超过11400000行并且运行速度非常慢。执行需要3分钟。如果我删除分组,则运行时间低于1秒。那是为什么?

MySQL服务器版本为'5.0.21-community-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

5 个答案:

答案 0 :(得分:21)

尝试在(Date,CustomerID)上添加索引。

查看用于按查询优化分组的mysql手册: - Group by optimization

如果您使用EXPLAIN,您可以了解mysql如何生成结果: -

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

这将告诉您mysql使用哪些索引(如果有)来优化查询。当学习哪些索引适用于哪些查询时,这非常方便,因为您可以尝试创建索引并查看mysql是否使用它。因此,即使您不完全了解mysql如何计算聚合查询,您也可以通过反复试验创建有用的索引。

答案 1 :(得分:3)

在不知道您的表架构是什么样的情况下,很难确定,但如果您在DateCustomerID上添加了多列索引,则可能会有所帮助。这样可以省去MySQL为GROUP BY语句进行全表扫描的麻烦。所以试试ALTER TABLE sales ADD INDEX (Date,CustomerID)

答案 2 :(得分:2)

试试这个:

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

答案 3 :(得分:2)

我遇到了同样的问题,我将关键字段更改为相同的排序规则并修复了问题。连接表的字段具有不同的Collat​​e值。

答案 4 :(得分:0)

这个会不会更快,并实现相同的目标?

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

当然,请确保在Date上放置索引。我不完全确定,但索引CustomerID也可能有所帮助。