现在的位置: 首页 > 综合 > 正文

关于多列(复合)索引使用时的一个小问题

2018年01月21日 ⁄ 综合 ⁄ 共 1006字 ⁄ 字号 评论关闭

今天看官方文档 发现一个关于多列索引的一个问题见链接:

http://dev.mysql.com/doc/refman/5.5/en/multiple-column-indexes.html

里面有这么一段话:

Suppose that a table has the following specification:

CREATE TABLE test (
    id         INT NOT NULL,
    last_name  CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX name (last_name,first_name)
);

... .... 中间省略一部分

However, the name index
is not used
for lookups in the following queries:

SELECT * FROM test WHERE first_name='Michael';

SELECT * FROM test  WHERE last_name='Widenius' OR first_name='Michael';

很多小伙伴可能会将上面的话理所当然的理解为:复合索引的情况下如果没有使用到索引的第一列做查询条件或者使用 复合索引列做查询条件单之间使用or 的时候无法使用索引。

好,那么见如下的实验:

测试表上的索引如下:

 PRIMARY KEY (`id`),
  KEY `ind_cmrd_cid_rt2` (`report_time`,`campaign_id`),
  KEY `ind_cmrd2` (`media_url`,`report_time`,`campaign_id`,`supplier_id`),
  KEY `ind_msdrid` (`media_url`,`supplier_id`,`display_count`,`id`)
) ENGINE=InnoDB AUTO_INCREMENT=888411116 DEFAULT CHARSET=utf8 COLLATE=utf8_bin 

1,查询所有列的情况

可见,查询*的时候走的是全表扫描,这符合手册的描述。

下面是手册中没提到的,这里需要说明一下,否则小伙伴们容易理所当然的认为都是走全表扫描:

如下:

2,查询索引列的情况

从图中可以看到,查询走了索引,并且是全索引扫描。

说白了,其实也没什么大事,个人感觉有可能有些偷懒的小伙伴容易偷懒推理,而导致误解。

good night !

抱歉!评论已关闭.