Другими словами, граф значения столбца против значения выражения более близко следует за прямой строкой по уравнению y= n x, где n некоторая константа, отличная от нуля. Такое выражение лучше подходит для хэширования. Более нелинейный выражение произведет более неравное распределение данных среди разделов.
В теории сокращение также возможно для выражений включающих значение больше, чем одного столбца, но определение того, которые из таких выражений являются подходящими, может быть крайне трудным и отнимающим много времени. По этой причине использование выражений хэширования, включающих много столбцов, не особенно рекомендуется.
Когда используется 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 запись с '2005-09-15' в col3, то раздел, в котором это будет сохранено, определен следующим образом:MOD(YEAR('2005-09-01'),4)=MOD(2005,4)=1
MySQL 5.1 также поддерживает вариант HASH partitioning известного как linear hashing (линейное хэширование) , которое использует более сложный алгоритм для определения размещения новых строк, вставленных в разбитую на разделы таблицу.
Функция пользователя оценена каждый раз, когда запись вставлена или модифицируется. Это может также быть в зависимости от обстоятельств, когда записи удалены.
Обратите внимание: если таблица, которая будет разбита на разделы, имеет ключ UNIQUE, то любые столбцы, обеспеченные как параметры к HASH функции пользователя или на KEY column_list , должны быть частью того ключа. Исключительная ситуация: это ограничение не относится к таблицам, использующим NDBCluster.
3.2.3.1. LINEAR HASH Partitioning
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) = 3.
Берется N = F ( column_list ) ( V – 1).
Пока N >= num :
Берется V =CEIL( 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,7) )) = 8
N = YEAR('2003-04-14') (8-1) = 2003 7 = 3
(3 >= 6 FALSE: запись сохранена в разделе #3
)
Номер раздела, где сохранена вторая запись, вычислен как показано здесь:
V = 8
N = YEAR('1998-10-19') (8-1) = 1998 7 = 6
( 6 >= 6 TRUE: нужен дополнительный шаг
)
N = 6 CEILING(5 / 2) = 6 3 = 2
(2 >= 6 FALSE: запись сохранена в разделе #2
)
Преимущество в выделении разделов линейным хэшем в том, что добавление, удаление, объединение и разбиение разделов сделано намного быстрее, что может быть полезно, когда имеешь дело с таблицами, содержащими чрезвычайно большие количества данных. Недостаток в том, что менее вероятно, что данные будут равномерно распределены между разделами по сравнению с распределением, полученным используя регулярное выделение разделов hash partitioning.
Выделение разделов ключом подобно выделению разделов хэшем за исключением того, что выделение разделов хэшем использует определяемое пользователем выражение, а хэш-функция для выделения разделов ключом обеспечена MySQL. Здесь MySQL Cluster использует для этой цели MD5(), а для таблиц, использующих другие типы памяти, сервер применяет собственную внутреннюю хэш-функцию, которая основана на том же самом алгоритме, что и PASSWORD().
Читать дальше