самый эффективный способ добавить индекс в большую таблицу MySQL - PullRequest
4 голосов
/ 10 сентября 2010

У меня есть база данных mysql с определенной таблицей с чуть более 6 миллионами строк и без индексов. Простой запрос, такой как SELECT ... FROM log ORDER BY log_date ASC, займет недопустимое количество времени. Мне, очевидно, нужно добавить индексы в таблицу, но я не уверен в наиболее эффективном способе сделать это.

1) Моим первым вариантом было бы выдать ALTER TABLE log ADD INDEX log_date, но я не уверен, сколько времени это займет ... это займет примерно столько же времени, что и предыдущий запрос? Если это так, это недопустимо.

2) Второй вариант - экспортировать таблицу, TRUNCATE таблицу, выполнить оператор ALTER TABLE, а затем повторно импортировать данные таблицы. Я не уверен, сколько времени потребуется для повторного импорта данных, и я обеспокоен тем, что произойдет, если система попытается записать строки в таблицу во время процесса.

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

Ответы [ 2 ]

7 голосов
/ 31 мая 2011

Наши эксперименты показали, что лучший ответ с точки зрения производительности - создать новую пустую таблицу и добавить к ней индекс, а затем скопировать в нее исходную таблицу. Затем переименуйте старую таблицу в новое имя, дайте новой таблице правильное имя и, наконец, удалите старую таблицу.

3 голосов
/ 10 сентября 2010

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

Подумайте об этом: если MySQL импортирует данные таблицы и строит индекс одновременно, то при каждой вставленной строке он должен не только вставлять эту строку, но и вставлять строку в индекс. Это будет медленнее, чем простое построение индекса на основе уже имеющихся данных. С другой стороны, если вы полностью восстановите данные и затем создадите индекс, вы вернетесь к варианту 1, но в то же время будете бессмысленно очищать и пополнять таблицу.

Я не думаю, что вы получите лучшую производительность, чем вы можете, просто прикусив пулю и введя команду ALTER TABLE. Возможно, вы можете запланировать выполнение команды в то время, когда уровень использования ниже, например, среди ночи ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...