mysql "отбрасывать базу данных" требует времени - почему? - PullRequest
11 голосов
/ 29 сентября 2008

mysql5.0 с парой баз данных "A" и "B", обе с большими таблицами innodb. "удалить базу данных A;" замораживает базу данных "Б" на пару минут. Ничто не использует «А» в этот момент, так почему это такая интенсивная операция?

Бонусные баллы: учитывая, что мы используем «A», загружаем данные в «B», а затем переключаемся на «B», как мы можем сделать это быстрее? Удаление баз данных - это не та вещь, которую обычно приходится делать постоянно, так что это немного не по графику.

Ответы [ 3 ]

13 голосов
/ 29 августа 2009

Так что я не уверен Ответ Мэтта Рогиша поможет на 100%.

Проблема в том, что MySQL * имеет мьютекс (взаимоисключающую блокировку) вокруг открытия и закрытия таблиц, так что в основном это означает, что если таблица находится в процессе закрытия / удаления, нет других таблиц можно открыть.

Это описано моим коллегой здесь: http://www.mysqlperformanceblog.com/2009/06/16/slow-drop-table/

Одной из отличных стратегий снижения воздействия является использование файловой системы, такой как XFS.

Обходной путь уродлив. По сути, вам нужно откусить все данные в таблицах, прежде чем отбрасывать их (см. Комментарий № 11 по ссылке выше).

10 голосов
/ 30 сентября 2008

Следование скаффману:

Измените my.cnf (и перезапустите MySQL), включив в него:

innodb_file_per_table = 1

(http://mysqldba.blogspot.com/2006/12/innodbfilepertable.html)

Это предоставит вашим базам данных выделенное хранилище файлов и выведет его из общего пула. Затем он позволит вам делать забавные вещи, например размещать таблицы / индексы на разных физических дисках, чтобы еще больше разделить ввод-вывод и повысить производительность.

Обратите внимание, что это не меняет существующие таблицы; вам нужно будет поработать, чтобы получить их в свой файл (http://capttofu.livejournal.com/11791.html).

6 голосов
/ 29 сентября 2008

По умолчанию все базы данных innodb в данной установке сервера mysql используют один и тот же физический пул файлов данных, поэтому, по-видимому, «удаление базы данных A» может повлиять на базу данных B. Поскольку «удаление базы данных», вероятно, повлечет за собой многократный перезапуск innodb файлы данных, возможно, что это операция блокировки, либо из-за интенсивности операции, либо из-за замысла.

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

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