MySQL中InnoDB引擎之下的索引可以分为聚集索引和非聚集索引。
MySQL的索引都是居于b+树的。在一个B+树中所有记录节点都是按照简直的大小顺序放在同一层的叶子接待你上,由个叶子节点指针进行链接。而且,无论B+树怎么进行变换,B+树总是平衡的。B+树的索引是双向链表。
B+树索引的特征,高扇出性(这个特性是什么?还不是很清楚)。在Mysql索引的B+ 树中,树的高度一般在2~4层,限制层高的原因就是从每一层到每一层就意味着要进行磁盘的IO操作,会消耗时间(书上的说法是,页的拆分,意味着磁盘操作)。
关于聚集索引,聚集索引中键值的逻辑顺序决定了表中相应行的物理顺序,。通常聚集索引都是依照表的主键来进行构造,所以就要求,主键的行不能频繁的进行更改。(为什么不能频繁的进行更改?)
聚集索引与非聚集索引的不同点在于,叶子节点存放的是否是一整行的信息。聚集索引的叶子节点存放的即为整张表的行记录。也就是说,聚集索引能过在B+树索引的叶子节点上直接找到数据。
那么在一个表中,什么可以成为聚集索引呢?
首先,在一个表中,聚集索引只能有一个。(为什么?好像还不是很懂)
索引主键在进行范围查找和排序查找的时候速度非常快,因为其划分依据就是物理存储,而且其内部是双向链表。
还有要主义的是,上面的是InnoDBy引擎中的聚集索引,再其他的引擎,如MyISAM中是不一样的。
非聚集索引在MySQL中主要由,常规(普通)索引,全文索引,唯一索引,全文索引(这个值存在于一MyISAM引擎中)。
非聚集索引与聚集索引不同,它的逻辑顺序和磁盘上行的物理存储顺序不同,在一个表中,可以由多个非聚集索引。
对于非聚集索引来说,叶子节点并不包含行的记录的全部数据,在一个叶子节点中,通常包含键值和书签,这个书签是用来告诉InnoDB ,在哪里可以找到一索引相对应的行数据。
再MySQL中,通过非聚集索引查找数据的过程是这样的,首先遍历非聚集索引叶级别的指针,获得指向主键索引的主机那,然后再通过主键索引获得一个完整的行记录。(所以非聚聚索引B+树的节点是不同的,叶子节点上的数据是主键,而不是所在地址,因为主键可以保证一定不会改变)。
其实在一个表中,索引的具体作用就是用来查找,使查找的速度更加快,而B+树就使查询更快。
但是在一个表中索引也并不总是辣么好的,也是有缺点的。
索引就是一种索引,而主键是一种约束。
唯一索引可以为控制,但是主键不能为空值。
主键可以被其他表使用为外键,但是索引不能(这一条还 待考证!)
RBO模式下,主键的执行计划要高于一切索引。(RBO模式是什么,emmm不是很清楚)。
好了,就先总结到这里!