[翻译] InnoDB 页合并与页分裂

2019-12-22 23:06:20 +08:00
 RedisMasterNode

如果你找过世上任何一位 MySQL 顾问,问他对你的语句和 /或数据库设计的建议,我保证他会跟你讲主键设计的重要性。特别是在使用 InnoDB 引擎的情景,他们肯定会给你解释索引合并和页分裂这些。这两个方面与性能息息相关,你应该在任何设计索引(不止是主键索引)的时候都将他们考虑在内。

你可能觉得这些听起来挺莫名其妙,没准你也没错。这不是容易的事,特别是讲到关于内部实现的时候。通常你都不会需要处理这些事情,并且你也不想去着手他们。

但是有时候这些问题又是必须搞清楚的。如果有这种情况,那这篇文章正适合你。

我尝试用这篇文章将一些最不清晰、InnoDB 内部的操作解释清楚:索引页的创建、页合并和页分裂。

在 InnoDB 中,数据即索引(译注:索引组织数据)。你可能听过这种说法,但它具体是什么样的?

正文

...正文内容发不出来,移步 https://blog.2014bduck.com/archives/260

总结

MySQL/InnoDB 不断地进行这些操作,你可能只能了解到很少的信息。但他们可能给你造成伤害,特别是比起用 SSD,你还在用传统的机械存储( spindle storage )的时候(顺便提一下 SSD 会有另外的问题)。

坏消息就是我们用什么参数或者魔法去改变服务端。但好消息是我们可以在设计的时候做很多(有帮助)的事。

恰当地使用主键和设计辅助索引,并且记住不要滥用(索引)。如果你已经预计到会有很多插入 /删除 /更新操作,规划一个合适的时间窗来管理(整理)表。

有个很重要的点,InnoDB 中你不会有断断续续的行记录,但是你会在页-区的维度上遇到这些问题。忽略表的管理工作会导致需要在 IO 层面、内存层面和 InnoDB 缓冲池层面做更多工作。

你必须不时( at regular intervals )重建一些表。可以采用一些技巧,比如分区和外部的工具( pt-osc )。不要让表变得过大和过于碎片化( fragmented )。

磁盘空间浪费?需要读多个表去获取需要的数据而不是一次搞定?每次搜索导致明显更多的读操作?那是你的锅,不要找借口!

Happy MySQL to everyone!

感谢

Laurynas Biveinis: 感谢花时间向我解释一些内部实现。

Jeremy Cole: 感谢他的项目InnoDB_ruby (我经常用上)。

6023 次点击
所在节点    MySQL
4 条回复
wh2724
2019-12-23 00:31:46 +08:00
楼主写得很用心,恰巧最近实习结束回学校在复习数据库,收藏了!
aliipay
2019-12-23 01:35:36 +08:00
这样的背景挺影响阅读效率的
indicoliteplus
2019-12-23 08:00:52 +08:00
lz 有心啦,索引分裂是原罪哈哈
RedisMasterNode
2019-12-23 09:36:16 +08:00
@aliipay 感谢;博客的主题这个很少管理,既然有人提出来那回头回去尝试弄的更方便阅读

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/631321

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX