【发布时间】:2012-11-14 21:47:52
【问题描述】:
一个我应该可以自己回答的问题,但我没有,而且我也没有在 google 中找到任何答案:
我有一个包含 500 万行的表,结构如下:
CREATE TABLE IF NOT EXISTS `files_history2` (
`FILES_ID` int(10) unsigned DEFAULT NULL,
`DATE_FROM` date DEFAULT NULL,
`DATE_TO` date DEFAULT NULL,
`CAMPAIGN_ID` int(10) unsigned DEFAULT NULL,
`CAMPAIGN_STATUS_ID` int(10) unsigned DEFAULT NULL,
`ON_HOLD` decimal(1,0) DEFAULT NULL,
`DIVISION_ID` int(11) DEFAULT NULL,
KEY `DATE_FROM` (`DATE_FROM`),
KEY `FILES_ID` (`FILES_ID`),
KEY `CAMPAIGN_ID` (`CAMPAIGN_ID`),
KEY `CAMP_DATE` (`CAMPAIGN_ID`,`DATE_FROM`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
当我执行时
SELECT files_id, min( date_from )
FROM files_history2
WHERE campaign_id IS NOT NULL
GROUP BY files_id
查询停留在“发送数据”状态超过八小时(然后我终止了该进程)。
这里解释一下:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE files_history2 ALL CAMPAIGN_ID,CAMP_DATE NULL NULL NULL 5073254 Using where; Using temporary; Using filesort
我假设我生成了必要的键,但是查询应该花费那么长时间,是吗?
【问题讨论】:
-
这是说
5073254行吗?尝试在那里设置限制。 -
应该不会那么糟糕。索引旨在帮助加快查询速度。一定是别的什么在起作用。可能是配置错误,导致 mysql 内存不足。
-
它将转到
filesort,而不是使用任何索引。这是有原因的,但不幸的是我还不够聪明。