2015-03-19 4 views
0

Рассматривая таблицы ниже 3 MySQL, типично ли иметь длину индекса намного выше фактического количества строк?Индекс MySQL Длина Разъяснение

Также существует ли ограничение на длину индекса, прежде чем вы начнете быстро ухудшаться в производительности, например, первая таблица с длиной индекса 206 миллионов плюс?

table_rows data_length index_length Size in MB 
7607749  5044389164 206542848  5007.68 
3110749  1832710212 793864192  2504.9 
4811507  1088374128 318001152  1341.22 
+3

Индексы основаны на строках данных, а не на таблице. –

+1

«Также существует ограничение на длину индекса, прежде чем вы начнете быстро ухудшаться в производительности» --- да, есть. Как только он не впишется в память целиком. – zerkms

ответ

1

table_rows это число строк в таблице. Этот номер является точным для MyISAM, но только приблизительный для InnoDB. data_length - номер байт в части данных таблицы. Для InnoDB это включает в себя PRIMARY KEY. index_length - это число байт (не строк) для индексов (исключая PK, если InnoDB).

Если у вас большое количество индексов, index_length может быть больше, чем data_length. Это ключ, что у вас может быть слишком много индексов, но это не обязательно «плохо».

Каждый индекс хранится как независимый бит. Когда вы добавляете другой индекс, вы получаете еще один бит; это не влияет на производительность существующих индексов.

Ваши таблицы имеют несколько миллионов строк; это означает, что каждый уровень БТР составляет около 4 уровней. Если таблица вырастет до миллиарда строк, ее BTrees вырастет примерно до 5 уровней. Это незначительно.

Деградация может произойти, когда ситуация становится больше. Но это не так просто.

Пример 1: Ваши данные имеют индекс datetime или auto_increment PRIMARY KEY, и вы всегда смотрите только на «последние» строки. В этом случае, вероятно, «рабочий набор» достаточно мал, чтобы вписываться в ОЗУ. Вы не заметите снижения производительности, поскольку индексы & растут.

Пример 2. Некоторые запросы требуют сканирования всей таблицы или всего индекса. Это разрушает кеш, и производительность падает с обрыва.

Пример 3: Указатель на UUID. Это очень случайный индекс. «Следующий» UUID, который вы вставляете или выбираете, не будет иметь отношения к другим, которые вы недавно затронули. Следовательно, вам, скорее всего, понадобится попасть на диск, когда данные/индекс слишком большие для ОЗУ. Здесь производительность постепенно ухудшается.

Я считаю, что снижение производительности представляет собой комбинацию размера данных/индекса, шаблонов доступа, размеров кеша и размера ОЗУ. Не только цифры, на которые вы смотрите.

Смежные вопросы