MySQL: добавить поле в большую таблицу - PullRequest
3 голосов
/ 05 марта 2010

У меня есть таблица с около 200 000 записей.я хочу добавить к нему поле:

 ALTER TABLE `table` ADD `param_21` BOOL NOT NULL COMMENT 'about the field' AFTER `param_20`

, но это кажется очень сложным запросом и занимает очень много времени, даже на моем Quad amd ПК с 4 ГБ оперативной памяти.

я работаю под windows / xampp и phpMyAdmin.mysql имеет дело с каждой записью при добавлении поля?или я могу изменить запрос, чтобы он сделал изменение быстрее?

Ответы [ 3 ]

5 голосов
/ 07 марта 2010

MySQL почти во всех случаях перестраивает таблицу во время ALTER **. Это связано с тем, что движки на основе строк (т. Е. Все они) ДОЛЖНЫ сделать это, чтобы сохранить данные в правильном формате для запросов. Это также потому, что вы можете внести множество других изменений, которые также потребуют перестройки таблицы (например, изменение индексов, первичных ключей и т. Д.)

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

Восстановление индексов действительно убийственно. В зависимости от того, как вы его настроили, MySQL будет либо: для каждого индекса помещать индексированные столбцы в буфер файловой сортировки (который может быть в памяти, но обычно находится на диске), сортировать его с помощью функции filesort () (которая выполняет быструю сортировку). путем рекурсивного копирования данных между двумя файлами (если они слишком велики для памяти), а затем построения полного индекса на основе отсортированных данных.

Если он не может выполнить трюк с сортировкой файлов, он будет вести себя так, как будто вы сделали INSERT для каждой строки, и по очереди заполнит блоки индекса данными каждой строки. Это мучительно медленно и приводит к далеко не оптимальным показателям.

Вы можете узнать, что он делает, используя SHOW PROCESSLIST во время процесса. «Восстановление с помощью сортировки файлов» - это хорошо, «Восстановление с помощью кеширования» - это плохо.

Все это будет использовать НАИБОЛЕЕ одно ядро, но иногда будет также связано с IO (особенно при копировании файла данных).

** Существуют некоторые исключения, такие как удаление вторичных индексов в таблицах плагинов innodb.

1 голос
/ 05 марта 2010

Вы добавляете столбец NOT NULL, кортежи должны быть заполнены. Так будет медленно ...

0 голосов
/ 05 марта 2010

Это касается каждой из 200 000 записей, поскольку каждая запись должна быть обновлена ​​новым значением bool, которое не будет нулевым.

Итак, да, это дорогой запрос ... Вы ничего не можете сделать, чтобы сделать его быстрее.

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