表分区最近才知道。哦,我过去常常用不同的表来实现数以百万计的数据。现在让我来介绍mysql表分区的创建和使用。希望能对大家有帮助。
分区表是用于测试,主要来自其他博客文章和MySQL5.1参考手册
MySQL的测试版本:mysql5.5.28
简要介绍了MySQL的物理存储格式文件(在MySQL的配置datadir决定)
数据库引擎是MyISAM

FRM的表结构文件的MYD表数据文件,和我的表的索引文件。
InnoDB引擎对应表的物理存储文件
InnoDB数据库的物理文件结构:
FRM文件。
ibdata。IBD文件和文件:
这两个文件都存储在InnoDB数据文件,这两个文件存储InnoDB数据,因为InnoDB数据存储模式可以配置来决定是否使用共享表空间存储数据,或专属的存储空间用于存储数据的表。
独占表空间存储方法使用IBD文件,每个表都是IBD文件。
。ibdata文件使用共享表空间存储所有表使用ibdata文件
创建分区
分区的一些优点包括:
您可以存储比单个磁盘或文件系统分区更多的数据。
对于已经失去存储意义的数据,通过删除与这些数据相关联的分区,很容易删除这些数据。相反,在某些情况下,可以通过向这些新数据添加新分区来方便地添加新数据的过程。
与分区相关的其他优点包括下面列出的这些功能。MySQL分区中的这些功能尚未实现,但它们在优先级列表中具有高度优先权。我们希望将这些功能包括在5.1个生产版本中。
可以极大地优化一些查询,这些查询主要基于满足给定WHERE语句的数据。它可以存储在一个或多个分区中,因此在搜索时不会发现其他剩余分区。因为分区可以在创建分区表之后进行修改,所以当第一个分区计划未完成时,数据可以进行重组以提高常用查询的效率。
涉及汇总等功能和查询()数()可以很容易地并行处理。一个简单的查询的例子是选择salesperson_id,计数(订单)的salesperson_id销售组order_total;。平行,这意味着查询可同时进行各分区,而最终的结果只需要通过所有分区的分区得到的总。
通过在多个磁盘上分散数据查询以获得更大的查询吞吐量。
总之,它是数据管理优化、查询速度快、数据查询并行。
检查MySQL是否支持分区
复制代码代码如下所示:
显示变量
%分区% ;
------------------- ------- + + +
| variable_namenbspnbsp |价值|
------------------- ------- + + +
| have_partitioning | yesnbsp |
------------------- ------- + + +
1行集

范围分区:基于属于给定连续区间的列值,将多个行分配给分区。
复制代码代码如下所示:
如果表滴存在` p_range `;
创建表(` p_range `
` ID ` int(10)不为空auto_increment,
char(20)名称不为null,
主键(id)
auto_increment = 9 = MyISAM引擎默认的字符集utf8)
!50100分区(id)按范围
(分区P0值小于(8)= MyISAM引擎);

范围分区是按范围分区(ID),这意味着存储在P0分区数据根据ID 1-7。如果Id大于7,则无法写入数据,因为没有相应的数据分区存储。
So this time you need to use the maxvalues keyword when you create the partition
复制代码代码如下所示:
按范围划分(id)

分区P0值小于(8),
分区P1值小于最大值)

这意味着id大于7的所有数据记录都存在于P1分区中。
范围分区在下列场合中特别有用:
当你需要删除旧的数据。如果你使用最近的分区方案,你只需使用表分区P0删除所有员工,所有员工都停止了工作之前,1991对应的线,大量的表的行,运行删除员工,年比(分离)< = 1990;删除查询更有效。
您希望使用包含日期或时间值的值的列,或包含从其他系列开始增长的值。
定期运行查询,直接依赖于用于分割表列。例如,当进行选择如计数(*)的员工,年(分开)= 2000组store_id;这样的查询,MySQL可以快速确定分区P2只需要扫描,这是因为其他的分区不符合任何记录可能包含WHERE子句。
列表分区:类似于范围分区,不同之处在于列表分区是基于与离散值集中的值匹配的列值来选择的。
列表分区可以理解为基于密钥ID区间,数据存储,例如,类型表的所有记录都存储在1、2、3、4、5、6、7、8 P0,P1分区存在。
在这里,像范围分区,如果记录typeid 9,然后记录不能保存;
需要注意的是,在分区列表中没有定义如值小于最大值,包含其他重要。要匹配任何值必须在值列表中找到的。
复制代码代码如下所示:
如果表滴存在` p_list `;
创建表(` p_list `
` ID ` int(10)不为空auto_increment,
` typeid ` MEDIUMINT(10)不为空的默认'0',
` typename ` char(20)默认为空,
主键(` ID `,` typeid `)
auto_increment = 9 = MyISAM引擎默认的字符集utf8)
!50100分区(typeid)列表
(分区P0值(1,2,3,4)引擎= MyISAM,
分区P1值(5,6,7,8)= MyISAM引擎);

