数据结构
二叉树:
只有两个分叉,同样的数据相比多路数据树会更高
B树:
Balance Tree,也就是平衡的多路搜索树。
特点:
1、关键字数与孩子数量关系:关键字数+1=指针数量(孩子数量)
B+树:
改进点:
1、孩子数量与关键字的关系:孩子数量 = 关键字数
2、非叶子节点的关键字会冗余到子节点中作为子节点的最小
3、非叶子节点不保存数据记录,只保存索引
4、叶子节点构成一个有序链表,并且包括所有关键字,叶子节点的有序链表之间会从小到大顺序链接
优点:
1、查询效率更稳定
都是去叶子节点找数据
2、关键字查询效率更高
B+ 树比 B 树更矮胖(阶数更大,深度更低),查询所需要的磁盘 I/O 也会更少
3、范围查询效率更高
叶子节点中,有序链表进行了链接
种类
按照功能划分:
1、普通索引
2、唯一索引
3、主键索引
4、全文索引。
普通索引、唯一索引和主键索引都是一类索引,只不过对数据的约束性逐渐提升。
按照物理实现划分:
1、聚集索引
也叫聚簇索引 clustered index。
聚集索引可以按照主键来排序存储数据,也可以按照指定方式排序数据。
聚集索引后面直接跟数据行,找到了聚集索引就找到了数据。
2、非聚集索引。
也称为二级索引或者辅助索引。
索引项是按照顺序存储的,但索引指向的内容是随机存储的。需要两次查找才能找到数据行。
聚集索引与非聚集索引的原理不同,在使用上也有一些区别:
1、聚集索引的叶子节点存储的了数据记录,非聚集索引的叶子节点存储的是数据位置。
非聚集索引不会影响数据表的物理存储顺序。
2、一个表只能有一个聚集索引,因为只能有一种物理排序存储的方式,但可以有多个非聚集索引,也就是多个索引目录提供数据检索。
3、使用聚集索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚集索引低
索引使用实践
1、索引虽然很快,但是要顺序读取才快。如果在多个索引之间切换,也会造成随机IO问题。
2、索引最左匹配原则
3、多个索引与会造成执行计划之间混乱
有的时候执行计划对索引的权衡就不是那么智能。我们会遇到一些坑。
案例
1、where order by limit的坑
where 后面是一个单字段索引,order by 后是另外一个单字段索引。limit的引入会导致order by优先于where,过程是order by 把所有所有数据拿出来,where再进行筛选,直到达到limit条。这样会在两个索引之间切换,导致随机IO,就会比较慢。
2、执行计划该如何看
用explain sql 得到一个表,里面的每一项都能看懂,但是综合起来就懵了,所以到底该如何综合起来看这些孤单单的每一项。
参考
mysql 证明为什么用limit时,offset很大会影响性能
MySQL的InnoDB索引原理详解
mysql索引创建规则、联合与一般索引、执行计划,索引重建与下推
MySQL where orderby 和 limit 与 索引
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。