分区表

只说用法,不同版本之间的锁都有区别
  1. 不同版本的性能优化(5.7,8)
  1. 不同的事务隔离级别
 
notion image

注意事项

RANGE分区【基于属于一个给定连续区间的列值,把多行分配给分区】。
主键中一定要包含分区字段,id一般是默认主键,当用某个字段做分区处理时【以下示例中使用create_time】,设置的主键中要包含做分区的字段。
注:查询时一定要包含分区字段,否则有慢sql的风险
 

创建一个新表

在进行表分区之前,首先需要创建一个新表。可以使用CREATE TABLE语句来创建表,并在其中指定要分区的列和分区规则。
在上面的示例中,我们创建了一个名为sales的表,并按照sale_date列的年份进行分区。总共创建了4个分区,分别是2019年之前、2019年、2020年和2021年。

步骤2:添加分区

在创建表之后,可以使用ALTER TABLE语句来添加更多的分区。可以根据需要随时增加或删除分区。
在上面的示例中,我们向sales表中添加了一个新的分区,该分区包含2022年以后的数据。

步骤3:确认分区是否生效

在添加分区后,可以使用SHOW CREATE TABLE语句来查看表的定义和分区情况。这样可以确认分区是否成功创建。
下面是一个示例代码:
运行上述代码后,将会显示包含表定义和分区信息的结果。

表分区对表的锁定情况

对于Mysql的表分区操作,一般情况下不会锁定整个表。具体情况取决于分区的类型和操作类型。
  • 对于RANGE和LIST分区类型,添加或删除分区不会锁定整个表。只会锁定涉及到的分区和相关索引。
  • 对于HASH和KEY分区类型,添加或删除分区可能会锁定整个表。这是因为HASH和KEY分区类型对数据进行重新分布,并可能涉及到表的重建。
在实际使用中,我们可以根据表的大小和操作的复杂性来评估分区操作的风险。如果表的数据量很大,而且需要频繁地进行分区操作,可能需要考虑其他解决方案来避免对表的锁定。

自动化

可以借助定时任务或者 mysql
或者是 dms 等云厂商数据库管理工具

变更方式

直接修改

使用ALTER TABLE来进行更改表为分区表,这个操作会创建一个分区表,然后自动进行数据copy然后删除原表
消耗大会锁表,资源足够用无锁变更好一些

新建

需要停机,对原有表进行迁移
不中断迁移会比较费劲
导出数据
修改表名,导入数据(10分钟就导入完了,200w, 8g多一点数据),测试下ok,删除原来的表。

参考

Loading...
目录
文章列表
王小扬博客
产品
Think
Git
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP