mysql分区介绍(partition)

mysql分区介绍(partition)

一、分区并不是SQL标准的一部分

二、通过分区可以使一个表的不同部分根据我们设置的规则存储到不同的文件系统上。实际上一个表的不同部分做为表的形式被存储到不同位置。

三、用户选择规则来分割数据,在这些数据看来规则做为一种分区函数,而分区函数在MYSQL中是一个“系数”,它简单的匹配一组范围或值的列表、内部哈希函数、或一个线性哈希函数。被选择的函数根据分区类型由用户指定,它使用的参数值由用户提供一个表达式。这个表达式可以是一列值、一个作用在一列或多列上的函数、或是一列或几列的值,这一依赖于使用的分区类型。

四、在range、list和[linear] hash分区的例子中,分区列的值被传到分区函数中,函数返回一个整数值,这个整数值用来描述数据应该被存到哪个特定的分区中。这个函数必须是非连续的、非随机的。它不可以包函任何查询,但是可以使用MYSQL中有效的SQL表达式,只要表达式返回NULL或整数。返回的整数应该在-MAXVALUE到MAXVALUE之间。

对于[linear] key, range columns,list columns分区,分区表达式由一列或多列组成。对于[linear] key类型, 分区函数是由MYSQL提供。

五、水平分区——一个表中的不同行可以被存贮到不同的物理分区中。垂直分区——一个表中的不同列可以被存贮到不同的物理分区中,但在MYSQL5.7中并不支持这种分区。

使用show plugins;命令来查看是否支持分区。如果partition的status列显示ACTIVE,表示当前MYSQL版本支持分区。

六、可以使用任何MySQL支持的引擎创建分区表,MySQL5.7中同一个表的不同分区要使用相同的引擎。但是,MYSQL分区不能使用MERGE,CSV或FEDERATED存储引擎。

DNB引擎是可以由KEY或LINEAR KEY分区的,但是其它用户定义类型的分区并不支持这种引擎。另外NDB表使用用户定义分区时必须包含明显的主键,并且其它索引到该表的列必须包含主键在内。

七、使用特定的存储引擎在分区表中和非分区表一样,但是要保证ENGINE关键字在分区选项之前。下面有一个InnoDB引擎的哈希分区表,分成了六个表,例:

create table ti(id INT, amount DECIMAL(7,2), tr_date DATE)ENGINE=INNODB
partition by hash(month(tr_date))
partitions 6;

八、每个分区的数据和索引能被存到指定的目录中,通过data directoryindex directory选项指定,这个选项用于create table的partition子句中,用于建立分区表。

注意:data directory和index directory并不支持单独分区或windows上的MYISAM表的子分区。它们只被支持在所有平台上的InnoDB表的独立分区和子分区。

九、所有用于分区表达式的列,必须是每唯一约束和主键的一部分,这意味着下面的表不能被分区:

create table tnp(
   id int not null auto_increment,
   ref bigint not null,
   name varchar(255),
   primary key pk (id),
   unique key uk(name)
);

因为pk和uk没有共同的列,所以没有列可以用于分区表达式。要解决这个问题可以将name添加到主键中并将id加到唯一约束uk中。或是简单的把唯一约束删除。

十、使用分区的一些优点:

  • 相比数据存储在单独的磁盘或文件系统上,分区可以让单个表存储更多的数据(如,某些文件系统要求单个文件不能超过4GB,使用分区就可以突破这个限制,让单个表超过4G)。
  • Data that loses its usefulness can often be easily removed from a partitioned table by dropping the partition (or partitions) containing only that data. Conversely, the process of adding new data can in some cases be greatly facilitated by adding one or more new partitions for storing specifically that data.可以很快的添加删除数据;删除数据只要删除相应分区就可以,添加只要添加新分区。
  • 一些满足where条件的查询也可以得到优化,只在某一分区中查找,不会涉及其它分区。因为可以把常用数据放到一个分区中,不常用的数据放到其它分区中。In addition, MySQL 5.7 supports explicit partition selection for queries. For example, SELECT * FROM t
    PARTITION (p0,p1) WHERE c < 5
    selects only those rows in partitions p0 and p1 that match the WHERE condition. In this case, MySQL does not check any other partitions of table t; this can greatly speed up queries when you already know which partition or partitions you wish to examine. Partition selection is also supported for the data modification statements DELETE, INSERT, REPLACE, UPDATE, and LOAD DATA, LOAD XML. See the descriptions of these statements for more information and examples.

发表回复