MySQL的索引原理
查询的历程
线性查找
HASH:冗余的数组实现的,查询快,但占用空间
B+树和二叉树有什么区别
二叉树:插入和查询很快(logn),无法存大规模数据,复杂度退化(二叉树是n个节点的有限集)
平衡树:解决bst退化的问题,树是平衡的;节点非常多的时候,依然树高很高
多路查找树:一个父亲多个孩子节点(度);节点过多树高不会特别深
多路平衡查找树:B-Tree(构建索引的底层结构)
阶数
二叉树中阶数的概念:
二叉树的阶数是一个节点的子节点数目的最大值
Tips:度和阶数在定义层面上不同,但实际的数值有可能相同(一般都相同),度是从某一节点去做的定义。阶是从B树做的整体定义。
为什么使用B+树作为索引的底层结构
B+树是B-Tree的变形(B+树叶子节点存储数据,更加矮胖)
只在叶子节点带有指向记录,叶子节点存储数据,非叶子节点可以有更多的孩子节点,更加矮胖(阶数更多或者度更多)
阶数不能越多越好
阶不能越多越好,内存管理单位是以页,阶是以磁盘块的大小来决定的。
为了操作系统更好的缓存和读取数据,所以阶数不可以越多越好。
什么时候用索引
经常出现在order by group by 之后的字段
非空字段NOT NULL,Mysql很难对空值作查询优化(一般都需要有默认值)
区分度高,离散度大,作为索引的字段值尽量不要有大量相同值
使用索引的注意事项
索引一般使用的是索引是id,也就是自增的Int值,若是字符串的化一定要指定长度(不要太长),不然就会很耗费时间。(索引的值作为Key存在的,太长会导致一个页当中能够存放的 key 的数目变少,间接导致索引树的页数目变多,索引层次增加,从而影响整体查询变更的效率),
索引什么时候失效:
以%开头的LIKE语句,模糊搜索
模糊匹配、类型隐式转换(Python动态语言查询中需注意)
没有满足最左前缀(没有办法直接比较)
原因:
Mysql B+树的key无法比较的时候就失效
聚集索引,非聚集索引
聚集还是非聚集指的是B+Tree叶子节点存的是指针还是数据记录;没有存储数据非聚集(非聚集存储的是指定(数据记录的地址))
MyISAM索引和数据分离,使用的是非聚集索引
InnoDB数据文件就是索引文件,主键索引就是聚集索引