分区表
只说用法,不同版本之间的锁都有区别
- 不同版本的性能优化(5.7,8)
- 不同的事务隔离级别
注意事项
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...