mysql索引左倾_MySQL索引学习

本文详细解析了MySQL索引的定义,重点探讨了为何选择B+树结构,以及何时创建和避免索引。涵盖了B树、AVL树、B+树的发展过程,以及主键索引、查询条件、排序和统计字段的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dca21f2060a41a06edb1fe9ee3315d65.png

MySQL官方对索引的定义为:索引是帮助MySQL高效获取数据的数据结构。

索引的本质:索引是数据结构,可以简单的理解为“排好序的快速查找B+树数据结构”

B+树:B代表平衡(balance)而不是二叉(binary)

检索原理:

042f573f8dabe0e5bafbab89fcac903b.png

mysql索引结构:

BTREE:

B树(Balance Tree多路平衡查找树)

B+树(加强版多路平衡查找树)

为什么是B+树?

通过六步迭代演变:

1.全部遍历

2.Hash

找一次就能找到,而不是遍历,保证一次性。hash搞不定范围和排序查找。

加速查找速度的数据结构,常见的有两类:

(1)哈希,例如hashmap,查询/插入/修改/删除的平均时间复杂度都是O(1);

(2)树,例如平衡二叉搜索树,查询/插入/修改/删除的平均时间复杂度都是O(log2(n));

可以看到,不管是读请求,还是写请求,哈希类型的索引,都要比树型的索引更快一些,那为什么,索引结构要设计成树型呢?

想想范围/排序等其他sql条件:

哈希型的索引,时间复杂度会退化为O(n),而树型的“有序”特性,依然能保持O(log2(n))的高效率。

备注:InnoDB并不支持哈希索引。O(n)指查找n次。

3.二叉树

哈希比树快,索引结构为什么要设计成树型?

5327de842362a048f9072f0913aa1d91.png

普通二叉树存在两种问题:

a737e0277ca1fa350b548b7f28bf8818.png

出现左倾或右倾问题

c711e51e2c7eb7d1b221e47c6b74a8bd.png

又是链表又是树

4.平衡二叉树(AVL)

从算法的数学逻辑来讲,二叉树的查找速度和比较次数都是最小的,那为什么选择BTREE?

只要是平衡二叉树,随着树的增加,根节点会变化,不会变左倾错误。

151db6155ca21e27953030b0942ad208.png

比如10,查找次数是4。如果数据量越多,树就会越高,查找次数就越多。数据量越多,树就会越高,遍历的次数就会越多,IO就会开销越大,导致系统性能下降。

遗留问题:树高问题导致磁盘IO过多。尽量从瘦高变矮胖。

5.B树

d16a2b87101168aa892dc588ed54fb9a.png

底层原理:

6da25f5c8de90d15c9e294a367757b74.png

磁盘页/块:

sql说话:

f93b52d8c92cf7fbc09251577bb2df18.png

块/页关系:

293589e8a6c6465fd7a36d3c9bd3eb4d.png

B树检索原理:

a83de8a9439c7fd9ed281564534eef39.png

b09da197bd321ac572b8ef8744f1a92e.png

总结:B树比平衡二叉树少了一次IO操作

6.B+树:

48c97a8afc11d9bac649d446c41994aa.png

1a0788259eb3b81d10d4242e00aa4013.png

检索原理

27a402e555a05c7cb6dce31c5ec9fddb.png

0783050e759093feaff699ba9fe0481f.png

B+树与B树的区别:

非叶子节点只存储键值信息

所有叶子节点之间都有一个链指针

数据记录都存放在叶子节点中

哪些情况下需要建立索引:

1.主键自动建立索引

2.频繁作为查询条件的字段应该创建索引

3.查询中与其他表关联的字段,外键关系建立索引

4.单键/组合索引的选择问题,组合索引性价比更高

5.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

6.查询中统计或分组字段(分组包含排序,先排序后分组)

哪些情况不要创建索引:

1.表记录太少

2.经常增删改的表或字段

3.where条件里用不到的字段

4.过滤性不好的字段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值