分区的哈希
主要用于确保数据在预定数量的分区中均匀分布。对于范围分区或列表分区,必须显式指定一个给定的列值或一组列值应该存储在哪个分区中;使用散列分区时,可以为您处理这个决策,您只需要根据要散列的列值和要将分区表划分到的分区数指定列值或表达式。
使用。对表进行分区哈希
分区时,要附加到创建表
声明A.按哈希划分(
条款,expr.
)expr.
是返回整数的表达式。这可以是一个列的名称,它的类型是MySQL的整数类型之一。此外,您很可能希望使用分区
, 在哪里数字
数字
是一个正整数,表示表要分成的分区数。
为简单起见,下面示例中的表不使用任何键。您应该知道,如果一个表有任何惟一键,那么该表的分区表达式中使用的每一列都必须是每个惟一键的一部分,包括主键。看到第6.1节,“分区键,主键和唯一键”,以获取更多信息。
以下语句创建一个使用散列的表store_id.
列并分为4个分区:
创建表员工(ID int not null,fname varchar(30),lname varchar(30),聘用日期不是null null默认值'1970-01-01',分隔日期不是null默认为'9999-12-31',Job_code int,batter_id int)按哈希(Store_ID)分区4分区;
如果不包含分区
子句,分区的数量默认为1
;使用分区
关键字后面没有数字将导致语法错误。
也可以使用返回整数的SQL表达式expr.
.例如,您可能希望根据雇用雇员的年份分区。这可以如此显示:
创建表员工(ID int not null,fname varchar(30),lname varchar(30),聘用日期不是null null默认值'1970-01-01',分隔日期不是null默认为'9999-12-31',Job_code int,Store_ID int)按哈希分区(年(雇用))分区4;
expr.
必须返回一个非常量、非随机的整数值(换句话说,它应该是变化的,但是确定性的),并且必须不包含任何在第六章,分区的限制和限制.您还应该记住,每当插入或更新(或可能删除)一行时,该表达式都会进行计算;这意味着非常复杂的表达式可能会导致性能问题,特别是在执行一次影响大量行的操作(如批量插入)时。
最有效的哈希函数是对单个表列进行操作,其值随列值的增加或减少一致,这是允许的”修剪”分区范围。也就是说,表达式随着它所基于的列的值变化得越紧密,MySQL就能越有效地使用表达式进行散列分区。
例如,在哪里date_col.
是一列类型日期
,则表达式TO_DAYS (date_col)
是直接随?的值变化的吗date_col.
,因为对于值的每一个变化date_col.
,表达式的值以一致的方式更改。表达式的方差(date_col)
关于date_col.
不像…那样直接吗TO_DAYS (date_col)
,因为不是每一个可能的改变date_col.
产生等同的变化(date_col)
.尽管如此,(date_col)
是一个很好的哈希函数候选函数吗,因为它直接随date_col.
没有可能的变化date_col.
这产生了不成比例的变化(date_col)
.
相反,假设您有一个名为的列INT_COL.
谁的类型是㈡
.现在考虑表达式战俘(5-int_col 3) + 6
.对于哈希函数来说,这是一个糟糕的选择,因为值的变化INT_COL.
不保证在表达式的值中产生比例变化。改变价值INT_COL.
通过给定的量可以产生显着不同的变化表达的值。例如,改变INT_COL.
从5
来6
产生改变-1
在值表达式中,但改变值INT_COL.
从6
来7
产生改变-7
在表达式中。
换句话说,列值的图表更仔细地与表达式的值遵循由等式追踪的直线y =
在哪里c
xc
是某个非零常数,越适合哈希表达式越好。这与这样一个事实有关:一个表达式越非线性,它往往产生的分区之间的数据分布就越不均匀。
理论上,涉及多个列值的表达式也可以进行修剪,但是确定哪种这样的表达式是合适的,可以是非常困难和耗时的。因此,不特别推荐使用涉及多列的散列表达式。
什么时候由散列分区
使用,存储引擎确定哪个分区数字
基于表达式结果的模数来使用分区。换句话说,对于给定的表达式expr.
,存储记录的分区是分区编号N
, 在哪里
.假设那个表N
=国防部(expr.
,数字
)t1
定义如下,因此它有4个分区:
CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY HASH(YEAR(col3)) PARTITIONS 4;
如果您将一条记录插入t1
谁的col3
价值是“2005-09-15”
然后,存储它存储的分区如下:
Mod (year ('2005-09-01'),4) = Mod (2005,4) = 1
MySQL 8.0也支持一个变体哈希
分区已知为线性散列它使用更复杂的算法来确定插入到已分区表中的新行的位置。看到第3.4.1节,“线性哈希分区”,用于描述该算法。
每次插入或更新记录时,都会对用户提供的表达式进行计算。根据情况,还可以在删除记录时对其进行评估。