MySQL Linear Ha sh разбиение - PullRequest
       23

MySQL Linear Ha sh разбиение

0 голосов
/ 08 января 2020

MySQL использует довольно простой алгоритм для назначения ключей разделам:

https://dev.mysql.com/doc/refman/8.0/en/partitioning-linear-hash.html

В основном, учитывая num доступных разделов и клавиша k :

MySQL пытается присвоить ключ k разделу " k по модулю V", где V - наименьшая мощность на 2 больше, чем у раздела. Если выходное значение превышает num , они неоднократно пытаются с следующей меньшей мощностью 2: k mod V / 2 ...

Что я не понимаю, так это зачем им нужен l oop: кажется, что они могут остановиться на V / 2 и никогда не должны учитывать V / 4 . Я что-то упустил или do c делает вещи более сложными, чем они должны быть?

Я вспоминаю код Mysql do c ниже:

V = POWER(2, CEILING(LOG(2, num)))
N = F(k) & (V - 1)
While N >= num
{ V = V / 2 
  N = N & (V - 1)
}
Assign key k to N

1 Ответ

1 голос
/ 09 января 2020

Вы правы, и на самом деле рассчитано без учета oop:

static uint32 get_part_id_from_linear_hash(longlong hash_value, uint mask,
                                           uint num_parts) {
  uint32 part_id = (uint32)(hash_value & mask);

  if (part_id >= num_parts) {
    uint new_mask = ((mask + 1) >> 1) - 1;
    part_id = (uint32)(hash_value & new_mask);
  }
  return part_id;
}

Я не совсем уверен, чего хочет документация express, но, поскольку реализация, используемая в MySQL, является специфической c версией более общего линейного хеширования, автор, вероятно, просто не упростил более обобщенный случай c (где вы на самом деле могли бы использовать al oop) до абсолютного конца или использовал описание из документа об алгоритме. И это все еще правильно.

...