分区的哈希
主要用于确保数据在预定数量的分区中均匀分布。对于范围或列表分区,必须显式指定给定的列值或一组列值应该存储在哪个分区中;在哈希分区中,这个决定由您来决定,您只需要根据要哈希的列值和分区表要划分到的分区数量指定列值或表达式。
对表进行分区哈希
分区时,需要追加创建表
声明一个按散列划分(
条款,expr
)expr
返回整数的表达式。这可以是MySQL的整数类型之一的列的名称。此外,您很可能希望在此之后加上分区
,在那里全国矿工工会
全国矿工工会
是一个正整数,表示要将表划分为多少个分区。
为了简单起见,下面示例中的表不使用任何键。您应该意识到,如果表有任何惟一键,则该表分区表达式中使用的每个列必须是每个惟一键(包括主键)的一部分。看到第24.6.1节“分区键、主键和唯一键”,以查询更多资料。
对象上使用散列创建一个表可以
列,分为4个分区:
CREATE TABLE employees (id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT ' 99999-12-31 ', job_code INT, store_id INT)
如果没有包含分区
子句,默认分区数为1
;使用分区
关键字后面没有数字会导致语法错误。
还可以使用返回整数的SQL表达式expr
.例如,您可能希望根据雇员被雇用的年份进行分区。这可以如下所示:
CREATE TABLE employees (id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT ' 99999-12-31 ', job_code INT, store_id INT)
expr
必须返回一个非恒定的、非随机的整数值(换句话说,它应该是可变的但是确定的),并且不能包含任何被禁止的构造,如第24.6节,“分区的限制和限制”.您还应该记住,每当插入或更新(或可能删除)一行时,都会计算此表达式;这意味着非常复杂的表达式可能会导致性能问题,特别是在执行一次影响大量行的操作(例如批处理插入)时。
最有效的散列函数是对单个表列进行操作,并且其值随列值的增加或减少而一致的散列函数”修剪”在分区范围上。也就是说,表达式与它所基于的列的值的变化越接近,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
的类型是INT
.现在考虑一下这个表达式战俘(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))
如果你插入一个记录到t1
谁的col3
值是“2005-09-15”
,则其所在分区确定如下:
Mod (year ('2005-09-01'),4) = Mod (2005,4) = 1
MySQL 8.0还支持哈希
分区被称为线性散列它使用一种更复杂的算法来确定插入到分区表中的新行的位置。看到第24.2.4.1节“线性哈希分区”,以获取该算法的描述。
每当插入或更新记录时,都会计算用户提供的表达式。根据具体情况,也可以在删除记录时对其进行评估。