MySQL分区表管理命令汇总
前言:
分区是一种表的设计模式,正确的分区可以极大地提升数据库的查询效率,完成更高质量的SQL编程。但是如果错误地使用分区,那么分区可能带来毁灭性的的结果。
分区功能并不是在存储引擎层完成的,因此不只有InnoDB存储引擎支持分区,常见的存储引擎MyISAM、NDB等都支持分区。但是并不是所有的存储引擎都支持,如CSV、FEDORATED、MERGE等就不支持分区。在使用此分区功能前,应该对选择的存储引擎对分区的支持有所了解。
MySQL数据库在5.1版本时添加了对分区的支持,分区的过程是将一个表或索引分解为多个更小、更可管理的部分。就访问数据库的应用而言,从逻辑上讲,只有一个表或一个索引,但是在物理上这个表或索引可能由数十个物理分区组成。每个分区都是独立的对象,可以独自处理,也可以作为一个更大对象的一部分进行处理。
MySQL数据库支持的分区类型为水平分区(指将同一个表中不同行的记录分配到不同的物理文件中),并不支持垂直分区(指将同一表中不同列的记录分配到不同的物理文件中)。此外,MySQL数据库的分区是局部分区索引,一个分区中既存放了数据又存放了索引。而全局分区是指,数据存放在各个分区中,但是所有数据的索引放在一个对象中。目前,MySQL数据库还不支持全局分区,接下来我们一起来看看分区表的管理吧!
一、ANALYZE和CHECK PARTITION 分析和检查分区
ANALYZE分析分区:
ALTER TABLE t_test_task_result ANALYZE PARTITION p20220218,p20220219; +------------------------------------------+---------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------------------------------------+---------+----------+----------+ | testdb.t_test_task_result | analyze | status | OK | +------------------------------------------+---------+----------+----------+ 1 row in set (0.01 sec)
CHECK 检查分区是否存在错误:
ALTER TABLE t_test_task_result check PARTITION p20220218,p20220219; +------------------------------------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------------------------------------+-------+----------+----------+ | testdb.t_test_task_result | check | status | OK | +------------------------------------------+-------+----------+----------+ 1 row in set (0.03 sec)
二、REPAIR 修复分区
ALTER TABLE t_test_task_result repair PARTITION p20220218,p20220219; +------------------------------------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------------------------------------+--------+----------+----------+ | testdb.t_test_task_result | repair | status | OK | +------------------------------------------+--------+----------+----------+
三、OPTIMIZE 分区
该命令主要是用于回收空闲空间和分区的碎片整理。对分区执行该命令,相当于依次对分区执行 CHECK PARTITION, ANALYZE PARTITION,REPAIR PARTITION命令。
会锁表:
ALTER TABLE t_test_task_result OPTIMIZE PARTITION p20220218,p20220219; +------------------------------------------+----------+----------+---------------------------------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +------------------------------------------+----------+----------+---------------------------------------------------------------------------------------------+ | testdb.t_test_task_result | optimize | note | Table does not support optimize on partitions. All partitions will be rebuilt and analyzed. | | testdb.t_test_task_result | optimize | status | OK | +------------------------------------------+----------+----------+---------------------------------------------------------------------------------------------+ 2 rows in set (1 min 35.75 sec)
四、REBUILD分区
重建分区,它相当于先删除分区中的数据,然后重新插入。这个主要是用于分区的碎片整理。这个操作会操作锁表
ALTER TABLE t_test_task_result REBUILD PARTITION p20220218,p20220219; Query OK, 0 rows affected (0.16 sec) Records: 0 Duplicates: 0 Warnings: 0 ALTER TABLE t_test_task_result REBUILD PARTITION p20220225,p20220226,p20220227,p20220228; Query OK, 0 rows affected (2 min 9.38 sec) Records: 0 Duplicates: 0 Warnings: 0
五、新增和删除分区
添加分区测试: ADD PARTITION(新增分区)
ALTER TABLE t_test_task_result ADD PARTITION (PARTITION p20220401 VALUES LESS THAN (TO_DAYS('2022-04-01'))); ALTER TABLE t_test_task_result ADD PARTITION (PARTITION p20220401 VALUES LESS THAN (TO_DAYS('2022-04-01'))); Query OK, 0 rows affected (0.07 sec) Records: 0 Duplicates: 0 Warnings: 0
删除分区测试:DROP PARTITION(删除分区)
ALTER TABLE t_test_task_result DROP PARTITION p20220218; ##提示删除分区是物理删除,操作非常快 ALTER TABLE t_test_task_result DROP PARTITION p20220218; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0 root@testdb 15:02: [testdb]> ALTER TABLE t_test_task_result DROP PARTITION p20220219,p20220220; Query OK, 0 rows affected (0.04 sec) Records: 0 Duplicates: 0 Warnings: 0