2010-05-24 2 views
5

У меня 10 миллионов строк в моей таблице в MySQL и 7 индексов в этой таблице. Теперь, когда я пытаюсь добавить 8-е, для этого требуется бесконечное время. Есть ли способ решить эту проблему, чтобы добавить быстрый и быстрый 8-й индекс?Как создать индекс быстрее?

+0

Это не должно быть бесконечным. Просьба представить подробную информацию о вашей схеме и индексе таблицы. –

+0

И если это происходит «навсегда», проверьте, нет ли у вас места на диске где-то еще - для создания индексов может потребоваться огромное количество временного пространства. – nos

+0

Это своего рода ошибка MySQL, что каждый следующий индекс занимает больше времени. У меня есть 400 МБ реального и 1,6 МБ swap mem, и он вообще не используется при создании индекса, и у меня есть 20 ГБ пространства –

ответ

2

Это один из тысяч способов, которыми MySQL просто отстой. По дизайну ...

Детали: http://lists.mysql.com/mysql/202489

, и я не волнует, если я потеряю карму за этот ответ.

+0

Да, я думаю, что я говорю о –

+0

. Я был потрясен, когда увидел, что выполнение ALTER TABLE для изменения значения по умолчанию - или nullability - столбца было выполнено путем копирования всей таблицы и воссоздания всех индексов. Эти вещи занимают очень мало времени на других DMBS; рекомендуемый способ сделать это в MySQL для больших таблиц - это обмануть файловую систему - изменить определение таблицы пустым файлом данных и вернуть полный файл данных. –

+1

Постер этой статьи совершенно неверен. MySQL во многих случаях восстанавливает таблицы, когда вы выполняете ALTER TABLE, но никогда не перестраивает таблицу более одного раза за оператор ALTER; кроме того, вы можете сделать любое количество модификаций с одним ALTER, если хотите. – MarkR

5

Нет, время, необходимое для создания индекса, прямо пропорционально количеству данных, которые у вас есть. В MS SQL я создаю индексы на таблице с таким количеством записей за 10 минут.

РЕДАКТИРОВАТЬ: После просмотра комментария, пожалуйста, уточните на бесконечности. По определению вы говорите, что он никогда не заканчивается, мой ответ связан с длинным созданием индекса, а не бесконечным.

+0

Да, это заняло 15 минут –

+0

Тогда вы о хорошем как это происходит. Индексирование - очень интенсивная задача, особенно с большим количеством записей. –

0

Какой двигатель вы используете? Реализация ALTER TABLE ... CREATE INDEX значительно отличается.

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

Использование InnoDB, создание вторичного индекса не требует перестройки таблицы, но эта оптимизация доступна только в том случае, если вы используете плагин InnoDB (а не старый, отгруженный движок). Изменение первичного ключа всегда требует перестроения, поскольку оно кластеризовано.

Для восстановления таблицы (в любом случае) требуется большая работа, так как она должна перестроить все существующие индексы, а также переписать строки для завершения операции. Если ваша таблица соответствует ОЗУ (строки 10M звучат так, как будто это должно сделать легко), это относительно быстро.

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

Восстановление индивидуального индекса, который не подходит в плунжере, ОЧЕНЬ дорогой и его лучше избегать.

Как часто вам нужно добавлять новые индексы? Возможно, вы можете заполнить таблицы уже созданным индексом?

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