MySql Innodb索引:
- B+树
- 全文索引
- 哈希索引
B+树
- 有n个子树的中间节点包含n个元素,每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
- 所有叶子节点包含元素的信息以及指向记录的指针,且叶子节点按关键字自小到大顺序链接。
- 所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。
所有的数据都在叶子节点,且每一个叶子节点都带有指向下一个节点的指针,形成了一个有序的链表。
一般性情况,数据库的B+树的高度一般在2~4层,这就是说找到某一键值的行记录最多需要2到4次逻辑IO,相当于0.02到0.04s。
B树和B+树的区别:
- B+树所有的数据都在叶子节点上,非叶子节点只保存索引;B树叶子节点和非叶子节点都保存索引和数据;同样的空间,B+树能存储更多的索引,它比B树更胖更矮,查询时减少IO次数
- 查询的时候,B树的数据分布在各个节点及子节点,每次查询的深度不一样,也就是说不稳定;B+数据所有的数据都在叶子节点,每次查询时最终必须到叶子节点,深度是一样的,比较稳定
- 范围查询,B+树的数据都是在叶子节点的链表结构,查询更方便
问:一张表有多个普通索引,它的存储结构是什么,如何查找数据
一张表有多个索引就有多个B+树;
二级索引的叶子节点包含的用户记录由索引列 + 主键组成,所以如果想通过二级索引来查找完整的用户记录的话,需要通过回表操作,也就是在通过二级索引找到主键值之后再到聚簇索引中查找完整的用户记录
InnoDB存储引擎会自动为主键(如果没有它会自动帮我们添加)建立聚簇索引,聚簇索引的叶子节点包含完整的用户记录
B+树中每层节点都是按照索引列值从小到大的顺序排序而组成了双向链表,而且每个页内的记录(不论是用户记录还是目录项记录)都是按照索引列的值从小到大的顺序而形成了一个单链表。如果是联合索引的话,则页面和记录先按照联合索引前边的列排序,如果该列值相同,再按照联合索引后边的列排序
通过索引查找记录是从B+树的根节点开始,一层一层向下搜索。由于每个页面都按照索引列的值建立了Page Directory(页目录),所以在这些页面中的查找非常快
说人话就是在二级索引里找到主键值,去主键的聚簇索引中根据主键值找到真正的记录
二级索引搜索: 二级索引树---->叶子节点值(主键值)----->主键索引树----->叶子节点值(最终数据值)
聚簇索引
以innodb为例,在一个数据table中,它的数据文件和索引文件是同一个文件。即在查询过程中,找到了索引,便找到了数据文件。在innodb中,即存储主键索引值,又存储行数据,称之为聚簇索引。
innodb索引,指向主键对数据的引用。非主键索引则指向对主键的引用。innodb中,没有主见索引,则会使用unique索引,没有unique索引,则会使用数据库内部的一个行的id来当作主键索引。