Spec-Zone .ru
спецификации, руководства, описания, API

18.2.4.1. LINEAR HASH Разделение

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 получается согласно следующему алгоритму:

  1. Сочтите следующее питание 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.)

  2. Набор N = F(column_list) & (V - 1).

  3. В то время как 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)

Преимущество в разделении линейным хешем состоит в том, что добавление, отбрасывание, слияние, и разделение разделов делаются намного быстрее, который может быть выгодным, имея дело с таблицами, содержащими чрезвычайно большое количество (терабайты) данных. Недостаток - то, что данные, менее вероятно, будут равномерно распределены между разделами по сравнению с распределением, полученным, используя регулярное разделение хеша.