mysql数据库 | 分表和分区
发布日期:2022-02-21 17:40:21 浏览次数:40 分类:技术文章

本文共 1034 字,大约阅读时间需要 3 分钟。

分区和分表

1. 为什么要分区和分表?

当我们遇到海量数据存储在数据库中的某张表,此时单个表承受的压力是巨大的。

这不但会导致查询变慢,而且由于表的锁机制导致更新修改删除等操作也会受到严重影响(即使是行级锁也会有影响),因此便出现了数据库性能瓶颈。

2. 分表

分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个表都对应三个文件: MYD 数据文件,.MYI 索引文件,.frm 表结构文件。这些表可以分布在同一块磁盘上,也可以在不同的机器上。在应用访问数据库读写的时候根据事先定义好的规则得到对应的表名,然后去操作它。

将单个数据库表进行拆分,拆分成多个数据表,然后用户访问的时候,根据一定的算法(如用 hash 的方式,也可以用求余(取模)的方式),让用户访问不同的表,这样数据分散到多个数据表中,减少了单个数据表的访问压力。单表的并发能力提高了,磁盘I/O性能也提高了,提升了数据库访问性能。分表的目的就在于此,减小数据库的负担,缩短查询时间。


分表也分为了两种分表方式,分别为垂直切分和水平切分:

3.1 水平分表

通常情况下,我们使用 hash、取模等方式来进行表的拆分。

例如 : 当应用的用户量非常巨大,有一张100w的用户表,我们可以将它分成4张独立的一模一样的独立子表,每张表25w,然后我们通过一定的规则(例如hash、取模等)进行随机访问这三张表,这样就将一张表的压力分担到了三张表中,就类似于集群的处理方式。
(注意:此处的4张独立子表和原表是一模一样的,包括数据结构一样)

3.2 垂直分表

垂直拆分更多时候就应该在数据表设计之初就执行的步骤,垂直切分是指数据表列的拆分,把一张列比较多的表拆分为多张表。

通常,我们按以下原则进行垂直拆分:

  1. 把不常用的字段单独放在一张表;
  2. 把 text,blob(binary large object,二进制大对象)等大字段拆分出来放在附表中;
  3. 经常组合查询的列放在一张表中;

3. 分区

分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,分区后,表还是一张表,但数据分散到各个分散的位置了

但是分区通常比较不建议使用,因为在mysql规范中写到对分区表的缺点:分区表对分区键有严格要求;分区表在表变大后,执行DDL、SHARDING、单表恢复等都变得更加困难。因此禁止使用分区表,并建议业务端手动SHARDING。

转载地址:https://blog.csdn.net/weixin_40597409/article/details/115366221 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:mysql数据库 | 事务与隔离级别
下一篇:mysql数据库 | 存储过程

发表评论

最新留言

感谢大佬
[***.8.128.20]2024年03月03日 13时53分15秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

dtc mysql_DTCC归来-高可用可扩展数据库架构探讨 2019-04-21
java怎样将日期本土化_Java中的日期操作 2019-04-21
java生产者消费者模型到精通_java生产者消费者模型 2019-04-21
java 执行 awk_3.1 biostar lesson3 linux学习日记;java版本;awk 2019-04-21
java二叉树求权值_百度笔试题目:二叉树路径权值和【转】 2019-04-21
欧亚马 java折叠车_如何选择欧亚马折叠车? 2019-04-21
python函数代码块以什么开头_Python初体验-开篇 代码全析 2019-04-21
java闹钟程序设计_JAVA课程设计_闹钟的设计与实现项目-报告_附源代码.doc 2019-04-21
java中的无效的列类型_java.sql.SQLException: 无效的列类型: 1111 2019-04-21
php rewrite url_PHP_URL Rewrite的设置方法,URL Rewrite需要服务器的支持! - phpStudy 2019-04-21
php读取大文件某行内容,PHP读取和修改大文件的某行内容_PHP教程 2019-04-21
打印php错误日志,php怎样打印错误日志 2019-04-21
Calendar导入java,Java程序使用Calendar.add()方法将分钟添加到当前时间 2019-04-21
mysql中用户线程作用,mysql用户线程的建立与用户线程的状态源码解析 2019-04-21
php页面引用公共文件,WeiPHP插件模板中快速引入公共模板文件 2019-04-21
php tracy,admin.php 2019-04-21
php访问父类的所有属性,php – 在父类中使用$this仅在子类中显示父类属性 2019-04-21
oracle比较强大的函数,SQL和ORACLE函数比较 2019-04-21
oracle12c order by,oracle 数据库中order by 的一些高级用法 2019-04-21
oracle8i substr,Oracle中的INSTR,NVL和SUBSTR函数的用法详解 2019-04-21