前面有的文章简要说明的mysql的索引,其中也涉及到了innodb的索引。再总结深入一下:


1,innodb的聚集索引是按照主键的顺序进行排序,而聚集索引的存储是按照指针的逻辑位置进行排序,也就是说指针的逻辑指针也是按照顺序进行递增的。

这说明:

    1.1 如果在sql查询中按照主键进行排序操作那么是非常快的,无论是升序排列还是降序排序(B+树的叶子节点是用一个双向链表联系在一起的)

select * from table order by id limit 50;  //id为主键,通过分析sql执行计划是没有进行filesort操作的;同理对主键的范围查询也是如此

select *  from table where id > 2 and id < 90;

2,辅助索引,关于辅助索引的一个关键点为,辅助索引的叶子节点中包含了一个主键值。如果通过辅助索引进行数据检索的过程如下;

步骤一:在辅助索引上查找数据;

步骤二:在辅助索引上完成数据索引后,得到主键值,再通过主键值进行在聚集索引上进行第二遍的索引查找过程。


3,上述可知,两次索引查找也有些繁琐和浪费的。为了在有些情况下避免这种浪费,innodb引入了覆盖所用的的技术。

前面的文章简单说了一下覆盖索引的概念和例子,不过当时没有完全理解。下面用简单的话再次理解一遍。

几个关键点:

3.1 覆盖索引是建立在联合索引的基础之上的。也就是说如果用到覆盖索引那么必须要有联合索引。如:

一张表的结构为:

create table table1 {
a int;
b int;
c varchar;
d int;
primary key (d);
key  uninkey(a,b)
}

如表中存在7条数据:

d列

a列

b列

c列

1

4

2

Qw

2

4

3

Ewe

3

4

5

Wer

4

8

4

阿萨德、

5

8

1

Dfas

6

8

6

7

5

1

D

索引结构为(辅助索引,a b列上建立的联合索引结构)

索引排序等级 索引降序排列_辅助索引



观察索引结构可知:

按联合索引的最左进行排序,每个节点内左边的第一个索引也进行了排序;这其实就是最左前缀原则。如扩展到三个字段建立的联合索引,依此类推。

 

覆盖索引,即省去了用覆盖索引查询到结果后再进行的一次聚集索引的检索。

Select b from table1 where a = 4;//select后面加上b很重要。

违反最左前缀的一种情况

Select count(*) from table1 where b >2 and b < 6;

在这种情况下其实是使用到覆盖索引的,不过通过联合索引的结构进行分析,其实也只是部分用到了索引(覆盖索引)。不过不太理解。