MySQL Alter Table Увеличение памяти - PullRequest
2 голосов
/ 09 октября 2011

Я пытаюсь изменить 2000 таблиц, добавив столбец к каждой. Я достигаю этого, используя цикл for в C # и выполняя запрос по каждому имени таблицы для получения списка строк, которые у меня есть. Это начинается быстро, но затем становится все медленнее и медленнее. Память для mysql.exe увеличивается с 50К до 375К примерно за 30 секунд. Почему он это делает? После того, как я сделаю одну таблицу изменений, память снова должна выпасть. Не утилизируется ли какой-либо ресурс после каждого изменения? Кеш или буфер? Вывоз мусора? Я не могу закончить это для цикла, потому что он становится невероятно медленным после 20-25-го таблицы изменений.

1 Ответ

2 голосов
/ 09 октября 2011

Когда вы запускаете оператор alter table для MySQL, он начинает перестраивать таблицу.

Он выполняет следующие шаги:

  1. Копирует таблицу old в новыйфайл.
  2. Добавить столбец в определение файла new .frm-файл
  3. Добавить столбец в файл данных в new .myd-datafile, для этого требуется перезаписать весь файл данных.
  4. Просмотрите все строки в файле данных new, чтобы заполнить новый столбец значением по умолчанию
  5. Если новый столбец имеет индекс, MySQL должен выполнить шаги 2,3,4 длятакже .MYI-indexfile.
  6. Переименуйте old файл данных
  7. Переименуйте файл данных new, чтобы он имел то же имя, что и файл old.
  8. Удалите old файл данных

По соображениям производительности он попытается сохранить файл данных и индекса new в памяти.
Это увеличение памяти, которое вы видите.
MySQL будет хранить данные таблицы в памяти в течение некоторого времени и будет очищать кэш только в том случае, если память, выделенная для пространства кеша в My.ini, была исчерпана.

Вы можете очистить кэш, выполнив:

RESET QUERY CACHE;

После каждого оператора alter table.

См .: http://dev.mysql.com/doc/refman/5.0/en/query-cache-status-and-maintenance.html
Ознакомьтесь с проблемами кэша MySQLздесь: http://www.docplanet.org/mysql/mysql-query-cache-in-depth/

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