北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下。千万量级的数据,用 MySQL 要怎么存?

初学者在看到这个问题的时候,可能首先想到的是 MySQL 一张表到底能存放多少条数据?

根据 MySQL 官方文档的介绍,MySQL 理论上限是 (232)2 条数据,然而实际操作中,往往还受限于下面两条因素:

  1. myisamdatapointersize,MySQL 的 myisamdatapointersize 一般默认是 6,即 48 位,那么对应的行数就是 248-1。

  2. 表的存储大小 256TB

那有人会说,只要我的数据大小不超过上限,数据行数也不超过上限,是不是就没有问题了?其实不尽然。

在实际项目中,一般没有哪个项目真的触发到 MySQL 数据的上限了,因为当数据量变大了之后,查询速度会慢的吓人,而一般这个时候,你的数据量离 MySQL 的理论上限还远着呢!

传统的企业应用一般数据量都不大,数据也都比较容易处理,但是在互联网项目中,上千万、上亿的数据量并不鲜见。在这种时候,还要保证数据库的操作效率,我们就不得不考虑数据库的分库分表了。

那么接下来就和大家简单聊一聊数据库分库分表的问题。

数据库切分

看这个名字就知道,就是把一个数据库切分成 N 多个数据库,然后存放在不同的数据库实例上面,这样做有两个好处:

  1. 降低单台数据库实例的负载

  2. 可以方便的实现对数据库的扩容

一般来说,数据库的切分有两种不同的切分规则:

  1. 水平切分

  2. 垂直切分

接下来我们就对这两种不同的切分规则分别进行介绍。

水平切分

先来一张简单的示意图,大家感受一下什么是水平切分:

假设我的 DB 中有 table-1、table-2 以及 table-3 三张表,水平切分就是拿着我的绝世好剑,对准黑色的线条,砍一剑或者砍 N 剑!

砍完之后,将砍掉的部分放到另外一个数据库实例中,变成下面这样:

这样,原本放在一个 DB 中的 table 现在放在两个 DB 中了,观察之后我们发现:

  1. 两个 DB 中表的个数都是完整的,就是原来 DB 中有几张表,现在还是几张。

  2. 每张表中的数据是不完整的,数据被拆分到了不同的 DB 中去了。

这就是数据库的水平切分,也可以理解为按照数据行进行切分,即按照表中某个字段的某种规则来将表数据分散到多个库之中,每个表中包含一部分数据。

这里的某种规则都包含哪些规则呢?这就涉及到数据库的分片规则问题了,这个松哥在后面的文章中也会和大家一一展开详述。这里先简单说几个常见的分片规则:

  1. 按照日期划分:不容日期的数据存放到不同的数据库中。

  2. 对 ID 取模:对表中的 ID 字段进行取模运算,根据取模结果将数据保存到不同的实例中。

  3. 使用一致性哈希算法进行切分。

详细的用法,将在后面的文章中和大家仔细说。

垂直切分

先来一张简单的示意图,大家感受一下垂直切分:

所谓的垂直切分就是拿着我的屠龙刀,对准了黑色的线条砍。砍完之后,将不同的表放到不同的数据库实例中去,变成下面这个样子:

这个时候我们发现如下几个特点:

  1. 每一个数据库实例中的表的数量都是不完整的。

  2. 每一个数据库实例中表的数据是完整的。

这就是垂直切分。一般来说,垂直切分我们可以按照业务来划分,不同业务的表放到不同的数据库实例中。

老实说,在实际项目中,数据库垂直切分并不是一件容易的事,因为表之间往往存在着复杂的跨库 JOIN 问题,那么这个时候如何取舍,就要考验架构师的水平了!

优缺点分析

通过上面的介绍,相信大家对于水平切分和垂直切分已经有所了解,优缺点其实也很明显了,松哥再来和大家总结一下。

水平切分

  • 优点

  1. 水平切分最大的优势在于数据库的扩展性好,提前选好切分规则,数据库后期可以非常方便的进行扩容。

  2. 有效提高了数据库稳定性和系统的负载能力。拆分规则抽象好, join 操作基本可以数据库做。

  • 缺点

  1. 水平切分后,分片事务一致性不容易解决。

  2. 拆分规则不易抽象,对架构师水平要求很高。

  3. 跨库 join 性能较差。

垂直切分

  • 优点

  1. 一般按照业务拆分,拆分后业务清晰,可以结合微服务一起食用。

  2. 系统之间整合或扩展相对要容易很多。

  3. 数据维护相对简单。

  • 缺点

  1. 最大的问题在于存在单库性能瓶颈,数据表扩展不易。

  2. 跨库 join 不易。

  3. 事务处理复杂。

结语

虽然 MySQL 中数据存储的理论上限比较高,但是在实际开发中我们不会等到数据存不下的时候才去考虑分库分表问题,因为在那之前,你就会明显的感觉到数据库的各项性能在下降,就要开始考虑分库分表了。

好了,今天主要是向大家介绍一点概念性的东西,算是我们分布式数据库中间件正式出场前的一点铺垫。


扩展阅读


  1. 10分钟搞懂:亿级用户的分布式数据存储解决方案!

  2. 2019年8月数据库流行度排行:双星闪耀 MySQL 成月度最大赢家

  3. 从400+节点ElasticSearch集群的运维中,我们总结了这些经验

  4. 两万字的数据库面试题,不看绝对后悔

  5. Oracle数据库应用系统结构

  6. 慌的一批!妹子一个rm -rf把公司服务器数据删没了...


数据和云

ID:OraNews

