MySql分区、分表和分库( 三 )

  • DATA DIRECTORY表示数据的物理文件的存放目录
  • INDEX DIRECTORY表示索引的物理文件的存放目录
分区的管理MySQL提供了许多修改分区表的方式 。添加、删除、重新定义、合并或拆分已经存在的分区是可能的 。
所有这些操作都可以通过使用ALTER TABLE命令的分区扩展来实现 。
新增分区为已创建的未分区表创建分区:
  • RANGE:ALTER TABLE tb PARTITION BY RANGE (expr) ( range_partitions_exprs(n>0) );
  • LIST:ALTER TABLE tb PARTITION BY LIST (expr) ( list_partitions_exprs(n>0) );
  • HASH:ALTER TABLE tb PARTITION BY HASH(expr) PARTITIONS 2;
  • KEY:ALTER TABLE tb PARTITION BY KEY(expr) PARTITIONS 2;
为分区表添加n个分区:
  • RANGE:ALTER TABLE tb ADD PARTITION ( range_partitions_exprs(n>0) );
  • LIST:ALTER TABLE tb ADD PARTITION ( list_partitions_exprs(n>0) );
  • HASH & KEY:ALTER TABLE tb ADD PARTITION PARTITIONS n;
调整分区reorganize
数据不丢失的前提下 , 将m个分区合并为n个分区(m>n) , 即减量重新组织分区
  • RANGE:ALTER TABLE tb REORGANIZE PARTITION s0,s1,... INTO ( range_partitions_exprs(n) )
  • LIST:ALTER TABLE tb REORGANIZE PARTITION s0,s1,... INTO ( list_partitions_exprs(n) )
  • HASH & KEY:ALTER TABLE clients COALESCE PARTITION n; (n小于原有分区数)
数据不丢失的前提下 , 将分区表的m个分区拆分为n个分区(m<n) , 即增量重新组织分区
  • RANGE:ALTER TABLE tb REORGANIZE PARTITION p0,p1,... INTO ( range_partitions_exprs(n) )
  • LIST:ALTER TABLE tb REORGANIZE PARTITION p0,p1,... INTO ( list_partitions_exprs(n) )
不能使用REORGANIZE PARTITION来改变表的分区类型;也就是说 。
重建分区 , 即先删除分区中的所有记录 , 然后重新插入 。可用于整理分区碎片 。
  • ALTER TABLE tb REBUILD PARTITION p0, p1;
优化分区 , 整理分区碎片 optimize
  • ALTER TABLE tb OPTIMIZE PARTITION p0, p1;
如从分区中删除了大量的行 , 或者对一个带有可变长度字段(VARCHAR、BLOB、TEXT类型)的行作了许多修改 , 可以使用优化分区来收回没有使用的空间 , 并整理分区数据文件的碎片 。
修复分区 , 修补被破坏的分区 。
  • ALTER TABLE tb REPAIR PARTITION p0,p1;
检查分区 , 这个命令可以告诉你分区中的数据或索引是否已经被破坏 , 如果被破坏 , 请使用修复分区来修补
  • ALTER TABLE tb CHECK PARTITION p1;
删除分区删除一个分区 , 以及分区内的所有数据:
  • ALTER TABLE tb DROP PARTITION p2;
删除一个分区 , 但保留分区内的所有数据(MySQL 5.5引入): truncate
  • ALTER TABLE tb TRUNCATE PARTITION p2;
查看分区查看某个schema下某个表的分区信息
  • SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = 'xxx' AND TABLE_NAME LIKE 'xxxx';
分析某个分区,主要看行数和名称以及状态
  • ALTER TABLE tb ANALYZE PARTITION p3;
分表分表顾名思义 , 就是把一张超大的数据表 , 拆分为多个较小的表 , 得到有效的缓解 。
超大表会带来如下的影响:
  1. 单表数据量太大 , 会被频繁读写 , 加锁操作密集 , 导致性能降低 。
  2. 单表数据量太大 , 对应的索引也会很大 , 查询效率降低 , 增删操作的性能也会降低 。
分表和分区看起来十分类似 , 确实 , 分区已经能够在磁盘层面将一张表拆分成多个文件了 , 理论上前面提到的大表的问题都能得到有效解决 。因为分区就是分表的数据库实现版本 。
在MySQL 5.1分区功能出现以前 , 要想解决超大表问题 , 只能采用分表操作 , 因为这类问题十分常见 , MySQL才自带了一个分区功能 , 以达到相同的效果 。
所以你可以直接说分区就是分表的替代 , 分表是分区出现以前的做法 。不过这不代表我们就没有必要学习分表了 , 相反 , 水平分表的功能或许可以用更加便捷的分区来替代 , 但是垂直分表的功能 , 分区却无法替代 。


推荐阅读