02-分区概述
分区有利于管理非常大的表,它采用了“分而治之”的逻辑,分区引入了分区键(partition key)的概念,分区键用于根据某个区间值(或者范围值)、特定值列表或者HASH函数值执行数据的聚集,让数据根据规则分布在不同的分区中,让一个大对象变成一些小对象。
可以通过使用SHOW VARIABLES命令来确定当前的MySQL是否支持分区,例如:
mysql> SHOW VARIABLES LIKE '%partition%';
+-----------------------+-------+
| Variable_name| Value |
+-----------------------+-------+
| have_partition_engine | YES |
+-----------------------+-------+
1 row in set (0.00 sec)
在如上列出的 SHOW VARIABLES 命令所产生的输出信息中,如果没有看到变量have_partition_engine的值为YES,那么MySQL的版本就不支持分区。
注意:使用 SHOW ENGINES 命令的输出信息中,不会显示任何有关分区支持的信息,必须使用SHOW VARIABLES来判断当前版本是否支持分区。SHOW PLUGINS命令的输出信息中能够检查到当前版本是否安装了分区插件。
MySQL支持使用大部分存储引擎(比如MyISAM、InnoDB、Memory等存储引擎)创建分区表;MySQL不支持使用MERGE或CSV存储引擎来创建分区表,更多的内容可以参考MySQL最新的官方文档。在MySQL 5.1版本中,同一个分区表的所有分区必须使用同一个存储引擎;即同一个表上,不能对一个分区使用MyISAM引擎,对另一个分区使用InnoDB;但是,可以在同一个MySQL服务器中,甚至同一个数据库中,对于不同的分区表使用不同的存储引擎。
和非分区表设置存储引擎一样,分区表设置存储引擎,只能用[STORAGE]ENGINE子句。[STORAGE]ENGINE子句必须列在CREATE TABLE语句中的其他任何分区选项之前。例如,下面的例子创建了一个使用InnoDB引擎并有6个HASH分区的表:
mysql> CREATE TABLE emp (empid INT, salary DECIMAL(7,2), birth_date DATE)
->ENGINE=INNODB
-> PARTITION BY HASH( MONTH(birth_date) )
-> PARTITIONS 6;
Query OK, 0 rows affected (0.11 sec)
注意:MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区;反过来也是一样的,不能只对索引分区而不对表分区,同时也不能只对表的一部分数据进行分区。MySQL的分区表上创建的索引一定是本地LOCAL索引。