伪命题之MYSQL分库分表

news2024/11/15 7:26:59

看到使用分库分表来解决性能问题的时候心里总是不能太理解。

 

如果同事发生大量请求的时候,损害性能的是硬盘的随机读。那么分库分表也没有对性能的瓶颈进行“分治”啊。

应该的做法是使用一块新的硬盘来创建分库。但是基本的文章都没有提到这点。而且基本上也不会有公司这么做,毕竟现在一快硬盘在1T所有,一个数据库肯定占用不了这么多地方。而且程序员在申请数据库的时候,也没有办法说明使用不同的硬盘来部署这数据库。而且也不知道部署在这些硬盘上有没有大量的随机读。

还有好多人都觉得MYSQL数据库有性能问题,在单表超过500W或者2000W的时候就要分库分表。我觉得从MYSQL的数据结构来说,应该不存在这些问题。(好多帖子说是避免树高过高。)其实树高增加一层会增加一个数量级的数据存放量。如果通过分库分表来减少树高,可以累死程序员。这也不是程序员应该考虑的。MYSQL只要缓存一个顶级节点pageCache就相当于做了“分库分表”了。所以一直认为分库分表是个伪命题。

下面使用程序来做一下实验来证明自己的想法。

在测试环境Linux系统下安装mysql 5.7.41。本地使用java 8 为客户端代码。

实验一:单表操作

1)创建数据库test

2)创建T_PERSON表

3)使用Java JDBC 批量插入100,000,000条数据,4096为一个批次。总共耗时为:2150秒

实验二:分表不分库

  1. 创建数据库T_PERSON_1, T_PERSON_2, T_PERSON_3, T_PERSON_4, T_PERSON_5, T_PERSON_6, T_PERSON_7, T_PERSON_8.
  2. 使用java JDBC批量插入100,000,000条数据,4096*8为一个批次。每张表总共12,500,000条数据(小于2000W条)。总共耗时为:2015秒。

实验三:分库分表

  1. 创建数据库Test1, Test2, Test3, Test4, Test5, Test6, Test7, Test8
  2. 每个库创建T_PERSON表
  3. 使用java JDBC批量插入100,000,000条数据,4096*8为一个批次。每张表总共12,500,000条数据(小于2000W条)。总共耗时为:2022秒。跟实验二不同的是实验三使用了3个Connection。因为是使用了三个数据库,没有办法使用相同的connection去插入。

数据库

表大小

连接数

Batch

总共插入数据

耗时时间(秒)

实验1

1

1

8.4G

1

4096

100,000,000

2150

实验2

1

8

1.1G

1

4096

100,000,000

2015

实验3

8

1

1.1G

8

4096

100,000,000

2022

实验1

Postgre

1

1

NA

1

4096

100,000,000

2339

读取实验

客户端环境,java8, spring-boot 2.6.6, sharing-sphere 3.1.0

实验一:使用上诉实验一的环境。共使用16个Connection。使用jmeter进行压力测试10 Thread,QPS 为826, 20 thread 889.

实验二:10 thread 833, 20 thread 944

实验三:10 thread 848, 20 thread 902

数据库

连接数

10 threads

20 threads

实验1

1

1

16

826

889

实验2

1

8

16

833

944

实验3

8

1

2

848

902

跟预想的是一样的,分库分表并不能提高性能。

读取实验二

客户端环境,java8,使用多线程,JDBC来测试性能。

数据库

连接数

测试结果

测试结果

实验1

1

1

8

5304.73

6086.77

实验2

1

8

8

7140.63

6467.98

实验3

8

1

8

5832.50

6614.85

实验1

1

1

16

14096.30

13497.41

实验1

1

1

24

18694.14

17823.77

实验1

1

1

32

19104.83

21274.47

也证明了分库分表不能明显提高性能,但是增加并发数可以有效的提高性能。因为mysql没有reactive的driver,就没有测试。

PS: 里面涉及大大量的取余的计算,我特意把除数都设置成2的几次幂,我以为编译器会可以帮我优化。但是查看class代码并没有进行优化。

然后又使用javac –O 测试,已经没有进行优化,不知道为什么。

问了一下ChatGPT,他就可以做出优化的解释。

也使用了一下https://www.cnblogs.com/BetterCallSaul/p/MySQL.html​​​​​​ 提到的查看树高的方法。我的数据库使用的10W的时候是2层,但是到了20W就是3层了,1亿的时候也是三层。

ps: innodb_page_size    16384 (16K)

数据量

树高

100000

2

200000

3

300000

3

100000000

3

PS: 该文章是针对网上一些MYSQL性能不好,或者单表500W或者2000W需要进行分表。或者是为了减少树高的一些观念的看法。我觉得这些观点并不应该成为分库分表的主要目的。

摘自《阿里的开发手册》 。

