扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
Schema的优化和索引 - 索引和表的维护
减少索引和数据碎片
B-TREE索引比较容易有碎片。这样会降低性能的。碎片的索引会糟糕的并且/或者不连续的存放在硬盘上。B-TREE索引需要随机硬盘访问来“跳”到叶子页上,因此随机访问是个规则,并不是例外。然而,如果他们物理存储是连续的并且轻微压缩的,那么叶子页的表现仍会很好。如果并不是这样,我们就说它们是碎片的,并且范围扫描和全索引扫描速度会成倍的降低。尤其是对于全索引覆盖的语句。
表的数据存储也会变为碎片。然而,数据存储碎片要比索引碎片复杂的多。有两种数据碎片:
行碎片.当行存储在多个位置的多个片段伤的时候,就产生了这个类型的碎片。即使查询需要索引中的一个单独的行,行碎片也能导致性能的降低。
内部行碎片。当逻辑的连续页或者行并不是连续的存储在硬盘上就导致了内部行的碎片。它能影响全表扫描和聚簇索引范围扫描,这些操作一般都可以从连续存储在硬盘上的数据得到一些好处。
MyISAM表都会遇到这两种碎片,而INNODB不会有短行的碎片。
为了去掉碎片数据,你可以使用OPTIMIZE TABLE或者丢掉和重新导入数据。
这两个方法对于大部分引擎来说是比较好用的。对于如MyISAM的引擎,通过排序算法重新创建索引来消除碎片。到目前为止,还没有方法消除InnoDB的碎片。在M又SQL5.0中InnoDB还不同通过排序来创建索引。甚至你重新删除和创建索引,它们还是碎片的。
对于一些不支持OPTIMIZE TABLE的存储引擎。你可以使用ALTER TABLE来重新创建表。仅仅要更改表的存储引擎,当然这个存储引擎就是当前表的。
mysql> ALTER TABLE <table> ENGINE=<engine>;
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者