Зачем использовать innodb_file_per_table?
Потому что легче управлять человеком, так как это можно сделать на уровне файлов. Это означает, что даже если сервер не работает, вы все равно можете копировать данные, копируя файлы таблиц, тогда как использование общего табличного пространства означает либо копирование всего, что может быть излишне массивным, либо поиск какого-либо способа заставить сервер работать для извлечения данных ( Вы действительно не хотите извлекать данные вручную с помощью hex-редактора).
Кто-то предупредил, что нельзя просто копировать и вставлять .ibd
файлы с одного сервера на другой. Это может быть правдой, но это не должно применяться к резервным копиям на том же сервере (здесь я использую термин « резервное копирование» в традиционном смысле создания копии; т. Е. Не радикально изменяя все это). Более того, ibdata1
он автоматически воссоздается при запуске (как видно на этапе удаленияibdata1
большинства руководств по «преобразованию в файл на таблицу»). Таким образом, вам не нужно копировать ibdata1
в дополнение к вашим .ibd
файлам (и их соответствующие .frm
, и т. Д. Файлы).
Если вы пытаетесь восстановить потерянную таблицу, ее должно быть достаточно, чтобы скопировать ее .ibd
и .frm
файл, а также information_schema
(что намного меньше, чем ibdata1
). Таким образом, вы можете поместить их на фиктивный сервер и извлечь свою таблицу, не копируя всю массивную информацию.
Однако претензия на лучшую производительность сомнительна. … С помощью innodb_file_per_table требуется больше операций дискового ввода-вывода; и это важно для сложных соединений и ограничений FOREIGN KEY.
Неудивительно, что производительность будет полностью зависеть от конкретной используемой базы данных. Один человек будет иметь (даже очень) разные результаты от другого.
Это правда, что будет больше операций дискового ввода-вывода с файлом на таблицу, но только немного больше. Подумайте, как работает система.
Вы заметите, что когда сервер работает, вы не можете перемещать файлы данных, потому что у сервера есть открытые дескрипторы к ним. Это потому, что когда он запускается, он открывает их и оставляет их открытыми. Он не открывает и не закрывает их для каждого отдельного запроса.
Таким образом, есть только несколько операций ввода-вывода в начале, когда сервер запускается; нет, пока он работает. Кроме того, хотя каждый отдельный .ibd
файл имеет свои отдельные служебные данные (подписи файлов, структуры и т. Д.), Они кэшируются в памяти и не перечитываются для каждого запроса. Более того, одни и те же структуры читаются даже с общим табличным пространством, поэтому требуется чуть больше (если вообще вообще имеется) больше памяти.
Влияет ли innodb_file_per_table на лучшую производительность mysql?
На самом деле, если что - нибудь, производительность на самом деле может быть хуже .
При использовании общего табличного пространства операции чтения и записи могут иногда / часто комбинироваться так, чтобы сервер считывал набор данных из нескольких таблиц за один раз ibdata
.
Однако если данные распределены по нескольким файлам, то для каждого из них необходимо выполнить отдельную операцию ввода-вывода.
Конечно, это снова полностью зависит от рассматриваемой базы данных; реальное влияние на производительность будет зависеть от размера, частоты запросов и внутренней фрагментации общего табличного пространства. Некоторые люди могут заметить большую разницу, в то время как другие могут вообще не видеть никакого воздействия.
Табличное пространство используется совместно для одной ибдаты; Как выделенные табличные пространства для отдельных таблиц могут сэкономить дисковое пространство?
Это не. Во всяком случае, это увеличивает использование диска.
У меня нет базы данных объемом 60 ГБ для тестирования, но моя «ничтожная» личная база данных, которая содержит мою установку WordPress и несколько небольших таблиц для личного использования и тестирования разработки, весила ~ 30 МБ при использовании общего табличного пространства. После преобразования в файл на таблицу, он разросся до ~ 85 МБ. Даже если отбросить все и повторно импортировать, оно все равно> 60 МБ.
Это увеличение связано с двумя факторами:
Абсолютный минимум размер ibdata1
есть, по какой - то причине-10MB, даже если у вас нет ничего , но information_schema
в нем хранятся.
В совместно используемом табличном пространстве только ibdata1
накладные расходы, такие как подписи файлов, метаданные и т. Д., Но в каждой таблице каждый отдельный .ibd
файл имеет все это. Это означает, что общий объем (даже при гипотетическом <10 МБ ibdata1
) будет несколько больше по крайней мере:
GetTotalSizeofOverhead() * GetNumTables()
Очевидно, что это не приведет к значительному увеличению (если вы не используете хост, который ограничивает размер вашей базы данных или хранит их на флэш-накопителе и т. Д.), Но, тем не менее, они увеличиваются, и в то же время путем переключения ( каждой ) таблицы в файл - за столом вы можете уменьшить ibdata1
его до 10 МБ, общий объем всегда будет больше, чем был.