MySQL分库分表简单介绍
分库、分表
- 一、前言
- 二、分片(类似分库)
- 三、Scale Out/Scale Up 和 垂直切分/水平拆分
- 四、分表和分区
- 五、分表与分库
- 六、分区与分片区别
一、前言
数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈。需要进行数据的处理,采用的手段是分区、分片、分库、分表。
二、分片(类似分库)
分片是把数据库横向扩展(Scale Out)到多个物理节点上的一种有效的方式,其主要目的是为突破单节点数据库服务器的 I/O 能力限制,解决数据库扩展性问题。Shard这个词的意思是“碎片”。如果将一个数据库当作一块大玻璃,将这块玻璃打碎,那么每一小块都称为数据库的碎片(DatabaseShard)。将整个数据库打碎的过程就叫做分片,可以翻译为分片。
形式上,分片可以简单定义为将大数据库分布到多个物理节点上的一个分区方案。每一个分区包含数据库的某一部分,称为一个片,分区方式可以是任意的,并不局限于传统的水平分区和垂直分区。一个分片可以包含多个表的内容甚至可以包含多个数据库实例中的内容。每个分片被放置在一个数据库服务器上。一个数据库服务器可以处理一个或多个分片的数据。系统中需要有服务器进行查询路由转发,负责将查询转发到包含该查询所访问数据的分片或分片集合节点上去执行。
三、Scale Out/Scale Up 和 垂直切分/水平拆分
Mysql的扩展方案包括Scale Out和Scale Up两种。
Scale Out(横向扩展)是指Application可以在水平方向上扩展。一般对数据中心的应用而言,Scale out指的是当添加更多的机器时,应用仍然可以很好的利用这些机器的资源来提升自己的效率从而达到很好的扩展性。
Scale Up(纵向扩展)是指Application可以在垂直方向上扩展。一般对单台机器而言,Scale Up指的是当某个计算节点(机器)添加更多的CPU Cores,存储设备,使用更大的内存时,应用可以很充分的利用这些资源来提升自己的效率从而达到很好的扩展性。
MySql的Sharding策略包括垂直切分和水平切分两种。
垂直(纵向)拆分:是指按功能模块拆分,以解决表与表之间的io竞争。比如分为订单库、商品库、用户库…这种方式多个数据库之间的表结构不同。
水平(横向)拆分:将同一个表的数据进行分块保存到不同的数据库中,来解决单表中数据量增长出现的压力。这些数据库中的表结构完全相同。
表结构设计垂直切分。常见的一些场景包括
a).大字段的垂直切分。单独将大字段建在另外的表中,提高基础表的访问性能,原则上在性能关键的应用中应当避免数据库的大字段
b). 按照使用用途垂直切分。例如企业物料属性,可以按照基本属性、销售属性、采购属性、生产制造属性、财务会计属性等用途垂直切分
c). 按照访问频率垂直切分。例如电子商务、Web 2.0系统中,如果用户属性设置非常多,可以将基本、使用频繁的属性和不常用的属性垂直切分开
表结构设计水平切分。常见的一些场景包括
a). 比如在线电子商务网站,订单表数据量过大,按照年度、月度水平切分
b). Web 2.0网站注册用户、在线活跃用户过多,按照用户ID范围等方式,将相关用户以及该用户紧密关联的表做水平切分
c). 例如论坛的置顶帖子,因为涉及到分页问题,每页都需要显示置顶贴,这种情况可以把置顶贴水平切分开来,避免取置顶帖子时从所有帖子的表中读取
四、分表和分区
分表从表面意思说就是把一张表分成多个小表,分区则是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上。
分表和分区的区别
1,实现方式上
mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完正的一张表,都对应三个文件(MyISAM引擎:一个.MYD数据文件,.MYI索引文件,.frm表结构文件)。
2,数据处理上
分表后数据都是存放在分表里,总表只是一个外壳,存取数据发生在一个一个的分表里面。分区则不存在分表的概念,分区只不过把存放数据的文件分成了许多小块,分区后的表还是一张表,数据处理还是由自己来完成。
3,提高性能上
分表后,单表的并发能力提高了,磁盘I/O性能也提高了。分区突破了磁盘I/O瓶颈,想提高磁盘的读写能力,来增加mysql性能。
在这一点上,分区和分表的测重点不同,分表重点是存取数据时,如何提高mysql并发能力上;而分区呢,如何突破磁盘的读写能力,从而达到提高mysql性能的目的。
4,实现的难易度上
分表的方法有很多,用merge来分表,是最简单的一种方式。这种方式和分区难易度差不多,并且对程序代码来说可以做到透明的。如果是用其他分表方式就比分区麻烦了。分区实现是比较简单的,建立分区表,跟建平常的表没什么区别,并且对代码端来说是透明的。
分区的适用场景
1.一张表的查询速度已经慢到影响使用的时候。
2.表中的数据是分段的
3.对数据的操作往往只涉及一部分数据,而不是所有的数据
CREATE TABLE sales (id INT AUTO_INCREMENT,amount DOUBLE NOT NULL,order_day DATETIME NOT NULL,PRIMARY KEY(id, order_day)) ENGINE=InnodbPARTITION BY RANGE(YEAR(order_day)) (PARTITION p_2010 VALUES LESS THAN (2010),PARTITION p_2011 VALUES LESS THAN (2011),PARTITION p_2012 VALUES LESS THAN (2012),PARTITION p_catchall VALUES LESS THAN MAXVALUE);
分表的适用场景
1.一张表的查询速度已经慢到影响使用的时候。
2.当频繁插入或者联合查询时,速度变慢。
3.分表的实现需要业务结合实现和迁移,较为复杂。
五、分表与分库
分表能够解决单表数据量过大带来的查询效率下降的问题,但是,却无法给数据库的并发处理能力带来质的提升。面对高并发的读写访问,当数据库master服务器无法承载写操作压力时,不管如何扩展slave服务器,此时都没有意义了。因此,我们必须换一种思路,对数据库进行拆分,从而提高数据库写入能力,这就是所谓的分库。
与分表策略相似,分库可以采用通过一个关键字取模的方式,来对数据访问进行路由,如下图所示
六、分区与分片区别
相关链接:
MySQL索引类型(按数据结构分类)
MySQL索引类型(按逻辑角度分类)
MySQL索引类型(按物理存储分类)
MySQL之MVCC实现原理
MySQL 索引底层原理
MySQL之InnoDB中一棵B+树能存多少行数据
MySQL数据库优化的八种方式
MySQL数据库优化-运维角度浅谈
MySQL分库分表简单介绍相关推荐
- MySQL分库分表原理
分库分表原理 前言 垂直拆分 水平拆分 分库分表后引入的问题 分库分表中间件 前言 在互联网还未崛起的时代,我们的传统应用都有这样一个特点:访问量.数据量都比较小,单库单表都完全可以支撑整个业务.随着 ...
- 高可用Mysql架构_Mysql主从复制、Mysql双主热备、Mysql双主双从、Mysql读写分离(Mycat中间件)、Mysql分库分表架构(Mycat中间件)的演变...
[Mysql主从复制] 解决的问题 数据分布:比如一共150台机器,分别往电信.网通.移动各放50台,这样无论在哪个网络访问都很快.其次按照地域,比如国内国外,北方南方,这样地域性访问解决了. 负载均 ...
- MySQL运维(二)MySQL分库分表概念及实战、读取分离详解
MySQL运维(二)MySQL分库分表详解.读取分离详解 1.MySQL分库分表相关概念 1.1 分库分表概念 1.1.1 分库的原因 分库:就是一个数据库分成多个数据库,部署到不同机器. 如果业务量 ...
- 最全的MySQL分库分表方案总结
" 面试中我们经常会碰到的关于分库分表的问题!今天就给大家介绍互联网公司常用 MySQL 分库分表方案!希望对大家的面试有所帮助! 数据库瓶颈 不管是 IO 瓶颈,还是 CPU 瓶颈,最终都 ...
- MySQL分库分表和优化
第九阶段模块三 分库分表技术之MyCat 1.海量存储问题 1.1 背景描述 随着互联网的发展,数据的量级也是成指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无 ...
- 利用RadonDB实现MySQL分库分表
利用RadonDB实现MySQL分库分表 RadonDB是青云上提供的MySQL分布式解决方案,提供数据库的透明拆分及高可用服务.RadonDB包括Radon, Xenon, MySQL三部分安装.其 ...
- 技术解析|Doris Connector 结合 Flink CDC 实现 MySQL 分库分表 Exactly Once精准接入
本篇文档将演示如何使用 Apache Doris Flink Connector 结合 Flink CDC 以及 Doris Stream Load 的两阶段提交,实现 MySQL 数据库分库分表实时 ...
- Doris Connector 结合 Flink CDC 实现 MySQL 分库分表 Exactly Once精准接入
导读:本篇文档将演示如何使用 Apache Doris Flink Connector 结合 Flink CDC 以及 Doris Stream Load 的两阶段提交,实现 MySQL 数据库分库分 ...
- mysql分库分表(一)
参考: https://blog.csdn.net/xlgen157387/article/details/53976153 https://blog.csdn.net/clevercode/arti ...
最新文章
- matlab画复变函数,科学网—复数复变函数的Matlab计算与绘图 - 周铁戈的博文
- linux直接控制IO叫,Linux IO控制命令生成
- 【C++快读快输详解(快速读入数字,快速输出数字)】
- 从一段代码的汇编看计算机的工作原理
- 免费报名 | 智源论坛:智能处理器探索,AI技术前沿精粹尽览
- [TCP/IP] TCP如何实现流量控制和拥塞控制
- 利用linux的df和du命令查看文件和目录的内存占用
- java canvas 缩放图片_详解如何用HTML5 Canvas API控制图片的缩放变换
- Eclipse环境下面的配置(转载)
- bgp属性分析--ORIGIN
- java企业级开发规范_“华为云企业级Java编程规范”学习笔记
- mysql建考勤信息代码_C++嵌入式SQL写考勤/点名功能程序
- ps图像放大后变清晰和文字模糊变清晰
- 一篇小文入门 Python
- 运用Share.js插件在网页上添加一键分享到微博、微信等
- JAVA 环境安装包 JDK 64位 jdk-8u221-windows-x64.exe
- Mac-如何在任意文件夹下打开终端
- 解决:联想电脑开机壁纸图片在哪可以找到?
- VIN码校验器:用于检查车架号是否符合国标
- 我不知道如何使用这台计算机用英语怎么说,我不知道英文