暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL DBA的自我修养(二十四)

记忆乘凉 2017-01-11
576

242:分区对 null 的处理。

不论创建何种类型的分区,如果表中存在主键或者唯一索引时,分区列必须是唯一索引的一个组成部分,因此下面创建分区的SQL语句会产生错误,唯一索引是可以允许NULL值的,并且分区列只要是唯一索引的一个组成部分,不需要整个唯一索引列都是分区列。

MySQL数据库允许对NULL值做分区,但是处理的方法与其他数据库可能完全不同,MySQL数据库的分区总是视NULL值小于任何一个非NULL值,这和处理NULL值的ORDER BY操作是一样的。

 


243:分区信息的查询。

EXPLAIN PATITIONS SQL;

SELECT    

       partition_name part,     

       partition_expression expr,     

       partition_description descr,     

       table_rows     

FROM    

       INFORMATION_SCHEMA.partitions     

WHERE    

       TABLE_SCHEMA = schema()    

        ANDTABLE_NAME='表名';

 


244:分区管理常见操作,记住语法和负载

1.   分区删除:范围分区,列表分区

ALTER TABLE 表名 DROP PARTITION 分区名;

2.   分区增加:范围分区,列表分区 //常见

ALTER TABLE 表名   

ADD PARTITION (   

ARTITION p201201 VALUES LESS THAN(to_days('2012-2-1')),   

PARTITION pmax VALUES LESS THAN MAXVALUE);

3.   分区合并:范围分区,列表分区

ALTER TABLE 表名

REORGANIZE PARTITIONp201001,p201002,p201003,

p201004,p201005,p201006,

p201007,p201008,p201009 INTO

(

PARTITION p2010Q1 VALUES LESSTHAN (201004),

PARTITION p2010Q2 VALUES LESSTHAN (201007),

PARTITION p2010Q3 VALUES LESSTHAN (201010)

);

4.   分区拆分:范围分区,列表分区 //常见

ALTER TABLE 表名REORGANIZE PARTITION p2010Q1 INTO (

PARTITION s2009 VALUES LESS THAN(201001),

PARTITION s2010 VALUES LESS THAN(201004)

);

5.   分区重排:范围分区、列表分区

 


245hash 分区合并操作,使用相对较少。

通过ALTERTABLE ... COALESCE PARTITION num来合并分区,这里的num是减去的分区数量;

通过ALTERTABLE ... ADD PARTITION PARTITIONS num来增加分区,这里是null是在原先基础上再增加的分区数量。

ALTER TABLE tblinhash COALESCE PARTITION 3;

 


246:利用分区的exchange功能,实现历史数据的归档。

MySQL5.6 ,让分区交换成了现实。只需要通过ALTER TABLE ...EXCHANGE PARTITION语句即可,也就是说,可以在短暂的时间内将某一个分区内的数据移到其他表中。

如果要对一个分区表进行备份,需要先创建一个结构一样的临时表,再将分区表数据导入,最后删除分区表数据;利用5.6的新功能exchange就可以直接新建的表与分区表做数据交换,在性能上有了很大的改进,大大的缩短了时间。

mysql> create table newtable like oldtable;

Query OK, 0 rows affected (1 min 13.84 sec)

mysql> ALTER TABLE newtable REMOVE PARTITIONING;

Query OK, 0 rows affected (16.88 sec)

Records: 0 Duplicates: 0  Warnings: 0

mysql> ALTER TABLE oldtable EXCHANGE PARTITIONViacom WITH TABLE newtable;

Query OK, 0 rows affected (0.67 sec)

 


247:分区级别进行的管理操作包括 //意义不是很大

1analyze

2truncate


248:分区消除。

explain partitions select * from employees wherestore_id=6;

1、省了一个索引,可以有效使用其他索引

2、分区消除是访问一个表相对大量数据的最有效的方式之一

主键:可以取任何数量的数据

二级索引:<5%

分区:可以取任何数量的数据

3、实现分区消除的前提是 select 或者 update 或者 delete 中的 where 条件中有分区条件

 


249:手工指定分区来避免没有实现自动分区消除,强行优化的一个手法。

SELECT * FROM employees PARTITION (p2);

 


250:一主多从结构致命弱点。

1、主库存储压力增加;

2、主库写入压力增加;

3、主库成为单点故障;

4tps 有上限;

5、单表容量有上限;

 


251:使用拆分的方式解决上述问题。

垂直拆分

拆库:将不同用途的表分拆到不同的服务器上

拆表:将一个列很多的表,分拆成两个表,经常访问的列放在一个表中,不经常访

问的列放在另外一个表中,两个表都需要有相同的主键

水平拆分

拆库/拆表(详看优化思路总结)

 


文章转载自记忆乘凉,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论