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. 分区重排:范围分区、列表分区
245:hash 分区合并操作,使用相对较少。
通过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:分区级别进行的管理操作包括 //意义不是很大
1、analyze
2、truncate
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、主库成为单点故障;
4、tps 有上限;
5、单表容量有上限;
251:使用拆分的方式解决上述问题。
垂直拆分
拆库:将不同用途的表分拆到不同的服务器上
拆表:将一个列很多的表,分拆成两个表,经常访问的列放在一个表中,不经常访
问的列放在另外一个表中,两个表都需要有相同的主键
水平拆分
拆库/拆表(详看优化思路总结)