我有下面的SQL查询
SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID该查询执行超过11400000行,并且运行速度非常慢。执行时间超过3分钟。如果我删除group-by部分,它的运行时间不到1秒。为什么会这样呢?
社区服务器版本为‘5.0.21- MySQL -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发布于 2012-04-23 18:37:54
尝试将索引放在(Date,CustomerID)上。
看看mysql手册中优化group by查询的内容:- Group by optimization
如果你使用EXPLAIN,你可以发现mysql是如何生成结果的,如下所示:
EXPLAIN SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID这将告诉您mysql正在使用哪些索引(如果有的话)来优化查询。在了解哪些索引适用于哪些查询时,这是非常方便的,因为您可以尝试创建索引并查看mysql是否使用它。因此,即使您不完全理解mysql是如何计算聚合查询的,您也可以通过反复试验来创建一个有用的索引。
发布于 2012-04-23 18:38:20
如果不知道您的表模式是什么样子,就很难确定,但是如果您在Date和CustomerID上添加了多列索引,可能会有所帮助。这将使MySQL省去对GROUP BY语句执行全表扫描的麻烦。所以试试ALTER TABLE sales ADD INDEX (Date,CustomerID)吧。
发布于 2012-04-23 18:38:41
试试这个:
SELECT distinct CustomerID FROM sales WHERE `Date` <= '2012-01-01'https://stackoverflow.com/questions/10278878
复制相似问题