一本书籍可能包含书名,尺寸,作者等等字段属性,一本书类比一张数据表的一条记录。
当我们去一个图书馆,可以根据数据目录里的书籍名字,找到对应的书籍
一般书籍目录是按照书籍名字,首字母A-Z排序的
这里书籍名字就是书籍这个数据的索引字段,
按照首字母A-Z排序,就是这个书籍名字使用的数据结构。
所以索引本质是什么
是一种数据结构
在某个数据表中,选取一个特征字段,然后按照特定的数据结构描述这个字段,然后先检索这个索引字段,然后根据索引找到对应的数据记录,这是数据库检索表的记录的重要手段
索引常见的有三种数据结构:哈希表,有序数组和搜索树(二叉/多叉树)
Hash表底层由数组+链表+红黑树的结构实现,数据并不是有序的,所以只适合做等值查询,区间查询的效率很低。
有序数组在等值查询和区间查询的时候效率都很高,但是只适合于静态的数据,如果由更新数据的需求,则成本太高。
二叉树和多叉树
树可以有二叉,也可以有多叉。
二叉搜索树的特点是:
1、每个节点的左儿子小于父节点,父节点又小于右儿子。
2、多叉树就是每个节点有多个儿子,儿子之间的大小保证从左到右递增。
多叉树,节点多,可以存储更多的数据页,为了减少检索次数,很多时候用多叉树不用二叉树
既然索引是数据结构,我们都知道Mysql的InnoDB的索引是B+树的数据结构
那么为什么要用B+树的数据结构做索引,其他的数据库都用什么数据结构做索引?
InnoDB存储引擎的索引底层使用B+树来实现。表都是根据主键顺序以索引的形式存放的,每一个索引在innoDB中都对应着一颗B+树
中间节点不保存数据,只保存索引,所有数据都保存在叶子节点
所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序使用双向链表的数据结构链接(为了快速定位数据)
所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素
单一节点存储更多的元素,使得查询的IO次数更少
所有查询都要查找到叶子节点,查询性能稳定
所有叶子节点形成有序链表,便于范围查询
InnoDB的主键索引树的叶子节点存储着整行的数据,也就是索引页面指针指向数据页面,这种索引叫做聚簇索引,聚簇索引查找数据几乎总是比使用非聚簇索引快,每张表只能建一个聚簇索引。
在InnoDB中,普通索引的叶子节点存储的其对应的主键的值,所以也被称为二级索引。
普通索引树上并没有完整的数据,找到主键后,需要返回到主键索引树上获取所需得数据,这个操作被称为回表。
因为联合索引本质是 按照 建索引的顺序, 把几个字段排序,
如果不按照建立顺序检索,会导致排序失效,也就是索引失效
select 索引字段 where 索引字段,我们称为覆盖索引,效率最高
select 索引字段+其他字段 where 索引字段
MySQL 5.6 以后会先过滤掉所有不满足索引字段的记录,再从这些记录里搜索 其他字段
插入的数据打乱了索引排好的顺序,会发生页分裂和页合并,消耗资源
因此 自增主键 的优势也就在这,不需要重新排序索引