MySQL索引优化策略(八):减少索引和数据的碎片化

二叉树索引可能导致碎片化,进而影响数据库性能。碎片化的索引存储性能很弱或在磁盘上不是有序的。使用二叉树索引去超找页节点时本身就需要随机的磁盘访问,因此随机访问是二叉树索引的特性,而并不是异常。然而,如果页节点在物理上是有序的并且紧密存储,那查询的性能依旧是更好的。如果不是这样的话,我们称之为碎片化,此时的范围查询或全表扫描的速度会成倍地降低,尤其对于覆盖索引查询而言更是如此。

数据表的数据存储也可能是碎片化的。然而,数据存储碎片化比起索引的碎片化更为复杂,存在三种类型的数据碎片化:

  • 行碎片化:行碎片化发生在同一行数据存在不同物理存储的不同片上。行碎片化会直接降低单行数据的查询性能;
  • 行间碎片:当逻辑上有序的分页或数据行在磁盘存储不是有序时,就会发生行间碎片。这会影响全表扫描或聚集索引的范围查询——这种情况的查询性能通常依赖于磁盘存储的数据是否有序。
  • 空存储空间碎片:当数据页中存在很多空闲空间时,就会发生空存储空间碎片。这会导致数据库服务器读取一大堆不需要的废弃数据。

上述的三种情况,MyISAM引擎的数据表都可能遇到,但是InnoDB在小的数据行时不会发生这些情况——存储引擎会移动这些数据并写入到单独的数据分片。

为解决数据碎片问题,可以允许OPTIMIZE TABLE或导出数据再重新导入,这种手段对大多数存储引擎有效。例如,MyISAM引擎通过一个排序算法重建索引使其有序来去碎片化。在旧版本InnoDB中,没有有效的方式对索引去碎片化,但是在新版本中,InnoDB可以“在线”删除和重建索引,而不是重建整个数据表来实现去碎片化。

对于那些不支持OPTIMIZE TABLE命令的存储引擎,你可以通过一个没有对数据表无影响的ALTER TABLE命令来重建整个数

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

岛上码农

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

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

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

打赏作者

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

抵扣说明:

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

余额充值