19

我有以下 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
4

5 回答 5

29

尝试在 (Date,CustomerID) 上放置一个索引。

查看 mysql 手册以优化按查询分组:-按优化分组

EXPLAIN如果您使用如下方式,您可以了解 mysql 是如何生成结果的:-

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

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

于 2012-04-23T10:37:54.270 回答
4

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

于 2012-04-23T10:38:19.670 回答
2

试试这个:

SELECT distinct CustomerID FROM sales WHERE `Date` <= '2012-01-01'
于 2012-04-23T10:38:41.447 回答
2

我遇到了同样的问题,我将关键字段更改为相同的排序规则并解决了问题。加入表格的字段具有不同的 Collat​​e 值。

于 2017-01-14T02:04:31.130 回答
0

这不是更快并且达到同样的效果吗?

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

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

于 2012-04-23T10:38:07.750 回答