Mysql单表最大记录是多少_mysql单表数据量_怎么又有bug单的博客-CSDN博客mysql单表最大记录数不能超过多少?https://blog.csdn.net/GBS20200720/article/details/125344782

分库分表的目的from ChatGPT

分库分表是一种常见的数据库水平扩展方案,它的主要目的是解决单一数据库的性能瓶颈和容量限制问题,提高系统的扩展性和可用性。

在单一数据库中,当数据量增长到一定程度时,会面临性能瓶颈和容量限制的问题。而分库分表可以将数据水平拆分到多个数据库或数据表中,每个数据库或数据表只负责一部分数据的存储和查询,从而提高了数据库的性能和容量。同时,分库分表也可以增加系统的可用性,当一个数据库或数据表出现故障时,只会影响到一部分数据,其他数据库或数据表仍然可以继续工作,从而保证了系统的正常运行。

除了提高系统性能和容量,分库分表还可以提高数据库的可扩展性。随着数据量的增长,可以通过增加数据库或数据表的数量来扩展系统的容量和性能,而不需要对原有的数据库或数据表进行修改或扩展。

总之,分库分表是一种解决单一数据库性能瓶颈和容量限制问题,提高系统可用性和可扩展性的有效方式。但是,在实际使用中需要考虑数据一致性、查询路由、数据迁移等问题,需要谨慎设计和实施。

我还是觉得chat GPT的答案挺好的。分库分表肯定有用处,但是我们在使用的时候需要评价我们的场景,以及带来的优缺点,然后我们需要权衡这些优缺点。不要一味的听说要分库分表,或者觉得“分库分表” 很高级。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/431686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

价值导向型研发管理数字化建设方案——易趋亮相CCTI中国研发管理峰会

4月15日-16日,由光环国际举办的2023 CCTI中国研发管理峰会在北京中关村国家自主创新示范区会议中心成功举办。 (现场签到处) 此次峰会邀请了20余位来自腾讯、华为、网易、阿里云等知名企业的研发管理领域专家,带来最新前沿知识和内…

【网络安全知识体系】外网渗透测试 | 14个小实验

写在前面:视频地址 成功上岸360!0基础网络安全 入行 到 入yu、漏洞挖掘-外网渗透测试流程目录 一、导读: 二、汇总: 三、知识导图 四、面试常见问题 五、渗透测试流程 1、简述: 2、寻找测试目标 3、信息收集 …

webgl-简单动画

html <!DOCTYPE html> <head> <style> *{ margin: 0px; padding: 0px; } </style> </head> <body> <canvas id webgl> 您的浏览器不支持HTML5,请更换浏览器 </canvas> <script src"./main.js"></script&g…

程序员必用的6个代码对比神器附下载地址

一、WinMerge WinMerge是一款基于Windows系统下的文件比较和合并工具&#xff0c;使用它可以非常方便地比较多个文档内容&#xff0c;适合程序员或经常需要撰写文稿的朋友使用。WinMerge会将两个文件内容做对比&#xff0c;并在相异之处以高亮度的方式显示&#xff0c;让使用者…

认识网络随机丢包

考虑一根漏水的管子&#xff0c;希望出水口接到和不漏的管子等量的水&#xff0c;要么靠时间&#xff0c;反复将漏掉的水重新注入&#xff0c;直到漏掉的水可忽略&#xff1a; ​ 要么靠空间&#xff0c;在漏的地方将管子加粗&#xff0c;一次性注入更多的水&#xff1a; 不…

什么是HTTP? HTTP和HTTPS的区别?

目录 1、什么是HTTP? 2、HTTP的特点 ① 支持客户/服务器模式 ② 简单快速 ③ 灵活 ④ 无连接 ⑤ 无状态 3、HTTPS 4、HTTP和HTTPS的区别 ① 安全性不同 ② 默认端口不同 ③ 响应速度和资源消耗不同 ④ 网站申请流程不同 ⑤ 对搜索排名的提升不同 1、什么是…

基于OpenCV的硬币面值识别

本项目通过Python与Opencv结合数字图像处理技术对&#xff11;元、&#xff15;角、&#xff11;角三种硬币进行识别。首先通过Canny算子对图像进行边缘检测&#xff0c;然后进一步调用定义的函数去除边缘检测后图像中的孤立点&#xff0c;对处理后的图像进行Hough变换检测圆曲…

涨点技巧: 谷歌强势推出优化器Lion,引入到Yolov5/Yolov7,内存更小、效率更高,秒杀Adam(W)

1.Lion优化器介绍 论文:https://arxiv.org/abs/2302.06675 代码:automl/lion at master google/automl GitHub 1.1 简单、内存高效、运行速度更快 1)与 AdamW 和各种自适应优化器需要同时保存一阶和二阶矩相比,Lion 只需要动量,将额外的内存占用减半; 2)由于 Lion…

