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

17.2.4. HASH Разделение

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

Разделение HASH используется прежде всего, чтобы гарантировать даже распределение данных среди предопределенного числа разделов. С диапазоном или разделением списка, следует определить явно, в который делят данное значение столбца, или набор значений столбцов должен быть сохранен; с разделением хеша MySQL заботится об этом для Вас, и Вы должны только определить значение столбца или выражение, основанное на значении столбца, которое будет хешировано и число разделов, на которые должна быть разделена разделенная таблица.

Разделить табличное использование HASH разделение, необходимо добавить к CREATE TABLE оператор a PARTITION BY HASH (expr) пункт, где expr выражение, которое возвращает целое число. Это может просто быть именем столбца, тип которого является одним из целочисленных типов MySQL. Кроме того, Вы будете наиболее вероятно хотеть следовать за этим с a PARTITIONS num пункт, где num положительное целое число, представляющее число разделов, на которые должна быть разделена таблица.

Например, следующий оператор составляет таблицу, которая использует хеширование на store_id столбец и делится на 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 '9999-12-31',    job_code INT,    store_id INT)PARTITION BY HASH(store_id)PARTITIONS 4;

Если Вы не включаете a PARTITIONS пункт, число значений по умолчанию разделов к 1.

Используя PARTITIONS ключевое слово без числа после этого приводит к синтаксической ошибке.

Можно также использовать 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 '9999-12-31',    job_code INT,    store_id INT)PARTITION BY HASH( YEAR(hired) )PARTITIONS 4;

expr должен возвратить непостоянное, неслучайное целочисленное значение (другими словами, оно должно изменяться, но детерминированное), и не должен содержать запрещенные конструкции как описано в Разделе 17.6, "Ограничения и Ограничения на Разделение". Следует также иметь в виду, что это выражение оценивается каждый раз, когда строка вставляется или обновляется (или возможно удаляется); это означает, что очень сложные выражения могут дать начало проблемам производительности, особенно выполняя операции (такие как пакет вставляет), которые влияют на очень много строк когда-то.

Самая эффективная хеш-функция является той, которая работает на единственный столбец таблицы и чьи увеличения значения или последовательно уменьшает со значением столбца, поскольку это учитывает "сокращение" на диапазонах разделов. Таким образом, более близко, что выражение меняется в зависимости от значения столбца, на котором это базируется, более эффективно, MySQL может использовать выражение для разделения хеша.

Например, где date_col столбец типа DATE, тогда выражение TO_DAYS(date_col) как говорят, изменяется прямо пропорционально значению date_col, потому что для каждого изменения в значении date_col, значение выражения изменяется непротиворечивым способом. Различие выражения YEAR(date_col) относительно date_col является не совсем столь же прямым как тот из TO_DAYS(date_col), потому что не каждое возможное изменение в date_col вызывает эквивалентное изменение в YEAR(date_col). Даже в этом случае, YEAR(date_col) хороший кандидат на хеш-функцию, потому что она изменяется прямо пропорционально части date_col и нет никакого возможного изменения в date_col это вызывает непропорциональное изменение в YEAR(date_col).

Посредством контраста предположите, что Вам назвали столбец int_col чей тип INT. Теперь рассмотрите выражение POW(5-int_col,3) + 6. Это было бы плохим выбором для хеш-функции потому что изменение в значении int_col как гарантируют, не вызовет пропорциональное изменение в значении выражения. Изменение значения int_col данным количеством может произвести широко различными изменениями в значении выражения. Например, изменение int_col от 5 к 6 вызывает изменение -1 в значении выражения, но изменении значения int_col от 6 к 7 вызывает изменение -7 в значении выражения.

Другими словами более близко график значения столбца против значения выражения следует за прямой линией как прослежено уравнением y=cx где c некоторая ненулевая константа, лучше, выражение подходит для хеширования. Это имеет отношение к факту что, чем более нелинейный выражение, тем более неравный распределение данных среди разделов оно имеет тенденцию производить.

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

Когда PARTITION BY HASH используется, MySQL определяет который раздел num разделы, чтобы использовать основанный на модуле результата функции пользователя. Другими словами, для выражения expr, раздел, в котором сохранена запись, является числом раздела N, где N = MOD(expr, num). Предположите ту таблицу 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 5.7 также поддерживает разновидность HASH разделение известного как линейное хеширование, которое использует более сложный алгоритм для того, чтобы определить размещение новых строк, вставленных в разделенную таблицу. См. Раздел 17.2.4.1,"LINEAR HASH Разделение", для описания этого алгоритма.

Функция пользователя оценивается каждый раз, когда запись вставляется или обновляется. Это может также — в зависимости от обстоятельств — быть оцененным, когда записи удаляются.

Отметить

Если у таблицы, которая будет разделена, есть a UNIQUE ключ, тогда любые столбцы, предоставленные как параметры HASH функция пользователя или к KEY's column_list должна быть часть того ключа.