如有收获,请划至底部,点击“在看”,谢谢!


公司简介  | 招聘 | DTCC | 数据技术嘉年华 | 免费课程 | 入驻华为严选商城

zCloud | SQM | Bethune Pro2 | zData一体机 | MyData一体机 | ZDBM 备份一体机

Oracle技术架构 | 免费课程 | 数据库排行榜 | DBASK问题集萃 | 技术通讯

升级迁移 | 性能优化 | 智能整合 | 安全保障 |  架构设计 | SQL审核 | 分布式架构 | 高可用容灾 | 运维代维

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下!相关推荐

  1. mysql.data.dll win10_【MySQL】Windows10下安装

    2.配置环境变量 变量名:MYSQL_HOME 变量值:download_path\mysql-8.0.19-winx64 path添加:%MYSQL_HOME%\bin; 3.生成data文件 管理 ...

  2. 服务器断电数据库文件好几个,一个服务器放多个数据库好么

    一个服务器放多个数据库好么 内容精选 换一换 删除现有的一个数据服务器.只有server的owner才可以删除.IF EXISTS如果指定的数据服务器不存在,则发出一个notice而不是抛出一个错误. ...

  3. mysql.data.dll win10_关于Linux和Windows下部署mysql.data.dll的注册问题》

    为了学习ORM,选择了EntityFramework,经历了三天两夜的煎熬,N多次错误,在群里高手的帮助下,终于成功,现在将我的心路历程记录下来,一是让自己有个记录,另外就是让其它人少走些弯路. 我的 ...

  4. mysql第三章关系模型_一个MySQL关系模型只有三个关系(二维表)组成。_学小易找答案...

    [判断题]DELETE语句功能是对表中所有记录或满足条件的记录进行批量删除. [填空题]The computer's entire ____ was on a single board. [单选题]下 ...

  5. mysql 监控语句_做一个mysql监控系统应该掌握的一些基本语句

    很多系统需要一个MYSQL的监控,查看MYSQL的一些变量配置,吞吐量,连接数,QPS, TPS,慢查询等.当然有一些开源的工具可以满足这些需求,如果是要自己做呢.下面归纳了一些常用监控的SQL语句, ...

  6. python跟php如何共用mysql_Python 3 多个函数共用一个mysql连接

    1.本人刚接触Python,环境用的是Python3,使用pymysql模块连接数据库.为了节省资源,我是打算在一个python脚本中的各个函数里共用一个mysql连接, 2.代码如下所示: # co ...

  7. mysql安装在opt_一、编译安装第一个MySQL 5.1.33cd /opt/usr/sbin/groupadd mysql/usr/sbin/useradd -g...

    一.编译安装第一个MySQL 5.1.33 cd /opt /usr/sbin/groupadd mysql /usr/sbin/useradd -g mysql mysql -s /bin/nolo ...

  8. activiti7关联mysql_学习笔记:一个MySQL实例有多个Activiti数据库问题

    学习笔记:一个MySQL实例有多个Activiti数据库问题 使用SpringBoot + activiti6 搭建审批流项目,数据库使用的是MySQL.且我的数据库下存在多个activiti相关的数 ...

  9. vue组件中的data为什么是一个函数

    一.总结 1.vue中组件是用来复用的,为了防止data复用,将其定义为函数. 2.vue组件中的data数据都应该是相互隔离,互不影响的,组件每复用一次,data数据就应该被复制一次,之后,当某一处 ...

最新文章

  1. Git 高级用法,喜欢就拿去用!
  2. python3调用adb命令_如何使用Python执行adb命令?
  3. code换取微信openid_微信授权登录开发的两种方式
  4. HTML坐标不随着屏幕大小改变,HTML热区map坐标,随窗口大小自适应办法(javascript)...
  5. Java并行编程中的“可调用”与“可运行”任务
  6. python将数据写入excel_【Python】将数据库中的数据查询出来自动写入excel文档
  7. maven安装与创建多模块项目【转】
  8. koa 接口返回数据_koa+node基础搭建到实现api接口
  9. Photoshop隐藏的4个彩蛋
  10. python机器人开发学校,机器人Python青少年编程开发实例
  11. 解决Flex4 发布后访问 初始化极其缓慢的问题
  12. 遗传算法与TSP问题
  13. 恒生电子:目前公司及控股子公司均未研发、销售任何配资软件
  14. 系统管理服务器名,服务器管理系统排名
  15. Android TalkingData集成 注意事项
  16. Python学习 - 列表
  17. 业务运营支撑系统  BOSS(Business Operation Support System)。
  18. DRF框架及APIView
  19. Matlab:绘制透反射光波的幅度与相位随入射角的变化
  20. 如何举报可疑的Android应用

热门文章

  1. sysadmin默认密码_Sysadmin工具,Kconfig / kbuild的秘密,11个KDE应用程序,tcpdump,Laverna,Python等
  2. 2017 开源软件排行_2017年面向设计师和艺术家的顶级开源解决方案
  3. 基础 | 零散的MySql基础记不住,看这一篇就够啦
  4. Markdown完整语法说明
  5. Bootstrap创建拼接式按钮下拉菜单
  6. verp之增加接近传感器(proximity sensor)
  7. 在ROS-melodic中安装map_server、gmapping 等功能包
  8. 电子计算机的应用是第四次信息技术革命,造纸术和印刷术的发明和应用第四次电报.PPT...
  9. linux安装qq_体验一下,看看 Linux 系统中的 QQ 是什么样子的
  10. LuoguP1131 [ZJOI2007]时态同步