为什么Primary Key比Index更快?

时间:2014-11-05 15:08:40

标签: mysql optimization

我有一个看起来像这样的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   

1 个答案:

答案 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'