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如何计算聚合查询,您也可以通过反复试验创建有用的索引.
在不知道您的表架构是什么样子的情况下,很难确定,但如果您在Date和上添加多列索引可能会有所帮助CustomerID。这将使 MySQL 免去对语句进行全表扫描的麻烦GROUP BY。所以尝试一下ALTER TABLE sales ADD INDEX (Date,CustomerID)。
| 归档时间: |
|
| 查看次数: |
28302 次 |
| 最近记录: |