26.2.4.1 Разбиение по линейному хешированию
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 вычисляется в соответствии со следующим алгоритмом:
-
Найдите ближайшую степень двойки, большую чем
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) )) = 8
N = YEAR('2003-04-14') & (8 - 1)
= 2003 & 7
= 3
(3 >= 6 is FALSE: record stored in partition #3)
Номер раздела, где хранится вторая запись, вычисляется следующим образом:
V = 8
N = YEAR('1998-10-19') & (8 - 1)
= 1998 & 7
= 6
(6 >= 6 is TRUE: additional step required)
N = 6 & ((8 / 2) - 1)
= 6 & 3
= 2
(2 >= 6 is FALSE: record stored in partition #2)
Преимущество разбиения по линейному хешированию заключается в том, что добавление, удаление, объединение и разделение разделов происходит намного быстрее, что может быть полезно при работе с таблицами, содержащими чрезвычайно большие объёмы данных (терабайты). Недостаток заключается в том, что данные менее склонны к равномерному распределению между разделами по сравнению с распределением, полученным с помощью обычного разбиения по хешированию.
© 2025 Oracle
Licensed under the GPLv2 License.