MySQL索引数据结构分析

什么是数据库调优?说得高大上,实际上就是减少磁盘IO次数。

众所周知,为数据表增加索引会使查询速度大大提升,MySQL索引其实是一种数据结构,有“哈希”和“B+树”可供用户选择。为什么只能用这两种呢?为什么不能用二叉树、平衡二叉树、红黑树等等呢?
  • 首先,来说一下MySQL增加数据的方式:一般都是主键自增的。根据二叉
    树的特性:“左子树小于根节点,右子树大于根节点”,如果索引采用这种数据
    结构,会生成一个向右倾斜的树,而且不会生成平衡二叉树。存放的数据越多, 树就越深,不能达到快速查询的目的。

  • 如果采用红黑树,也一样只是生成一个比二叉树稍微改善一点的向右倾斜 的树而已。

上述两种数据结构并没有使磁盘IO次数减少。

  • 我们知道“哈希”是一种散列算法,给定一个数据经过哈希运算后,能得到
    一个固定长度的数列(哈希值)。MySQL索引存放哈希值,而哈希值所对应的是数
    据的指针,因此哈希索引时间复杂度为O(1),查询速度极为迅速。
哈希索引有两个特点:
		1.数据并不是按照索引值顺序存储,所以也就无法用于排序。
		2.不支持任何范围查询
		因为这两个缺陷,哈希索引只适用于某些特定的场合。
那B+树是怎么来解决上述的各种问题呢?

不了解B+树是什么的同学可以点击链接 数据结构可视化,手动生成B+树并观察。

  • B+树允许每个结点拥有多个内部结点,“Max. Degree”代表每个结点的最大内部结点数量,B+树同样具有“左子树小于根节点,右子树大于根节点”的特性,并且只有叶子结点用来存放数据,在B+树索引中,叶子结点存放的是对应主键的物理地址。

值得一提的是:

	若不是主键建立的索引,叶子结点存放的就是对应数据的主键,再 根据主键索引去查询,达到节省空间的目的。
   B+树索引虽然没有哈希索引速度快,但解决了不能排序和范围查询的缺陷,也 极大地减少了磁盘IO的次数。

我们还可以适当利用SQL语句来减少磁盘IO:

  1. 避免使用 select *
  2. 当只需要查询出一条数据的时候,要使用 limit 1
  3. 建立高性能的索引
  4. 建数据库表时,给字段设置固定合适的大小
  5. 尽量使用not null
  6. EXPLAIN 你的 SELECT 查询
  7. 在Join表的时候,被用来Join的字段,应该是相同的类型的,且字段应该是被
    建过索引的,这样,MySQL内部会启动为你优化Join的SQL语句的机制
  8. 如果你有一个取值是有限而且固定的字段,应该使用 ENUM 而不是 VARCHAR
  9. 垂直分割
  10. 优化where查询
  11. 不建议使用%前缀模糊查询,这种查询会导致索引失效而进行全表扫描
  12. 要慎用in和 not in
  13. 理解in和exists, not in和not exists的区别
  14. 理解select Count (*)和select count(1)以及select count(column)区别
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

taiqinnng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值