首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL group-by非常慢

MySQL group-by非常慢
EN

Stack Overflow用户
提问于 2012-04-23 18:32:32
回答 5查看 36.3K关注 0票数 19

我有下面的SQL查询

代码语言:javascript
复制
SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID

该查询执行超过11400000行,并且运行速度非常慢。执行时间超过3分钟。如果我删除group-by部分,它的运行时间不到1秒。为什么会这样呢?

社区服务器版本为‘5.0.21- MySQL -nt’

代码语言:javascript
复制
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
EN

回答 5

Stack Overflow用户

发布于 2012-04-23 18:37:54

尝试将索引放在(Date,CustomerID)上。

看看mysql手册中优化group by查询的内容:- Group by optimization

如果你使用EXPLAIN,你可以发现mysql是如何生成结果的,如下所示:

代码语言:javascript
复制
EXPLAIN SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID

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

票数 29
EN

Stack Overflow用户

发布于 2012-04-23 18:38:20

如果不知道您的表模式是什么样子,就很难确定,但是如果您在DateCustomerID上添加了多列索引,可能会有所帮助。这将使MySQL省去对GROUP BY语句执行全表扫描的麻烦。所以试试ALTER TABLE sales ADD INDEX (Date,CustomerID)吧。

票数 4
EN

Stack Overflow用户

发布于 2012-04-23 18:38:41

试试这个:

代码语言:javascript
复制
SELECT distinct CustomerID FROM sales WHERE `Date` <= '2012-01-01'
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10278878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档