首页 > 数据库 >谈谈为什么要拆分数据库?有哪些方法?

谈谈为什么要拆分数据库?有哪些方法?

时间:2023-03-17 15:35:10浏览次数:64  
标签:数据量 数据表 数据库 切分 谈谈 拆分 MySQL

为什么要拆分数据库?

数据库负载和数据量大

拆分数据库是有讲究的,必须:先水平切分,然后垂直切分。

什么是垂直切分?

垂直切分是根据业务来拆分数据库,同一类业务的数据表拆分到一个独立的数据库,另一类的数据表拆分到其他数据库。

比如说一个新零售的电商数据库,我们可以把跟商品相关的数据表拆分成一个数据库,然后在这些数据表的基础之上,构建出商品系统。比如用JAVA或者PHP语言,创建出一个商城系统。然后把跟进销存相关的数据表拆分到另外一个数据库上,再用程序构建出仓库系统。

垂直切分解决了什么问题

垂直切分可以降低单节点数据库的负载。

垂直切分不能解决什么问题

垂直切分不能解决的是缩表,比如说商品表无论划分给哪个数据库节点,商品表的记录还是那么多,不管你把数据库垂直拆分的有多细致,每个数据表里面的数据量是没有变化的。

MySQL单表记录超过2000万,读写性能会下降的很快,因此说垂直切分并不能起到缩表的效果。

什么是水平切分?

水平切分是按照某个字段的某种规则,把数据切分到多张数据表。一张数据表化整为零,拆分成多张数据表,这样就可以起到缩表的效果了。

很多人,都对水平切分存在误解,以为水平切分出来的数据表必须保存在不同的MySQL节点上。其实水平切分出来的数据表也可以保存在一个MySQL节点上面。不是水平切分一定需要多个MySQL节点。

MySQL自带一种数据分区的技术,可以把一张表的数据,按照特殊规则,切分存储在不同的目录下。如果我们给Linux主机挂载了多块硬盘,我们完全可以利用MySQL分区技术,把一张表的数据切分存储在多个硬盘上。这样就由原来一块硬盘有限的IO能力,升级成了多个磁盘增强型的IO。

水平切分的用途

水平切分可以把数据切分到多张数据表,可以起到缩表的作用。(数据量较大的数据表才需要做数据切分)

水平切分的缺点

不同数据表的切分规则并不一致,要根据实际业务来确定。所以我们在选择数据库中间件产品的时候,就要选择切分规则丰富的产品。常见的数据库中间件有:MyCat、Atlas、ProxySQL等等。

水平切分的另一个缺点就是扩容比较麻烦,日积月累,分片迟早有不够用的时候。这时候不是首先选择增加新的集群分片。因为一个MySQL分片,需要4~8个MySQL节点(最小规模),增加一个分片的投入成本是很高的。所以正确的做法是做冷热数据分离,定期对分片中的数据归档。把过期的业务数据,从分片中转移到归档库。目前来说数据压缩比最高的MySQL引擎是TokuDB,而且带着事物的写入速度是InnoDB引擎的6-14倍。用TokuDB作为归档数据库最适合不过。

为什么先做水平切分,后作垂直切分?

随着数据量的增加,最先应该做的是数据分片,利用多块硬盘来增大数据IO能力和存储空间,这么做的成本是最低的。几块硬盘的钱就能收获不错的IO性能。

进入到下一个阶段,数据量继续增大,这时候我们应该把数据切分到多个MySQL节点上,用MyCat管理数据切分。当然还要做数据的读写分离等等。在后台做水平切分的同时,业务系统也可以引入负载均衡、分布式架构等等。理论上,使用了冷热数据分离之后,水平切分这种方式可以继续维持很长一段时间,数据量再大也不怕,定期归档就好了。

数据库到了水平切分的阶段,数据量的增加已经不是更改架构设计的主要原因了。反而这个阶段业务系统承受不住了,如果再不对系统做模块拆分,业务系统也撑不下去了,所以按照模块和业务,把一个系统拆分成若干子系统。若干子系统之间,数据相对独立。比如淘宝不会跟支付支付宝分享全部数据,共享同一套数据表,这也影响各自业务的发展。所以就要弄垂直切分了,把数据表归类,拆分成若干个数据库系统。

如果过早的对数据库做了垂直切分,势必要重新构建若干独立的业务系统,工作量太巨大。水平切分并不需要业务系统做大幅度的修改,因此说应该先从水平切分开始做。

 

参考:

 

标签:数据量,数据表,数据库,切分,谈谈,拆分,MySQL
From: https://www.cnblogs.com/xfeiyun/p/17226581.html

相关文章

  • .net 连接各个数据库的ConnectionString字符串
    DataType----->ConnectionStringDataType.MySql----->DataSource=127.0.0.1;Port=3306;UserID=root;Password=root;InitialCatalog=cccddd;Charset=utf8;SslMode=none......
  • AndroidStudio数据库连接有问题
    packagecom.example.daka;importandroidx.appcompat.app.AppCompatActivity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.EditTex......
  • C# 连接SQL数据库 ,增删改查
     Default3.aspx.cs1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Data;//数据库执行方式4usingSystem.Data.SqlClient;//数据库5us......
  • 使用 Athena (Presto) 分析本地 Oracle 数据库导出的数据
    在传统企业客户,无论是前台的交易数据库还是后台的数据仓库,都会选择使用Oracle,它具备非常广泛的技术资料、社区资源和问题处理案例(各种踩坑的经验);同时它还有广泛的用户基础......
  • 分布式数据库DDBS
    一、什么是分布式数据库分布式数据库系统(DDBS:Distributed Database System)是在集中式数据库系统的基础上发展来的。是数据库技术与网络技术结合的产物。分布式数据......
  • 分别谈谈联合索引生效和失效的条件
    联合索引失效的条件联合索引又叫复合索引。两个或更多个列上的索引被称作复合索引。对于复合索引:Mysql从左到右使用索引中的字段,一个查询可以只使用索引中的一部分,但只能......
  • 请你谈谈关于IO同步、异步、阻塞、非阻塞的区别
    对于一个networkIO(这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process(orthread),另一个就是系统内核(kernel)。当一个read操作发生时,它会经历两个......
  • 请你谈谈单例模式的优缺点,注意事项,使用场景
    单例模式(Singleton),是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个全局对象,这样有利于我们协调系统整......
  • 接口自动化---数据库断言封装python
    接口自动化---数据库断言封装python前言:在接口测试响应验证中,通常可以通过接口响应值来验证,还可以通过查询数据库信息辅助来验证。接口测试数据清理1、通过Delete接口删......
  • 记录一次重置数据库root用户的过程
    服务器的mysql突然连接不上去了,密码也忘记了。只能重新设置密码了1、使用如下指令打开mysql数据库配置文件(具体的文件路径以实际情况为准)vim/etc/my.cnf在虚拟机中直接......