我有一个看起来像这样的MySQL 5.5表;
CREATE TABLE `date_test` (
`id` int(11) NOT NULL DEFAULT '0',
`report_date` datetime NOT NULL,
`module_id` int(11) NOT NULL,
`country_id` int(11) NOT NULL,
`clicks` int(11) DEFAULT '0'
PRIMARY KEY (`id`,`report_date`,`module_id`,`country_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
它只有一个PK,没有索引。运行简单的SELECT查询;
select count(*) from date_test
where report_date between'2014-09-01' and '2014-09-15'
这需要 1.1秒,返回809,349条记录。
现在,我在report_date上添加一个索引,试图加快速度;
ALTER TABLE `date_test`
ADD INDEX `report_date` (`report_date` ASC);
我的选择计数(*)查询现在需要 2.6秒才能运行。我的问题;如何将此字段添加为索引会影响查询性能?
添加EXPLAIN;
With Index and PK (2.6 seconds)
id 1
select_type SIMPLE
table date_test
type range
possible_keys report_date
key report_date
key_len 8
ref
rows 792170
Extra Using where; Using index
With PK only, no Index (1.1 seconds)
id 1
select_type SIMPLE
table date_test
type index
possible_keys
key PRIMARY
key_len 1048
ref
rows 1584341
Extra Using where; Using index
With no Index or PK (1.4 seconds)
id 1
select_type SIMPLE
table date_test
type ALL
possible_keys
key
key_len
ref
rows 1652883
Extra Using where
答案 0 :(得分:1)
查看EXPLAIN <YOUR_QUERY>
的结果。我的猜测是(没有足够的信息可以确定)MySQL现在正在使用索引并错误地猜测使用索引会更快。
如果索引覆盖的行数多于它,则可以更快地简单地进行表扫描。索引在查询时会增加一些开销,所以如果between
覆盖了表中行的80%以上(完全随意,但你明白了),表扫描可以更快。
查看此查询的输出以获得一个想法:
SELECT report_date between '2014-09-01' and '2014-09-15', COUNT(*) FROM date_Test
GROUP BY report_date between '2014-09-01' and '2014-09-15'