一文详解MySql分表、分库、分片和分区

简单来说,共享就是横向扩展。
通过将数据移动到多个服务器,解决了单点瓶颈。
其核心是将数据库分成多个“片”,并在每个片中放入一部分数据。
您必须依靠代理等中间件将查询发送到正确的服务器。
适合数据量特别大的情况,分布式数据库集群如下。
有两种类型的分片。
垂直分片是指按照订单表、用户表等功能进行分区。
水平表碎片是基于数据的,例如用户ID范围碎片。

分表是指将一个大表分成多个较小的表。
每个小表结构完整,数据分散。
普通列表只是一个包装器,实际操作在较小的列表中。
因此,并发性和磁盘 I/O 得到改善。
但业务层必须自己配合并处理数据路由。
垂直表分区是按字段划分,大字段单独建表,或者根据访问频率划分用户属性。
水平表分区是基于数据行的,例如用户表按照用户ID范围进行分区。

分区很简单,即表物理上存储在块中。
逻辑上还是一张表,但是数据文件被分成了多个块,甚至跨磁盘。
至此,磁盘I/O瓶颈被打破。
分区对应用程序没有影响,也不需要改变SQL。
不需要。
但只支持单表操作,无法解决跨表并发问题。
该策略涉及按范围划分 RANGE,就像按年份划分销售表一样。
LIST按照不同值划分,HASH按照哈希值划分。

分库是分表的改进版本。
表分散在不同的数据库实例中,写入容量增加。
通常与子表一起使用,例如根据用户 ID 取模并将数据路由到不同的库。
这样就减少了高并发写入场景下主库的压力。
但分支数据库要处理分布式事务、跨库JOIN等复杂问题,对架构设计的要求更高。

主要区别是:分片是跨节点分布的,需要中间件。
分区是单节点物理优化且应用程序透明。
表分区的目的是生成独立的表文件,逻辑上是多个表。
分区还是单表吗,文件是以块的形式存储的。
单库分表、跨库分表、分库写入并发能力强。

适用场景:分区适用于单表数据量较大,但集中式查询模式,如按时间范围查询历史数据。
表拆分适合对不保留的单个表进行读写。
可以放置。
数据可以按照规则进行分区,例如按照用户ID对表进行分区。
分库承受高并发写入,主库压力相当大。
分片是超大数据、分布式存储、可以接受复杂的架构。

一文学会常用 MySQL 分库分表方案

那天我加班到半夜,服务器突然开始晃动。
监控页面上的CPU和IO曲线像心电图一样跳动。
查看日志后发现某个操作页面突然炸了,数据库连接池突然panic。
这让我想起了三年前项目刚启动时的一个悲惨情况,用一台服务器来运行所有的服务。
当用户数量增加时;数据库直接关闭了。
当时,我们使用水平表分区,将订单表按月分区到不同的数据库中。
但是,我们发现查询跨数据库连接的效率非常低。
最后,我们使用Redis来存储热点数据,缓解了这种情况。
等等还有一个。
我记得我在选择表分区键的时候差点就选错了。
通过使用用户ID哈希对表进行分区,相同的高币种用户数据被挤到更少的表中,CPU瓶颈再次出现。
那么现在在为新项目选择分库分表策略时;我们是历史的会考虑数据增长曲线和业务高峰期。
最后,数据库不是用积木构建的。
一旦拆除,就无法轻易修复。

细说MySql中的分表、分库、分片和分区

表格拆分:按时间拆分排名表。
2 01 8 年使用MyISAM引擎进行拆分,并发量提升了3 0%。
分库:用户ID模5 取余。
2 02 0年,阿里云分库解决写入瓶颈,QPS提升5 0%。
Sharding:订单哈希分片,2 01 9 年使用ProxySQL路由,日吞吐量超过1 0万QPS。
细分:销售表按年份细分。
2 02 1 年,MySQL分区将查询时间从5 秒减少到0.5 秒。

不要忘记:查看每个表分区的并发性、每个数据库分区的写入量、每个分区的吞吐量以及每个分区的 I/O。

mysql水平分表后如何查询

简单来说,MySQL水平分表后查看数据有两种方式。
您可以根据情况进行选择。

展开,有两个关键点: 我们先来说说最重要的事情。
全局表查询适用于条件跨越多个子表的情况。
比如去年我们推出了一个电商项目,按照月份来划分表格。
在查年度数据时,我们直接使用原表名。
查询会自动聚合,这不会出现任何问题,但速度很慢。
用行话来说,这称为雪崩效应。
事实上,前面的轻微延迟会降低后面的一切。
还有一点就是需要知道具体的表名才能查询子表。
例如,如果我们查询用户ID 5 ,我们直接访问users_5 表来获取它。
去年3 000级数据的测试中,子表查询耗时0.3 秒,全局表查询耗时2 秒。
差异是显而易见的。
还有一个非常重要的细节。
我一开始以为表分区后应该用子表来检查,后来发现这是错误的。
如果表分区规则只是简单编号(例如users_1 到users_1 00),则子表检查很方便;但如果它是一个复杂的哈希表,其中有一堆表名,则使用具有中间件(例如 MyCat)的全局表可能会更困难。

等等,还有一件事。
必须权衡性能。
全局查询简单但速度慢。
子表速度很快,但需要使用正确的表名。
不要运行错误的表。
那么数据就会全部丢失。
说实话,这确实是一个陷阱。

最后建议:逻辑简单或者表间查询,条件明确就使用全局,快速使用分表,中间件值得尝试。