阿里巴巴技术手册:单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表的理论依据?

2022-10-16 03:10:50 +08:00
 LoremIpSum

不少技术文章都直接引用了这个观点,但没说为什么?有大佬解释下这个理论依据吗?

7236 次点击
所在节点    程序员
48 条回复
sean424
2022-10-16 21:01:36 +08:00
12 年的时候,mysql 免费版 大概 600 多万 数据是个分界线
keakon
2022-10-16 21:21:26 +08:00
InnoDB 的一页默认是 16KB ,其中有 100 多字节是头部等不用于存储数据的,这里先忽略。
索引页的每行要存储一个主键(假设是 int ,4 字节)和一个页号( 4 字节),共计 8 字节。即一页最多存储 2K 条。
以一个 3 层的 B+ 树来计算,前两层是索引页,最多索引 2K * 2K = 4M 个节点。
假设表的每行占用的空间是 1KB ,那么一个数据页(叶子节点)最多存储 16 条数据,所有节点共可以存储 64M 条数据( 64GB 大小)。
超过这个量时,要用 4 层的 B+ 树,那么 IO 次数就至少多出 1/3 ,索引也很难全放在内存中,肯定会大幅影响性能。

但是题目中提到的 500M 行和 2GB 并不是一个固定值,如果主键和每行占用的空间较小,就能存放更多的页。甚至你还能修改 innodb_page_size ,配置成更大的页,以在一页中存储更多行(但是可能造成 IO 的浪费,因为每次至少读一页)。
lazyfighter
2022-10-17 09:26:59 +08:00
@keakon 非常赞
sun1991
2022-10-17 09:27:34 +08:00
之前一个人能搞定, 分表后需要一个团队维护. 对部门有利.
daoqiongsi1101
2022-10-17 13:07:02 +08:00
我们存了十几亿数据,看你怎么查,不是所有查询都会很慢
Seulgi
2022-10-17 14:13:57 +08:00
阿里人家数据库实例是什么规格都没给你说, 你怎么确定自己的实例规格要按照 500w 或 2GB 来呢, 阿里的技术手册, 就看看就行吧. 经验值始终要去躺一次才知道什么效果, 没必要强硬生套.
cubecube
2022-10-17 14:27:53 +08:00
@wxf666
1. 十年前的 mysql 的确不太行( 5.7 之前)
2. 十年前的 CPU 性能瓶颈也很大,不分库存在 CPU 瓶颈
3. 之前的 Disk 是 HDD ,现在大部分是 ssd ,导致数据库性能有急剧提升。
综上,以前的观点和现在大家的体感不一致很正常。
motecshine
2022-10-17 15:01:13 +08:00
我们单表 670GB 数据 OLTP 查询 基本在 20-30ms

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

https://tanronggui.xyz/t/887224

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

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

© 2021 V2EX