MySQL по-прежнему обрабатывает индексы таким образом?

8

Удаление дублирующего индекса в MySQL заняло довольно много времени, поэтому, пока я ждал, я искал его и нашел этот пост в 2006 году, рассказывая о том, как MySQL обрабатывает ADDи DROPиндексирует.

Если таблица T является таблицей MySQL, имеющей четыре индекса (ndx1, ndx2, ndx3, ndx4), и вы хотите «изменить таблицу T drop index ndx3;» вот что именно происходит под капотом:

1) MySQL копирует T.MYD во временную таблицу, т. Е. S.MYD и нулевой байт S.MYI. 2) MySQL изменяет таблицу S, добавляет индекс ndx1 (...); 3) MySQL изменяет таблицу S, добавляет индекс ndx2 (...); 4) MySQL изменяет таблицу S, добавляет индекс ndx4 (...); 5) MySQL удаляет T.MYD и удаляет T.MYI 6) MySQL переименовывает S.MYD в T.MYD и переименовывает S.MYI в T.MYI

Это все еще правда? Его совет остается в силе?

Учитывая ту же таблицу MyISAM T, имеющую четыре индекса (ndx1, ndx2, ndx3, ndx4), и вы хотите «изменить таблицу T drop index ndx3;» попробуйте это вместо:

1) создать таблицу T1 наподобие T; Это создает пустую таблицу T1 с индексами ndx1, ndx2, ndx3 и ndx4. 2) изменить таблицу T1, отбросить индекс ndx3; Это опустит индекс ndx3 на пустой T1, который должен быть мгновенным. 3) вставить в Т1 выбор * из Т; Это заполнит таблицу T и загрузит все три (3) индекса для T1 за один проход. 4) стол с опущенным столом T; 5) изменить таблицу T1 переименовать в T;

Как вы все справляетесь с добавлением и удалением индексов из больших таблиц?

JIStone
источник

Ответы:

14

Это то, как MySQL 4.x делал это, и это сильно меня раздражало.

Фактически, была формула, которую я вычислил, на сколько таких маневров индекса нужно было

Table with 0 indexes and adding 1 index tooks 1 temp table
Table with 1 index   and adding 1 index tooks 3 temp tables
Table with 2 indexes and adding 1 index tooks 6 temp tables
Table with 3 indexes and adding 1 index tooks 10 temp tables (I had eyewitnessed this !!!)
.
.
.
Table with n indexes and adding 1 index took (n + 1) X (n + 2) / 2 temp tables
.
.
.
Table with 16 indexes and adding 1 index took 153 temp tables

Хорошие новости, MySQL 5.x не делает этого !!!

Если бы MySQL 5.x сделал это, я был бы сегодня администратором PostgreSQL (без обид для PostgreSQL, это отличная СУБД сама по себе).

ОБНОВИТЬ

Боже мой, я прочитал пост !!! Этот пост пришел от меня !!!

Я никогда не думал, что кто-то выкопает этот пост.

Пожалуйста, оставьте такие вещи как мертвые и похороненные Теперь у меня есть воспоминания !!!

RolandoMySQLDBA
источник