- Индекс структурирован как Брит.
- InnoDB BTrees изначально заполнены только 15/16-й полной.
- После большого количества оттока, среднее значение в среднем составляет 69%.
- Существует значительная сумма накладных расходов для каждой строки в записи индекса.
PRIMARY KEY
(in InnoDB) «сгруппирован» с данными. Таким образом, только нелистовые узлы принимают дополнительные блоки.
- Вторичные индексы содержат все столбцы (столбцы)
PRIMARY KEY
; вот как они «указывают» на запись.
- Основываясь на вышеуказанных двух пунктах, не имеет смысла иметь только
INT
в BTree для индекса.
Я использую простое правило большого пальца: 100 «рядов» на каждый бит.
Следствие: миллионный ряд бит составляет около 3 уровней; таблица с миллиардными рядами составляет около 5 уровней.
Давайте так:
CREATE TABLE x (
id INT ...,
num INT ...,
str VARCHAR(200) CHARACTER SET utf8,
PRIMARY KEY (id),
INDEX i_num (num),
INDEX i_str (str)
) ENGINE=InnoDB;
Для i_num
, обратите внимание, что есть два INTs
. Вы можете получить 300-400 строк на блок. 10 миллионов строк занимают 3 уровня.
Для i_str
предположим, что в среднем 100 корейских символов - это 300 байт для текста. Вы можете получить 25-35 строк на блок. Строки 10М занимают 5 уровней.
ALTER
и OPTIMIZE
май или не может индексы дефрагментации.
Есть information_schema
столы, которые дают некоторые подробно о каждом Брит и его уровнях. Percona и MySQL имеют разные таблицы для таких.
Нижняя строка: вычисления слишком размыты, чтобы быть точным. Надеюсь, мои ручные манеры дали вам несколько лучших ручек.