Навіщо використовувати innodb_file_per_table?
Тому що легше керувати особами, оскільки це можна зробити на рівні файлів. Це означає, що навіть якщо сервер не працює, ви все одно можете скопіювати дані, скопіювавши файли таблиць, тоді як використання спільного простору таблиць означає або копіювати все, що може бути непотрібним, або знайти спосіб запустити сервер для отримання даних ( ви дійсно не хочете вручну витягувати дані за допомогою шестигранного редактора).
Хтось попередив, що ви не можете просто копіювати та вставляти .ibd
файли з одного сервера на інший. Це може бути правдою, але це не повинно поширюватися на резервні копії на одному сервері (я тут використовую термін резервне копіювання в традиційному розумінні, щоб зробити копію; тобто не кардинально змінювати всю справу). Більше того, ibdata1
він автоматично відтворюється при запуску (як видно на етапі видаленняibdata1
більшості посібників "перетворення файлів на таблицю"). Таким чином, вам не потрібно копіювати ibdata1
додатково свої .ibd
файли (та їх відповідні .frm
тощо файли).
Якщо ви намагаєтеся відновити втрачену таблицю, її достатньо скопіювати .ibd
та .frm
файл, а також information_schema
(що набагато менше, ніж ibdata1
). Таким чином, ви можете помістити їх на фіктивний сервер і витягнути свою таблицю, не копіюючи всю масову річ.
Однак претензія на кращі показники роботи сумнівна. … Із innodb_file_per_table потрібно більше операцій вводу / виводу диска; і це важливо при складних обмеженнях JOIN і 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 МБ, загальний загальний результат незмінно буде більшим, ніж було.