首先,概述

当MySQL记录总数超过100万时,性能会有大幅度下降吗答案是肯定的,但性能下降的比率是不同的。这取决于很多因素,如系统架构、应用程序、>索引、服务器硬件等等。当有网友问我这个问题时,我最常用的答案是分区表很容易,但是应用程序,甚至结构更改,都不会被忽略,包括将来的可伸缩性。

过去,有一种解决方案是使用合并。

这是一种非常方便的烹饪方式,它的架构和程序基本上没有变化,但它的缺点是显而易见的:

1。只能用一个MyISAM表具有相同的结构

2。不能享受MyISAM的所有功能,如无法在合并式执行全文搜索

三.它需要使用更多的文件描述符。

4。读索引慢些

此时,MySQL 5.1中新的分区(分区)功能的优点是显而易见的。

1。与单个磁盘或文件系统分区相比,可以存储更多的数据。

2。很容易删除未使用的或过时的数据。

三.可以极大地优化某些查询。

4。当涉及到聚合函数(如)和()时,可以并行执行。

5.io吞吐量更大

分区允许您设置任意大小的规则,并且在一个文件系统中分配单个表的多个部分,实际上,表的不同部分作为不同的表存储在不同的位置。

应注意的事项:

1。当进行分区时,要么没有定义主键,要么将分区字段添加到主键中。

2,分区字段不能为空,或者如何确定分区范围,所以尽量不要NULL。

二、分区类型

1.range分区:基于列值属于一个给定的连续区间,多行分配给分区。

2.list分区:类似范围分区,不同的是,列表分区是基于列的值,在一组离散的值的值匹配选择。

2.hash分区:基于用户定义的表达式的返回值来选择分区,表达计算的那些行将插入到表中的列值。这个函数可以包含包含非负整数的值,MySQL是任何有效的表达式。

3.key分区:类似于哈希分区,不同的是,关键的分区只支持一列或多列,与MySQL服务器提供自己的哈希函数必须有一个列或多列包含整数值>。

显示变量命令可用于确定MySQL是否支持分区,例如:

复制代码代码如下所示:

显示诸如%分区%之类的变量;

----------------------- ------- + + +

| variable_name |价值|

----------------------- ------- + + +

| have_partition_engine |是|

----------------------- ------- + + +

1行集(0秒)



复制代码代码如下所示:

显示诸如%分区%之类的变量;

----------------------- ------- + + +

| variable_name |价值|

----------------------- ------- + + +

| have_partition_engine |是|

----------------------- ------- + + +

1行集(0秒)



1、范围划分

复制代码代码如下所示:

创建表t_range(

id int(11),

货币int(11)无符号不空,

日期日期

按范围划分(年份(日期))

分区p2007值小于(2008),

分区2008的值小于(2009),

分区p2009值小于(2010)

分区的P2010值小于最大

);



2.list分区

复制代码代码如下所示:

创建表t_list(

int(11),

B int(11)

(按列表划分)(b)

分区P0值(第3),

分区P1值(2,4,6,8,0)

);



InnoDB和MyISAM引擎,当一个句子插入多条记录,如果该值未插入时,InnoDB将回滚。在MyISAM可以向表中插入数据。InnoDB和MyISAM引擎,当一个句子插入多条记录,如果该值未插入时,InnoDB将回滚。在MyISAM可以向表中插入数据。

3.hash分区

哈希分区的目的是将数据均匀地分配到预定义的分区中,以确保每个分区的数据大致相同。

复制代码代码如下所示:

创建表t_hash(

int(11),

B型

按散列划分(年份(b))

分区4;



散列的分区函数页需要返回一个整数值。分区子句中的值是非负整数,分区子句的默认值是分区数为1。

4.key分区

关键的分区和散列分区是相似的,不同的哈希分区是一个用户定义的功能分区,分区功能键使用NDB簇划分提供了MySQL数据库,使用MD5哈希函数为MySQL使用其他存储引擎的内部功能分区,基于密码的功能(这些相同的算法)。

复制代码代码如下所示:

创建表t_key(

int(11),

B型)

按键分区(b)

分区4;



5、列分区

在上面的四个分区中,范围、列表、散列和键,分区条件必须是塑料的,如果不是塑料,则需要按函数转换成塑料。

mysql 5.5开始支撑柱的分区,这可以看作是范围和列表分区的演变,和列分区可以划分直接与非塑性数据,列分区支持下列数据类型:

所有的塑料,如int SmallInt tinyint bigint.float和小数不支持。

日期类型,如日期和时间,不支持其他数据类型。

字符串类型,如CHAR、varchar,二进制,和varbinary。BLOB和文本类型不支持。

可以用多列对列进行分区。

新的分区

复制代码代码如下所示:

MySQL >修改表sale_data

ADD PARTITION (PARTITION p201010 VALUES, LESS THAN (201011));

查询OK,0行受影响(0.36秒)

记录:0个重复:0个警告:0



删除一个分区

复制代码代码如下所示:

当一个分区被删除时,分区中的所有数据同时被删除。

MySQL >修改表sale_data删除分区p201010;

查询OK,0行受影响(0.22秒)

记录:0个重复:0个警告:0



合并分区

下面的SQL,p201001 - p201009并入3分区p2010q1 - p2010q3

复制代码代码如下所示:

MySQL >修改表sale_data

分区p201001 ->重组,p201002,p201003,

p201004 p201005,p201006,

p201008,p201009成-> p201007。

(->

p2010q1值小于->分配比(201004),

p2010q2值小于->分配比(201007),

p2010q3值小于->分配比(201010)

>;

查询OK,0行受影响(1.14秒)

记录:0个重复:0个警告:0