MySQL中的分区没有什么不允许的无效的
作为分区表达式的值,无论是列值还是用户提供的表达式的值。即使允许使用无效的
作为表达式的值,否则必须生成整数,请务必记住无效的
不是数字。MySQL的分区实现无效的
比任何非-无效的
价值,就像订货人
做。
这意味着无效的
在不同类型的分区之间是不同的,如果您没有准备好,可能会产生您不期望的行为。在这种情况下,我们将在本节中讨论每个MySQL分区类型如何处理无效的
值,并为每个值提供示例。
使用范围分区处理空值。如果在按分区的表中插入一行射程
这样,用于确定分区的列值无效的
,该行被插入到最低的分区中。考虑数据库中的这两个表P
,创建如下:
mysql>创建表t1(->c1 INT,-->c2 VARCHAR(20)->)->分区范围(c1)(->分区p0值小于(0),->分区p1值小于(10),->分区p2值小于MAXVALUE->);查询正常,0行受影响(0.09秒)mysql>CREATE TABLE t2(->c1 INT,->c2 VARCHAR(20)->)->分区范围(c1)(->分区p0值小于(-5),->分区p1值小于(0),->分区p2值小于(10),->分区p3值小于MAXVALUE->);查询正常,0行受影响(0.09秒)
您可以看到由这两个组件创建的分区创建表
语句对分区
中的表信息模式
数据库:
mysql>从信息模式中选择表名称、分区名称、表行、平均行长度、数据长度>。分区>其中表模式='p'和表名称,如't';+----------------+-----------+-----------+-----------+\调查表U名称和表表U名称。.餐桌U名称名称餐桌名称名称餐桌名称名称餐桌名称餐桌名称名称名称.分区名称|表U名称长度长度数据数据长度长度长度;0 | 0 | t2 | p2 | 0 | 0 | t2 | p3 | 0 | 0 |+------------+----------------+------------+----------------+-------------+7行(0.00秒)
(有关此表的详细信息,请参阅第26.3.21节,“信息分区表”)现在让我们用包含无效的
在列中用作分区键,并验证是否使用一对选择
声明:
mysql>插入t1值(NULL,'mothra');查询确定,1行受影响(0.00秒)mysql>插入t2值(NULL,'mothra');查询确定,1行受影响(0.00秒)mysql>从t1中选择*;+------+----------+\id | name |+------------+------------+| NULL | mothra |+------------+------------+------------+1行(0.00秒)mysql>从t2中选择*;+------------+------------++id | name |+------------+------------+| NULL | mothra |+------------+------------+集合中的1行(0.00秒)
通过对上一个查询重新运行,可以看到哪些分区用于存储插入的行信息\u SCHEMA.PARTITIONS
检查输出:
mysql>从信息模式中选择表名称、分区名称、表行、平均行长度、数据长度>。分区>其中表模式='p'和表名称,如't';+----------------+-----------+-----------+-----------+\表|名称|分区|名称|表|行|平均行|长度|数据|+------------+----------------+------------+----------------+-------------+|t1 | p0 | 1 | 20 | 20||t1 | p1 | 0 | 0 | t1 | p2 | 0 | 0||t2 | p0 | 1 | 20 | 20||t2 | p1 | 0 | 0 | 0 | | t2 | p2 | 0 | 0 | | t2 | p3 | 0 | 0 | | 0 |+------------------+------------------+------------------+----------------+7行(0.01秒)
您还可以通过删除这些分区,然后重新运行选择
声明:
mysql>ALTER TABLE t1删除分区p0;查询确定,0行受影响(0.16秒)mysql>ALTER TABLE t2 DROP PARTITION p0;查询确定,0行受影响(0.16秒)mysql>SELECT*fromt1;空集(0.00秒)mysql>SELECT*FROM t2;空集(0.00秒)
(有关更改表。。。放置分区
,请参见第13.1.9节,“ALTER TABLE语句”.)
无效的
对于使用SQL函数的分区表达式,也是这样处理的。假设我们使用创建表
像这样的陈述:
创建表tndate(id INT,dt DATE)按范围分区(年(dt))(分区p0值小于(1990),分区p1值小于(2000),分区p2值小于MAXVALUE);
与其他MySQL函数一样,年份(空)
退货无效的
. 一排有一个日期
列值无效的
被视为分区表达式的值小于任何其他值,因此被插入到分区中p0
.
使用列表分区处理NULL。按分区的表列表
承认无效的
值当且仅当它的一个分区是使用包含无效的
. 相反的是一个表被列表
没有明确使用无效的
在值列表中拒绝行,从而导致无效的
分区表达式的值,如本例所示:
mysql>创建表ts1(->c1 INT,-->c2 VARCHAR(20)->)->按列表分区(c1)(->PARTITION p0 VALUES IN(0,3,6),->PARTITION p1 VALUES IN(1,4,7),->PARTITION p2 VALUES IN(2,5,8)->);查询确定,0行受影响(0.01秒)mysql>INSERT INTO ts1 VALUES(9,'mothra');错误1504(HY000):表没有值9 mysql>INSERT INTO ts1 VALUES的分区(NULL,'mothra');错误1504(HY000):表没有值NULL的分区
只有行具有c1类
值介于0
和8.
包含可以插入到ts1型
.无效的
不在此范围内,就像数字一样9
. 我们可以创建表格ts2型
和ts3型
具有包含无效的
,如图所示:
mysql>创建表ts2(->c1 INT,-->c2 VARCHAR(20)->)->按列表分区(c1)(->分区p0值在(0,3,6),->分区p1值在(1,4,7),->分区p2值在(2,5,8),->分区p3值在(NULL)->);Query OK,0行受影响(0.01秒)mysql>CREATE TABLE ts3(->c1 INT,->c2 VARCHAR(20)->)->按列表分区(c1)(->分区p0值在(0,3,6),->分区p1值在(1,4,7,NULL),->分区p2值在(2,5,8)->);查询正常,0行受影响(0.01秒)
定义分区的值列表时,可以(而且应该)处理无效的
就像其他任何价值观一样。例如,两者中的值(NULL)
和(1,4,7,NULL)中的值
都是有效的(1,NULL,4,7)中的值
,中的值(NULL、1、4、7)
,等等。可以插入一行无效的
对于列c1类
每一张桌子ts2型
和ts3型
:
mysql>插入ts2值(NULL,'mothra');查询确定,1行受影响(0.00秒)mysql>INSERT INTO ts3 VALUES(NULL,'mothra');查询正常,1行受影响(0.00秒)
通过对信息\u SCHEMA.PARTITIONS
,您可以确定使用了哪些分区来存储刚刚插入的行(我们假设,与前面的示例一样,分区表是在P
数据库):
mysql>从信息\模式中选择表\名称、分区\名称、表\行、平均\行\长度、数据\长度>表|名称|分区|名称|表|行|平均|行|长度|数据|长度|+-------------------+-------------------+-------------------+| ts2 | p0 | 0 | 0 | ts2 | p1 | 0 | 0 | ts2 | p2 | 0 | 0 | 0||ts2 | p3 | 1 | 20 | 20||ts3 | p0 | 0 | 0 | 0||ts3 | p1 | 1 | 20 | 20||ts3 | p2 | 0 | 0 | 0 |+----------------+----------------+----------------+----------------+7行(0.01秒)
如本节前面所示,您还可以通过删除这些分区然后执行选择
.
使用哈希和密钥分区处理空值。无效的
对于按搞砸
或钥匙
. 在这些情况下,任何产生无效的
值被视为其返回值为零。我们可以通过检查创建按分区的表对文件系统的影响来验证这种行为搞砸
并用包含适当值的记录填充它。假设你有一张桌子第
(同样在P
数据库)使用以下语句创建:
mysql>创建表th(->c1 INT,->c2 VARCHAR(20)->)->按哈希分区(c1)->分区2;查询正常,0行受影响(0.00秒)
可以使用以下查询查看属于此表的分区:
mysql>从信息\u SCHEMA.PARTITIONS>中选择表\u NAME、分区\u NAME、表\u ROWS、平均行\u LENGTH、数据\u LENGTH>,其中表\u SCHEMA='p'和表\u NAME='th';+----------------+-----------+-----------+-----------+\124;表|名称|分区|名称|表|行|平均行|长度|数据|长度|+----------------+----------------+----------------+-----------+-----------+----------------+| th | p0 | 0 | 0 | th | p1 | 0 | 0 | 0 | 0 |+-----------+-----------+-----------+-----------+-----------+2行(0.00秒)
表\u行
每个分区的值为0。现在将两行插入第
谁的c1类
列值为无效的
和0,并验证是否插入了这些行,如下所示:
mysql>插入th值(NULL,'mothra'),(0,'gigan');查询确定,1行受影响(0.00秒)mysql>从th选择*;+------+------+|c1 | c2 |+------------+------------+| NULL | mothra |+------------+------------+------------+| 0 | gigan |+------------+------------+2行(0.01秒)
回想一下,对于任何整数N
,的值空模式
总是N
无效的
. 对于按分区的表搞砸
或钥匙
,则将此结果视为确定正确的分区0
. 检查信息\u SCHEMA.PARTITIONS
表中,我们可以再次看到这两行都被插入到了分区中p0
:
mysql>从信息\u SCHEMA.PARTITIONS>中选择表\u NAME、分区\u NAME、表\u ROWS、平均行\u LENGTH、数据\u LENGTH>,其中表\u SCHEMA='p'和表\u NAME='th';+----------------+-----------+-----------+-----------+\124;表|名称|分区|名称|表|行|平均行|长度|数据|+------------+----------------+------------+----------------+-------------+|th | p0 | 2 | 20 | 20||th | p1 | 0 | 0 |+----------------+----------------+----------------+----------------+集合中的2行(0.00秒)
通过使用重复上一个示例按键分区
代替按哈希划分
在表的定义中,可以验证无效的
对于这种类型的分区,也被视为0。