散列分区:基于用户定义表达式的返回值来选择分区,表达式计算将插入表中的行的列值。这个函数可以包含任何在MySQL中有效的表达式,并生成非负整数值。
哈希分区主要是用来确保数据均匀地分布在分区的预定数量,范围和列表分区,必须指定一个给定的列值或列应存放在一组值中的分区;而在哈希分区,MySQL会自动完成工作,你要做的是基于哈希列值指定一个列值或表达式,并指定分区的数量划分表将分为。
与哈希分区表的分区,通过哈希函数添加一个分区(expr)在创建表的语句,其中表达式,返回一个整数的表达。它只能是一列字段类型MySQL整数的名称。另外,你可能需要添加一个分区数条款后,在Num是一个非负整数,表明该表将被分配到分区。如果分区子句是不包括在内,分区的数量将被默认为1。
复制代码代码如下所示:
如果表滴存在` p_hash `;
创建表(` p_hash `
` ID ` int(10)不为空auto_increment,
` storeid ` MEDIUMINT(10)不为空的默认'0',
` storename ` char(255)默认为空,
主键(` ID `,` storeid `)
InnoDB引擎= = 11 auto_increment默认的字符集utf8)
!50100分区(storeid)通过散列
分区* 4;

InnoDB引擎
这些数据可以通过分区散列备简单点(expr);在expr是关键,也可以表达如年(时间),如果是表达式的情况
但需要记住的是,每当插入或更新(或删除)行时,表达式必须被计算一次;这意味着复杂表达式可能会导致性能问题,特别是在执行操作时大量行的影响(例如,当大容量插入时)。
表达式在执行删除、写入和更新时计算一次。
数据的分布,采用基于用户功能结果确定编号分区使用的模数。换句话说,一个表达式expr,保存记录的分区编号为N,其中N = MOD(expr,努姆)。
例如,在storeid以上是10;然后每组MOD(10,4);N等于2,然后记录存放在P2分区。
如果你插入一条记录的表达式的值是'2005-09-15表,分区记录记录确定如下:MOD(年('2005-09-01 ')),4)= MOD(2005,4)= 1;它是存储在P1分区。
MySQL 5.1还支持一个名为线性散列(线性散列函数)的变量。它使用一种更复杂的算法来确定插入到分区表中的新行的位置。
线性散列分区与传统散列分区的唯一区别是在分区子句中添加线性关键字,以及线性散列函数中使用的线性2幂(两幂)算法。
根据线性哈希分区的优势,添加、删除、合并和拆分分区将越来越有助于处理表包含大量数据(1000GB)。
它的缺点是,不同分区之间的数据分布与传统散列分区所获得的数据分布不太可能保持平衡。
键分区:类似于哈希分区,不同的是键分区只支持一列或多列,而MySQL服务器提供它自己的散列函数。必须有一列或多列包含整数值。
复制代码代码如下所示:
如果表滴存在` p_key `;
创建表(` p_key `
` ID ` int(10)不为空auto_increment,
` keyName ` char(20)默认为空,
` keyval ` varchar(1000)默认为空,
主键(id)
auto_increment = 12 = MyISAM引擎默认的字符集utf8)
!50100分区(id)按键
分区* 4;

分区根据关键是类似于哈希分区,除了用户定义的表达式用于哈希分区,在分区散列函数的关键是由MySQL集群(cluster)server.mysql提供使用MD5()函数来实现关键分区。对于其他使用其他存储引擎的表,服务器使用自己的散列函数,这些函数基于与密码()相同的算法。
按键分区的语法规则类似于通过哈希分区创建表的规则,它们之间唯一的区别是关键字是键而不是散列,而键分区只是一个或多个列名的列表。
与散列不同的是散列使用用户定义的表达式,如年份(时间);密钥分区由MySQL服务器提供,相同的密钥也可以使用线性的线性密钥,这与散列线性相同。
子:是在分区表中每个分区的第二分区。
复制代码代码如下所示:
如果表滴存在` p_subpartition `;
创建表(` p_subpartition `
id int(10)默认NULL,
标题char(255)不为空,
`创造时间`日期不为空
= MyISAM引擎默认的字符集utf8)
50100 !
按范围分区(年(创造时间))
子分区哈希(月(创造时间))
(分区P0值小于(2012))
(S1 = MyISAM引擎子分区,
子分区S2 = MyISAM引擎),
分区P1值小于(2013)
(子分区S3引擎= MyISAM,
子分区S4引擎= MyISAM),
分区P2值小于最大
(子分区S5引擎= MyISAM,
子分区S6发动机= MyISAM));

你可以看到,p_subpartition有三个分区,P0,P1,P2;这三个分区分为2个分区。然后整个表分为6个小区域。

你可以看到,这是p_sobpartitionp0.myd消失的文件,而不是p_subpartition