千万量级的数据,用 MySQL 要怎么存?

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

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

  1. myisam_data_pointer_size,MySQL 的 myisam_data_pointer_size 一般默认是 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. MySQL 官方文档

关注公众号【江南一点雨】,专注于 Spring Boot+微服务以及前后端分离等全栈技术,定期视频教程分享,关注后回复 Java ,领取松哥为你精心准备的 Java 干货!

北冥有 Data,其名为鲲,鲲之大,一个 MySQL 放不下!的更多相关文章

  1. 17.1.1.6 Creating a Data Snapshot Using Raw Data Files 创建一个数据快照使用 Raw Data Files

    17.1.1.6 Creating a Data Snapshot Using Raw Data Files 创建一个数据快照使用 Raw Data Files 如果数据库是大的, 复制raw 数据文 ...

  2. Windows下一个MySQL有些错误的解决方法

    1.无论是什么提示.我们有一个直接看错误日志.由于它描述了最具体描述错误日志. 于MySQL安装文件夹中找到 my.ini简介 看日志保存路径 2. 我的错误是[ERROR] Fatal error: ...

  3. (转)一个MySQL 5.7 分区表性能下降的案例分析

    一个MySQL 5.7 分区表性能下降的案例分析 原文:http://www.talkwithtrend.com/Article/216803 前言 希望通过本文,使MySQL5.7.18的使用者知晓 ...

  4. mysqlslap 一个MySQL数据库压力测试工具

    在Xen/KVM虚拟化中,一般来说CPU.内存.网络I/O的虚拟化效率都非常高了,而磁盘I/O虚拟化效率较低,从而磁盘可能会是瓶颈.一般来说,数据库对磁盘I/O要求比较高的应用,可以衡量一下在客户机中 ...

  5. xtrabackup备份方式搭建一个mysql slave

    以前mysql搭建新备库都是在现在业务较小的备库上停止同步或停止数据库,然后拷贝数据库到新备库,配置好新备库后,再开启同步或数据库.然而,这次没有空闲备库用来搭新备库.需要从一个业务繁忙的数据库中搭建 ...

  6. 分享一个MySQL分库分表备份脚本(原)

    分享一个MySQL分库备份脚本(原) 开发思路: 1.路径:规定备份到什么位置,把路径(先判断是否存在,不存在创建一个目录)先定义好,我的路径:/mysql/backup,每个备份用压缩提升效率,带上 ...

  7. 从偶然的机会发现一个mysql特性到wooyun waf绕过题

    从偶然的机会发现一个mysql特性到wooyun waf绕过题 MayIKissYou | 2015-06-19 12:00 最近在测试的时候,偶然的机会发现了一个mysql的特性, 为啥是偶然的机会 ...

  8. 如何通过命令行创建和设置一个MySQL用户

    我想要在MySQL服务器上创建一个新的用户帐号,并且赋予他适当的权限和资源限制.如何通过命令行的方式来创建并且设置一个MySQL用户呢? 要访问一个MySQL服务器,你需要使用一个用户帐号登录其中方可 ...

  9. 记录一个mysql连接慢的问题

    问题现象是这样的: 我在一台机器上(61.183.23.23)启动了一个mysql,然后开通一个账号可以从127.0.0.1或者从61.183.23.23访问.但是遇到一个问题就是使用下面两个命令行访 ...

随机推荐

  1. 48、android代码架构总结

    之前是按功能模块进行分类,现在随着功能模块越来越多,代码层次不再清晰,所以修改了工程结构: 之前: 经过修改现在: 1.更严谨的遵循mvc架构 bean目录存放的是数据模型 ui存储的是activit ...

  2. 【SDOI2009】HH的项链 线段树

    题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链变得越来越长. ...

  3. s debug

    value stack contents   ognl 值栈 stack context           action上下文 action上下文是一个map对象,通过#key获得对象内容,在#re ...

  4. [Gym101138G][容斥原理]LCM-er

    [Gym101138G][容斥原理]LCM-er 题意描述 给定\(n,a,b,x\)四个数字,需要计数满足如下条件序列的个数(答案对\(10^9+7\)取模),条件如下. \[ {a \le A_1 ...

  5. BZOJ 1855: [Scoi2010]股票交易(DP+单调队列)

    1855: [Scoi2010]股票交易 Description 最近lxhgww又迷上了投资股票,通过一段时间的观察和学习,他总结出了股票行情的一些规律. 通过一段时间的观察,lxhgww预测到了未 ...

  6. 【bzoj2280】[Poi2011]Plot 二分+倍增+二分+最小圆覆盖

    题目描述 给出一系列点p_1, p_2, ... , p_n,将其分成不多余m个连续的段,第i段内求一个点q_i,使得q_i到这段内点的距离的最大值的最大值最小 输入 第一行,n m下面n行,每行两个 ...

  7. 【Luogu】P4159迷路(矩阵优化)

    题目链接 将每个点拆成时刻1~9,然后根据题目要求连边,比如i-j有一条权为x的边就从点i-x向点j-1连一条边,表示经过x次之后可以到达. 然后就矩阵快速幂乱搞就好了. #include<cs ...

  8. mysql数据库无法插入中文字符

    分析原因:这是因为之前修改了数据库的编码,但数据表的编码却没有跟着改变导致的. 安装mysql 时,使用的是latin编码(随后修改为utf8).建的数据表是在latin编码下建立的.而jsp页面使用 ...

  9. 普通平衡树(指针splay)

    最早的板子,学自Ez大佬: #include<cstdio> #include<cstdlib> using namespace std; class Splay{ publi ...

  10. BZOJ 4460 [Jsoi2013]广告计划 ——Bitset 后缀自动机

    发现n比较小,直接枚举答案,然后发现连续的一段是确定的,然后我们只需要判断每个位置是否有这个连续的一段就好了 发现起点不同,最后的位置可能会有差距,所以DP一下就好了 然后用0表示未折返,1表示从最下 ...