港联证券|机器视觉迎重磅利好,5只概念股获两路资金加持

现在我国机器视觉在工业场景中的全体渗透率仍旧在10%以下&#xff0c;比照工业场景巨大的体量而言&#xff0c;机器视觉职业仍有较大开展空间。 近来*ST中潜收到广东证监局行政监管措施决定书。依据深交所的相关要求&#xff0c;公司应当在2023年1月31日前发表公司股票或许被停…

windows安装opencv-python(opencv-python源码安装)

因为我要开启opencv的GStreamer功能&#xff0c;这是和ffmpeg相类似的对视频流操作的一个功能&#xff0c;默认没有开启&#xff0c;需要手动编译。 安装方式链接: opencv-install-with-GStreamer 核心内容如下: git clone --recursive https://github.com/skvark/opencv-py…

数据结构_第十二关:二叉树的基础OJ题练习

目录 1.单值二叉树 2.相同的树 3.另一棵树的子树 4.反转二叉树 5.对称二叉树 6.二叉树的结构及遍历 扩展&#xff1a;如何判断是不是完全二叉树、二叉树的销毁 1&#xff09;判断是不是完全二叉树 2&#xff09;二叉树的销毁 1.单值二叉树 OJ题链接https://leetcode.…

传输协议特点大比拼之UDP

文章目录 前言一.UDP协议端的格式源端口号和目的端口号报文长度校验和 二.UDP的特点无连接面向数据报不可靠缓冲区 前言 本文将比较两种主要的传输协议 ,UDP的特点&#xff0c;以帮助读者更好地理解它们的应用场景和优缺点。 一.UDP协议端的格式 大家先来看一些UDP的报文格式…

企业应用程序单点登录

企业每天都依赖于各种企业应用程序&#xff0c;包括云和本地应用程序。这意味着用户必须经常输入更多密码才能访问这些应用程序并完成他们的工作。为了提高用户的工作效率、减少密码疲劳并使身份管理更有效&#xff0c;您的组织需要部署高效的 SSO 解决方案。 AD360 提供企业 …

[STM32F103C8T6]ADC转换

什么是ADC转换&#xff1f; ADC转换的全称是&#xff1a;Analog-to-Digital Converter&#xff0c;指模拟/数字转换器 ADC的性能指标&#xff1a; ADC分辨率&#xff1a; SSA与VREF-一起接到地&#xff0c;DDA与VREF接到3.3v&#xff0c;所以ADC转换的范围是0---3.3v 所以最后的…

计算机网络复习——第4章 4.2.3 4.2.4 4.3

4.2.3 IP 地址与 MAC 地址 IP地址&#xff1a;虚拟地址、软件地址、逻辑地址。 网络层和以上各层使用。 放在 IP 数据报的首部。 MAC地址&#xff1a;固化在网卡上的 ROM 中。硬件地址、物理地址。数据链路层使用。放在 MAC 帧的首部。IP 地址放在 IP 数据报的首部&#xff…

Windows命令提示符之常见命令--动态更新

序言&#xff1a; 在大家接触Windows电脑的过程中&#xff0c;一般是直接通过鼠标来进行操作&#xff0c;很少甚至没有用到过命令来执行操作&#xff0c;而想必大家都看过电影里面的黑客大神都是通过密密麻麻的指令来操作的&#xff0c;并且执行的速度也会比我们用鼠标块&…

【严重】Artifex Software Ghostscript 任意命令执行漏洞(POC已公开)(CVE-2023-28879)

漏洞描述 Artifex Software Ghostscript是美国Artifex Software公司的一款开源的PostScript解析器。 Artifex Ghostscript 10.01.0及之前版本中&#xff0c;如果写入缓冲区的数据比总长度少一个字节&#xff0c;则尝试写入转义字符&#xff0c;导致两个字节被写入。攻击者可通…

WPF入门(三)--事件Event调用

1、WPF应用程序的关闭 WPF应用程序的关闭只有在应用程序的 Shutdown 方法被调用时&#xff0c;应用程序才停止运行。 ShutDown 是隐式或显式发生&#xff0c;可以通过指定 ShutdownMode 的属性值来进行设置。 对ShutdownMode选项的更改&#xff0c;可以直接在App.xaml中更改&a…

酒店管理系统(Servlet+JSP)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

【网络小知识】TCP协议介绍/三次握手,四次挥手的作用

前端开发人员需要了解三次握手和四次挥手的原因是&#xff0c;这些概念是在客户端和服务器端之间进行网络通信时所涉及到的 TCP 协议的基本知识。而对于前端来讲&#xff0c;如果页面中请求服务端数据时出现连接失败、延迟等问题&#xff0c;就需要对TCP协议中三次握手、四次挥…