MYSP数据库优化(三)--分区

 分表

分区:把一个数据表的文件和索引分散存储在不同的物理文件中。 特点:业务层透明,无需任何修改,即使从新分表,也是在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

关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信