Spec-Zone.ru › MySQL 5.7

22.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 выводится в соответствии со следующим алгоритмом:

  1. Найдите ближайшую большую степень двойки, чем 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) )) = 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.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/partitioning-linear-hash.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API