sql索引的一些比较
概念:加速对表中数据行的检索而创建的一种分散存储的数据结构,一般都是硬盘级索引。
首先:认识节点
其次:树是一只数据结构,基于递归式二分查找思想,同时能自修复;
修复的操作:左旋、右旋;分裂、合并等
B树与B+树的比较:
1、B+树的层级更少:相较于B树B+每个非叶子节点存储的关键字数更多,树的层级更少所以查询数据更快;
2、B+树查询速度更稳定:B+所有关键字数据地址都存在叶子节点上,所以每次查找的次数都相同所以查询速度要比B树更稳定;
3、B+树天然具备排序功能:B+树所有的叶子节点数据构成了一个有序链表,在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。
4、B+树全节点遍历更快:B+树遍历整棵树只需要遍历所有的叶子节点即可,,而不需要像B树一样需要对每一层进行遍历,这有利于数据库做全表扫描。
innorDB引擎中B+树索引 n 的搜索过程比较:
1.将根节点 IO 到内存中,与 根节点中关键字(索引字段)比较
2.找到n后,如果你是非主键索引,则将数据区引用(主键索引)返回,然后再次回表查询如果是主键索引则直接返回数据
myisam引擎中B+树索引 n 的搜索过程:
1.将根节点 IO 到内存中,与 根节点中关键字(索引字段)比较
2.找到n后,将数据区引用(真实)返回
索引分类:
普通索引:仅加速查询
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
全文索引:对文本的内容进行分词,进行搜索
覆盖索引不是一种索引,而是指查询过程中:查询字段直接在索引字段中可以查到,不用回表扫描;
索引的失效:
1.有or必全有索引;
2.复合索引未用左列字段,匹配原则:从左往右一个字符进行匹配
3.like以%开头、以%开头离散型较差;
4.需要类型转换;
5.where中索引列有运算或函数;
explain执行计划重要参数解析:
type:访问类型,查看SQL到底是以何种类型访问数据的。
key:使用的索引,MySQL用了哪个索引,有时候MySQL用的索引不是最好的,需要force index()。
rows:最大扫描的列数。
extra:重要的额外信息,特别注意损耗性能的两个情况,using filesort和using temporary。