MySQL组 - 非常慢

Tre*_*ach 15 mysql performance group-by

我有下面的SQL查询

SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID
Run Code Online (Sandbox Code Playgroud)

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

MySQL Server版本是'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
Run Code Online (Sandbox Code Playgroud)

rgv*_*ley 23

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

看一下mysql手册,通过查询优化组: - 按优化分组

您可以通过以下方式了解mysql如何生成结果EXPLAIN: -

EXPLAIN SELECT CustomerID FROM sales WHERE `Date` <= '2012-01-01' GROUP BY CustomerID
Run Code Online (Sandbox Code Playgroud)

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

  • 作为刚开始接受优化查询和表的人,这个小块是无价的。谢谢。 (3认同)

Daa*_*aan 5

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