mysql 分区经验_MySQL 分区表注意事项,经验总结以及详细操作入门

本文介绍了MySQL分区表的创建,如通过`PARTITION BY RANGE (YEAR(separated))`对`employees`表进行分区。讨论了分区注意事项,如主键包含分区列、分区列不能为NULL、最大分区数限制等。还涉及了分区表的索引创建,强调主键必须包含分区列以优化查询。此外,文章详细阐述了分区的删除与新增操作,提醒读者操作时需谨慎,避免数据丢失,建议在必要时重建表来调整分区规则。
摘要由CSDN通过智能技术生成

一、创建分区表 employees

SQL 脚本如下所示。

CREATE TABLE employees (

id INT NOT NULL,

fname VARCHAR(30),

lname VARCHAR(30),

hired DATE NOT NULL DEFAULT '1970-01-01',

separated DATE NOT NULL DEFAULT '9999-12-31',

job_code INT,

store_id INT

)

PARTITION BY RANGE (YEAR(separated)) (

PARTITION p0 VALUES LESS THAN (2011),

PARTITION p1 VALUES LESS THAN (2015),

PARTITION p2 VALUES LESS THAN (2020),

PARTITION p3 VALUES LESS THAN MAXVALUE

);

分区表注意事项

MySQL分区中如果存在主键或唯一键,则分区列必须包含在其中(否则判断主键或唯一时,需要扫描所有分区)。

分区字段不能为NULL,要不然怎么确定分区范围呢,所以尽量NOT NULL。

最大分区数目不能超过1024。

不支持外键。

不支持全文索引(FULL TEXT)。

分区表带来的好处在于更新、删除以及锁处理的时间会减少,但是如果查询并非针对表分区字段进行,那么查询的时间由于查询缓存失效反而会增加,这点需要取舍。

如果想修改有规则的表分区,注意只能新增,不要随意删除,这里删除表分区会造成该表分区内部数据也一起被删除掉,千万注意。另外如果设定了MAXVALUE那么是不能新增的,虽然删除MAXVALUE那条表分区后可以新增,但是依然注意删除的MAXVALUE分区是否有数据,如果有则不能随意删除,最好的办法依然是重建一张新表,表在创建时候重新制定规则后把旧表导入新表,这样能保证不会丢失数据。

将旧的表数据导入到新表(分区表)后,看到新表的数据都分布到不同的区了。

二、在分区表上创建索引

ALTER TABLE employees ADD PRIMARY KEY (id);

f00122307ad253480479d954b66a68b0.png

A PRIMARY KEY must include all columns in the table's partitioning function。要求主机必须包含分区列。

这样的话判断主键是否唯一就可以在单个分区内部完成,否则就需要跨所有的分区。

增加分区列-separated,创建主键 PRIMARY KEY。

ALTER TABLE employees ADD PRIMARY KEY (id, separated);

查看索引状态

SHOW INDEX FROM employees;

a5589d5b4511e66ddf89017161530acd.png

分区表尽量不要建主键,因为建主键的同时会建一个唯一性的全局索引,在drop分区表时如果不指定update global indexes则会使索引失效,导致数据无法入库。

如果非要建主键,要2种方法:

1. 应用上drop 分区表时显示指定update global indexes;

2. 将主键上的索引建成本地索引;

上述2种方法虽然可以实现,但效果都不好,因为当数据量超大时维护索引也是很大的开销。

创建非分区列的索引

CREATE INDEX idx_name ON employees(fname, lname);

fbb817c201f093c71e463ed7844a481e.png

三、删除、新增分区

ALTER TABLE employees DROP PARTITION p3;

删除之前创建的分区 p3

87c77c209d6bda05bf8d38d087aa4bc3.png

下面是 p3 分区对应的条件:

PARTITION p3 VALUES LESS THAN MAXVALUE

然后插入一条记录,超出了现有分区的条件,相当于找不到分区了。

则会出现错误提示:Table has no partition for value 2020:因为分区的范围没有包含所有可能的记录的值。

92ffd8040f485d55c8726daa3cd62c60.png

下面恢复之前的 p3 分区。

新增分区

ALTER TABLE `employees` add PARTITION(PARTITION p3 VALUES LESS THAN MAXVALUE)

88edc949d7753d0183c4790d8722cdb5.png

完成新增分区之后,再次执行上面的INSERT 语句,然后查询该分区,发现记录已经成功插入。

再次新增分区 p4,发现有错误提示。

ALTER TABLE `employees` add PARTITION(PARTITION p4 VALUES LESS THAN (2021));

d13e2c042fdda46d9f94563a49f6dbbe.png

错误提示:MAXVALUE can only be used in last partition definition:MAXVALUE 只能是最后一个分区定义,无法新增分区了。只能删除MAXVALUE分区或者就只能重新分区了。

注意:删除MAXVALUE 分区需要非常谨慎,会删除该分区里面的数据记录。具体解决办法,可以参考前面的建议。

最好的办法依然是重建一张新表,表在创建时候重新制定规则后把旧表导入新表,这样能保证不会丢失数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值