一、mysql 45讲
1)索引的本质讲解
-
定义解释
所以是帮助Mysql高效获取数据的排好序
的数据结构
-
索引数据结构
①二叉树
②红黑树
③Hash表
④B-Tree -
原理讲解
可以看到右边的数据结构里面,是按照k-v来存数据结构的,key是col2的字段,这个value对应的是这个节点对应数据在磁盘中的地址
2)索引的数据结构详解和索引的规约
①二叉树:当维护逐一增加的的数值,例如从1到9递增时,会退化成链表,查找效率低下
下图是二叉排序树的排序:
②红黑树(又名二叉平衡树)
1)同一节点只有两个子节点,不如B树,当存储大量节点时候,树的高度太高了,I/O次数太多
2)B+树,分配一个索引节点时候,会分配更大空间,存储更多小索引元素
③Hash表
④B-Tree
1)对比红黑树增加了更多节点,相同节点更少的I/O磁盘检索次数,也就是更矮的树
⑤B+Tree
1)数据都放在叶子节点(这里data其实就是数据的地址),非叶子节点不存储数据只存储索引,可以放更多索引
2)叶子节点之间用指针连接,提高区间访问的性能,节点键值从左往右递增
3)下面图里面的一个节点(15和18)默认分配16K的大小,把索引节点的第一个节点提上去作为冗余节点,比如这里的15会被提上去,15傍边空白块就是15节点的指针,当高度为3,一个节点(假设主键为bigint也就是8B,空白块为6B,一个节点16KB,那么一共可以存1170个节点),不同的数据存储引擎不同的data大小,假设data是1KB,那么15+data就是16个索引元素。所以3层一共可存储1170117016个节点,也就是2千多万节点
https://www.bilibili.com/video/BV1ge4y117cM?p=3&spm_id_from=pageDriver&vd_source=27ec8b3b09d2a66ceeb9dbe961a247d3
7:37
⑥索引规约
1)业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引
2)
(1)超过三个表禁止join
。
(2)需要join的字段,数据类型保持绝对一致
;
(3)多表关联查询时,保证被关联的字段需要有索引
。
(注意:即使双标join也要注意表索引、SQL性能)
3)在varchar字段上建立索引时,必须指定索引长度
,没必要对全字段建立索引,根据文本区分度决定索引长度