MySQL 索引成本

添加成本:
DBMS会将索引添加至其索引键所属的叶子页上,但是该叶子页可能没有足够的空间来存放这个索引行,在这种情况下,DBMS将会分裂叶子页,其中一个半的行将被移动到一个新的叶子页上,并尽可能地靠近被分裂页(每个叶子页上预留部分比例的空闲空间,避免分裂)。但是最坏的情况下,这个索引页可能被放置在索引的末尾,如果不需要分裂,只有需要一次随机I/O即可。如果需要分裂需要两次I/O

叶子页分裂的成本:
分裂一个索引页只需一次额外的同步读,约10ms,除了两个叶子页以外,DBMS通常还必须更新一个非叶子页,而它很可能已经在内存或者读缓存中了。索引片上的每处叶子页分裂都可能会增加额外的两次随机访问。一次是为了查找索引行被移至的索引页,一次是为了返回到扫描的原始位置,其中第一次随机访问很可能会导致一次磁盘的随机读。

更新成本:
如果更新的是复合索引的第一个索引,新的索引行可能必须迁移到一个不同的叶子页上,及DBMS必须更新两个叶子页(一次删除原有叶子页的数据,已经再另一个叶子页插入索引)。
对于复合索引,当不稳定的列为复合索引的尾列,更新这个不稳定的列,不会导致迁移新的叶子页,在当前磁盘下,只有 更新频率多于10次/s,不稳定列才可能成为问题。

删除成本:
对于删除成本,DBMS需要一次随机I/O,找到需要删除的数据,打上删除的标志,但空间并不会回收。空间的回收依赖于DB的回收机制或者DB维护者进定期的索引重组。

索引顺序被打破的原因:
  1.如果一个叶子页没有足够空间存储新插入的索引行,那么叶子页就必须被分裂。之后链表仍会按照正确的顺序连接索引行,但这与底层的物理存储顺序就不在一致,一些“按道理”应该顺序的访问就变成随机访问了。不过索引的重组可以再次恢复理想顺序
  2.数据增长可能会填满原本连续的空间,操作系统于是会寻找另一个连续的空间,并将它连接到原来空间的后面。第一区域跨到第二个区域访问就会产生一次随机访问。
  3.同索引一样,存储表的传统方式也是将所有表页保留在一个连续的空间内。引起顺序杂乱和碎片化的因素也是与索引中的相似。但有两个地方不同:
  (1)如果往表中插入的记录在聚簇索引所定义的主页中装不下,则通常不会移动现有行,而是将新插入的记录存储到离主页尽可能近的表页中。
  (2)一条记录更新后,如果表行过长,导致无法在存储当前的表页中。DBMS就必须将该行记录迁移到另一个页表中。同时在原来的表页中存储指向新表的指针(引入额外的随机访问)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值