我有一张桌子:
CREATE TABLE `p` (
`id` bigint(20) unsigned NOT NULL,
`rtime` datetime NOT NULL,
`d` int(10) NOT NULL,
`n` int(10) NOT NULL,
PRIMARY KEY (`rtime`,`id`,`d`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
我有一个疑问:
select id, d, sum(n) from p where rtime between '2012-08-25' and date(now()) group by id, d;
我在一个小表(2 条记录)上对此查询运行解释,它告诉我它将使用我的 PK:
id | select_type | table | type | possible_keys key | key | key_len | ref | rows | Extra
1 | SIMPLE | p | range | PRIMARY | PRIMARY | 8 | NULL | 1 | Using where; Using temporary; Using filesort
但是当我在同一张表上使用相同的查询时——只是这次它很大(3.5亿条记录)——它更喜欢遍历所有记录并忽略我的键
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
1 | SIMPLE | p | ALL | PRIMARY | NULL | NULL | NULL | 355465280 | Using where; Using temporary; Using filesort
显然,这非常慢..有人可以帮忙吗?
编辑:这个简单的查询也需要大量时间:
select count(*) from propagation_delay where rtime > '2012-08-28';