1. 什么是索引
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足
特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构
上实现高级查找算法,这种数据结构就是索引。
2. 特点
3. 索引的结构
4 选用B+tree树的原因
二叉树 是经典的快速查找算法 ,但是有两个缺点
- 如果是顺序插入,如插入10 后,再依次插入9,8,7,6,5,4,3,2,1就会变成一个链表
- 如果数据量比较多,就会出现层级很深的二叉树,检索效率下降
为了解决这个问题
我们引入了红黑树 ,它会自动平衡叶子节点数,最后得到一平衡二叉树,
这解决了顺序插入成为链表的情况 但是,层级问题依旧没有解决,
于是,出现了B-tree
4.1 B-tree
B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。
以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key,5个指针:
这里每个节点上面可以存放四个key,对应下面区间为5个,所以也叫做5阶, 并且 每个key下面存放对应的数据值
特点:
- 5阶的B树,每一个节点最多存储4个key,对应5个指针。
- 一旦节点存储的key数量到达5,就会裂变,中间元素向上分裂。
- 在B树中,非叶子节点和叶子节点都会存放数据。
思考
为什么mysql选用B+tree?
- 相对于二叉树,层级更少,搜索效率高;
- 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,这样导致一页中存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加树的高度,导致性能降低;
- 相对Hash索引,B+tree支持范围匹配及排序操作;
5.常见的索引
- 主键索引
- 唯一索引
- 常规索引
- 全文索引
其中全文索引与es中使用的都是倒序索引的方式来快速对文本进行查询
5.1 聚集索引和二级索引
聚集索引: 本质上来看就是B+tree的的标准形式,节点上存放key,最下层存放的真实的数据(全局唯一)
二级索引: 本质是节点上存放key,但是最下层节点存放的是数据对应的主键(可以有多个)
聚集索引选取规则:
- 如果有主键,主键索引就是聚集索引
- 不存在主键的话,存在unique索引,那该唯一索引就是聚集索引
- 如果没有主键索引也没有unique索引,那么 mysql就会自动生成一个rowid作为隐藏的聚集索引
上图就是标准的聚集索引和二级索引 这里 当使用二级索引的时候就会先查询到主键 id , 然后去回表查询 回到聚集索引上通过查询到的id去查询真正的数据
拓展一下
一般来说当输的层级到三,大概能存放2200W数据,
再多的话就建议分库分表了
5.2 索引的语法
- 创建索引
CREATE [ UNIQUE | FULLTEXT ] INDEX index_name ON table_name (
index_col_name,... ) ;
- 查看索引
show index from table_name;
- 删除索引
drop index index_name on table_name