分表
分区:把一个数据表的文件和索引分散存储在不同的物理文件中。 特点:业务层透明,无需任何修改,即使从新分表,也是在mysql层进行更改(业务层代码不动)
分表:把原来的表根据条件分成多个表,如原来的表为 user;现在分成2个小表 user_1,user_2; 特点:业务层需要修改代码。如过业务改变,可能需要从新分表,导致维护困难
当数据量达到一定级别后,需要通过 分区或分表来提高用户体验
如下知识点 为 分区
如:现在生产环境有用户表 account_user,对其按照 日期(每季度)进行分区。
表结构如下:
输入命令:show create table account_user;

由于此表有 主键和unique键,在分区时,必须要求被用来匹配分区的字段被包含在 主键,和unique键中(也就是复合主键和复合unique键);
通过如下命令进行操作把 create_time分别放在主键和unique键中(这时mobile字段不能保证唯一性,这是个大问题,需要解决)
添加unique键: ALTER TABLE account_user ADD UNIQUE KEY (mobile,create_time);
删除unique键: ALTER TABLE account_user DROP UNIQUE KEY ;
添加主键:ALTER TABLE account_user ADD PRIMARY KEY (id,create_time);
删除主键:ALTER TABLE account_user DROP PRIMARY KEY;
然后根据官网教程:

如下根据range分区进行添加:
ALTER TABLE account_user PARTITION BY RANGE (TO_DAYS(create_time)) ( PARTITION account_user_2018_01 VALUES less than (TO_DAYS('2018-01-01')), PARTITION account_user_2018_04 VALUES less than (TO_DAYS('2018-04-01')), PARTITION account_user_2018_07 VALUES less than (TO_DAYS('2018-07-01')), PARTITION account_user_2018_10 VALUES less than (TO_DAYS('2018-10-01')), PARTITION account_user_2018_more VALUES less than MAXVALUE )
然后查看 结果:

验证分区效果:
优点:根据create_time进行范围查询,会使用分区,避免全表扫描
使用分区的情况下:

只是查询了 3351行,或者说是查询了 (account_user_2018_01,account_user_2018_04,account_user_2018_07)三个分区
在没有分区的情况下:

发现进行全表扫描,行数为46808行
相关操作:
查看行数据所在分区:SELECT * FROM account_user PARTITION (account_user_2018_07) WHERE id=1;
增加分区: ALTER TABLE account_user ADD PARTITION (PARTITION account_user_2019_01 VALUES LESS THAN (TO_DAYS('2019-01-01'))); 如果对应range分区有 MAXVALUE ,要先删除,否则报错
删除分区: ALTER TABLE account_user DROP PARTITION account_user_2019_01;
删除分区数据:ALTER TABLE account_user TRUNCATE PARTITION account_user_2019_01,account_user_2019_04;
rebuild重建分区:ALTER TABLE account_user REBUILD PARTITION account_user_2019_01; #相当于drop所有记录,然后再reinsert;可以解决磁盘碎片
优化分区:ALTER TABLE account_user OPTIMIZE PARTITION account_user_2019_01

