我有下面的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
答案 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)
在不知道您的表架构是什么样的情况下,很难确定,但如果您在Date
和CustomerID
上添加了多列索引,则可能会有所帮助。这样可以省去MySQL为GROUP BY
语句进行全表扫描的麻烦。所以试试ALTER TABLE sales ADD INDEX (Date,CustomerID)
。
答案 2 :(得分:2)
试试这个:
SELECT distinct CustomerID FROM sales WHERE `Date` <= '2012-01-01'
答案 3 :(得分:2)
我遇到了同样的问题,我将关键字段更改为相同的排序规则并修复了问题。连接表的字段具有不同的Collate值。
答案 4 :(得分:0)
这个会不会更快,并实现相同的目标?
SELECT DISTINCT CustomerID FROM sales WHERE `Date` <= '2012-01-01'
当然,请确保在Date
上放置索引。我不完全确定,但索引CustomerID
也可能有所帮助。