Spec-Zone .ru
спецификации, руководства, описания, API
|
MySQL также поддерживает линейное хеширование, которое отличается от регулярного хеширования, в котором линейное хеширование использует линейный алгоритм "полномочия два", тогда как регулярное хеширование использует модуль значения хеш-функции.
Синтаксически, единственной разницей между разделением линейного хеша и регулярным хешированием является
добавление LINEAR
ключевое слово в PARTITION BY
пункт,
как показано здесь:
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 '9999-12-31', job_code INT, store_id INT)PARTITION BY LINEAR HASH( YEAR(hired) )PARTITIONS 4;
Учитывая выражение expr
, раздел, в котором сохранена запись, когда
линейное хеширование используется, является числом раздела N
из числа
num
разделы, где N
получается согласно следующему алгоритму:
Сочтите следующее питание 2 больше чем num
. Мы вызываем это значение V
; это может быть вычислено как:
V
= POWER(2, CEILING(LOG(2,num
)))
(Предположите это num
13. Затем LOG(2,13)
3.7004397181411. CEILING(3.7004397181411)
4, и V
= POWER(2,4)
,
который является 16.)
Набор N
= F
(column_list
) &
(V
- 1).
В то время как N
>= num
:
Набор V
= ПЕРЕКРОЙТЕ (V
/ 2)
Набор N
= N
& (V
- 1)
Предположите что таблица t1
, использование линейного разделения хеша и наличие 6
разделов, создается, используя этот оператор:
CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY LINEAR HASH( YEAR(col3) ) PARTITIONS 6;
Теперь предположите, что Вы хотите вставить две записи в t1
наличие col3
значения столбцов '2003-04-14'
и '1998-10-19'
. Число раздела для первого из них определяется следующим образом:
V
= POWER(2, CEILING( LOG(2,6) )) = 8N
= YEAR('2003-04-14') & (8 - 1) = 2003 & 7 = 3(3 >= 6 is FALSE: record stored in partition #3)
Число раздела, где вторая запись сохранена, вычисляется как показано здесь:
V
= 8N
= YEAR('1998-10-19') & (8-1) = 1998 & 7 = 6(6 >= 6 is TRUE: additional step required)N
= 6 & CEILING(8 / 2) = 6 & 3 = 2(2 >= 6 is FALSE: record stored in partition #2)
Преимущество в разделении линейным хешем состоит в том, что добавление, отбрасывание, слияние, и разделение разделов делаются намного быстрее, который может быть выгодным, имея дело с таблицами, содержащими чрезвычайно большое количество (терабайты) данных. Недостаток - то, что данные, менее вероятно, будут равномерно распределены между разделами по сравнению с распределением, полученным, используя регулярное разделение хеша.