分表只能通过程序代码来实现 , 目前市面上有许多分表的框架 。( Apache ShardingSphere )
分表和分区的区别
- 分区只是一张表中的数据和索引的存储位置发生改变 , 分表则是将一张表分成多张表 , 是真实的有多套表的配套文件
- 分区没法突破数据库层面 , 不论怎么分区 , 这些分区都要在一个数据库下 。而分表可以将子表分配在同一个库中 , 也可以分配在不同库中 , 突破数据库性能的限制 。
- 分区只能替代水平分表的功能 , 无法取代垂直分表的功能 。
水平分表水平分表和分区很像 , 或者说分区就是水平分表的数据库实现版本 , 它们分的都是行记录 。
文章插图
但是需要注意 , 如果这些表还是在同一个库中 , 所以库级别的数据库操作还是有IO瓶颈 。分表可以将单张表的数据切分到多个服务器上去 , 每个服务器具有相应的库与子表 , 这是分区所不能有的优势 。
水平分表的切分规则一般有如下几种:
范围切分
- 可以根据某个字段的范围做划分 , 比如订单号字段 , 从0到10000一个表 , 10001到20000一个表 。
- 可以根据某个字段的HASH取模做划分 , 比如将一个用户表分成10个子表 , 可以取用户id , 然后hash后取10的模 , 从而分配到不同的数据库上 。不过这种划分一旦确定后 , 就无法改变子表数量了 。
- 比如按照华东 , 华南 , 华北这样来区分业务表 , 或者Android/ target=_blank class=infotextkey>安卓用户 , IOS用户等来区分用户表 。
- 按照时间切分 , 比如将6个月前 , 甚至一年前的数据切出去放到另外的一张表 , 因为随着时间流逝 , 这些表的数据被查询的概率变小 , 所以没必要和“热数据”放在一起 , 这个也是“冷热数据分离” 。
垂直分表是基于列字段进行的 。一般是表中的字段较多 , 或者有数据较大长度较长(比如text , blob , varchar(1000)以上的字段)的字段时 , 我们将不常用的 , 或者数据量大的字段拆分到“扩展表”上 。这样避免查询时 , 数据量太大造成的“跨页”问题 。
垂直分表的切分规则很好理解 , 一般是“不常用”或者“字段数据量大”这两点来做切割
文章插图
分库分库同样是为了应对超大数据带来的巨大的IO需求 , 如果不拆库 , 那么单库所能支持的吞吐能力和磁盘空间 , 就会成为制衡业务发展的瓶颈 。
分库的主要目的是为突破单节点数据库服务器的I/O能力限制 , 解决数据库水平扩展性问题 。
分库作用分区和分表可以把单表分到不同的硬盘上 , 但不能分配到不同服务器上 。一台机器的性能是有限制的 , 用分库可以解决单台服务器性能不够 , 或者成本过高问题 。
将一个库分成多个库 , 并在多个服务器上部署 , 就可以突破单服务器的性能瓶颈 , 这是分库必要性的最主要原因 。
分库的类型【MySql分区、分表和分库】分库同样分为水平分库和垂直分库 。
水平分库
- 水平分库和水平分表相似 , 并且关系紧密 , 水平分库就是将单个库中的表作水平分表 , 然后将子表分别置于不同的子库当中 , 独立部署 。
- 因为库中内容的主要载体是表 , 所以水平分库和水平分表基本上如影随形 。
- 例如用户表 , 我们可以使用注册时间的范围来分表 , 将2020年注册的用户表usrtb2020部署在usrdata20中 , 2021年注册的用户表usrtb2021部署在usrdata21中 。
推荐阅读
- Brython:浏览器中的Python
- 知乎|跟进微博、抖音!知乎宣布全面上线显示用户IP属地
- MySQL的监控原理
- Java开发中的POJO、Dto、PO、Vo傻傻分不清楚?一文看懂
- SQL注入笔记记录+MySQL的事务隔离级别
- 荣耀|荣耀畅玩30入网:2.2GHz 5G芯片、4900mAh大电池
- 一些小故事大道理?小故事大、道理
- 打跑得快技巧十句口诀是什么?
- 读 MySQL 源码再看 INSERT 加锁流程
- MySQL 大批量插入,如何过滤掉重复数据?