请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

如何判定该分库分表?

老师,有三个问题请教一下:
问题一:假如说mysql单表的数据达到3000W,是不是就该考虑水平分表了?这也是我今天在工作当中遇到的
问题二:一般mysql数据库里,单表数据达到多少就应该考虑分库分表了?网上说法很多,有说1000W的,有说2000W的,甚至有说500W就该考虑分表了,这个老师有什么建议吗?
问题三:我想自己写个小程序证明查询速度下降了,必须水平拆表了,应该如何写?因为我曾经试过,走BTree索引的话,好像测不太出来啊,效率几乎没怎么下降,我应该如何测试?这也是我今天工作中遇到的,我想写个程序去测试一下,做为有力的证据,但是测不出来

正在回答 回答被采纳积分+3

1回答

Moody 2022-02-09 22:46:57

1 分表的合适大小跟很多的因素有关系,比如硬件的配置(内存,硬盘)、缓存池大小、业务负载、列宽等。这些因素导致分表的合适大小从几百万至几千万不等。以列宽来说,如果一个表字段很少,每个字段又非常短,那么一个B+树节点可以有几百上千个数据,几千万行数据也不会有明显的性能衰减。

2 自己测试的话,并发量要高,一个连接基本测不出来性能问题。而且测试集也不能随便写,不能只查询固定的一部分数据,那样很容易走缓存,测不出来硬盘的性能问题。可以参考mysql的基准测试。

一般来讲300W以下不考虑分表的问题,300W以上不是一定要分表,而是可以考虑。因为数据库的瓶颈最容易出现在磁盘IO上,我一般会根据磁盘IOPS情况判断,如果高峰期时的IOPS达到了磁盘最大IOPS的一半,就可以考虑分表了。最大IOPS可以使用6-11节的方法测试。系统当前IOPS可以参考下面的方法:

https://qastack.cn/unix/225095/how-to-get-total-read-and-total-write-iops-in-linux

1 回复 有任何疑惑可以回复我~
  • 谢谢老师,那我岂不是想自己写代码测试还测不出来?那为什么网上还有那么多的所谓的经验和建议?什么1000W就分表,或者2000W就分表,甚至有的说,500W就分表?这些所谓的经验是哪里来的?只是为了控制B+树的高度吗?
    回复 有任何疑惑可以回复我~ 2022-02-12 19:51:21
  • Moody #2
    自己写代码测的话不是不行,只是需要精心设计一下测试集,要测的比较全面。
    B+数高度确实是最关键的问题,但是高度并不是只和数据量有关,还和列宽有关,所以网上说的只是他们自己的情景,不能直接代入到自身。
    回复 有任何疑惑可以回复我~ 2022-02-12 20:56:44
  • 提问者 weixin_慕婉清7380234 回复 Moody #3
    那我是不是可以理解成,多少数据分表,都不一定,这东西跟你一个表的字段多少和长短有关系,字段越少,并且字段越短,1个page页承载的数据越多,单表承载的数据量就更多。比如说字段多,并且长度大,一个page页承载的数据少的表,1000W数据就得分表;而相对的,字段少,并且字段长度相对短,一个page页承载的数据多的表,可能达到3000W数据都不影响性能,都用不着分表?
    再一个,这东西还和硬件有关系,
    再再一个,就像老师说的那样,网上说的是他们自己的情况,我个人的情况还得看我个人的具体问题呗。如果有人说,达到1000W数据,就必须分表,其实是很武断的,是不对的?
    回复 有任何疑惑可以回复我~ 2022-02-13 11:56:30
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信