Mengapa menggunakan innodb_file_per_table?
Karena lebih mudah untuk mengelola individu karena dapat dilakukan di tingkat file. Ini berarti bahwa bahkan jika server sedang down, Anda masih dapat menyalin data dengan menyalin file tabel sedangkan menggunakan ruang tabel bersama berarti baik menyalin segala sesuatu yang bisa sangat besar, atau menemukan beberapa cara untuk membuat server berjalan untuk mengekstraksi data ( Anda benar-benar tidak ingin mengekstrak data secara manual dengan hex-editor).
Seseorang memperingatkan bahwa Anda tidak bisa hanya menyalin dan menempel .ibd
file dari satu server ke yang lain. Ini mungkin benar, tetapi seharusnya tidak berlaku untuk cadangan di server yang sama (Saya menggunakan istilah cadangan di sini dalam arti tradisional membuat salinan; yaitu, tidak secara drastis mengubah semuanya). Selain itu, ibdata1
secara otomatis dibuat kembali saat startup (seperti terlihat pada langkah hapusibdata1
sebagian besar panduan "konversi ke file-per-tabel"). Dengan demikian, Anda tidak perlu menyalin ibdata1
selain .ibd
file Anda (dan file yang sesuai .frm
, dll.).
Jika mencoba memulihkan tabel yang hilang, itu harus cukup untuk menyalin .ibd
dan .frm
file-nya, dan juga information_schema
(yang jauh lebih kecil dari ibdata1
). Dengan begitu, Anda bisa meletakkannya di server dummy dan mengekstrak meja Anda tanpa harus menyalin keseluruhannya.
Namun, klaim untuk kinerja yang lebih baik masih dipertanyakan. … Dengan innodb_file_per_table, lebih banyak operasi I / O disk diperlukan; dan ini penting dalam kendala GABUNGAN dan KUNCI LUAR NEGERI yang rumit.
Tidak mengherankan, kinerja akan bergantung sepenuhnya pada database tertentu yang digunakan. Satu orang akan memiliki (bahkan sangat) hasil yang berbeda dari yang lain.
Memang benar bahwa akan ada lebih banyak operasi I / O disk dengan file-per-tabel, tetapi hanya sedikit lebih banyak. Pikirkan tentang bagaimana sistem bekerja.
Anda akan melihat bahwa ketika server sedang berjalan, Anda tidak dapat memindahkan file data karena server memiliki pegangan terbuka untuk mereka. Ini karena ketika dijalankan, itu akan membukanya dan membiarkannya terbuka. Itu tidak membuka dan menutup mereka untuk setiap permintaan individu.
Dengan demikian, hanya ada beberapa operasi I / O di awal, ketika server mulai; tidak saat sedang berjalan. Lebih lanjut, sementara masing-masing .ibd
file memiliki overhead yang terpisah (tanda tangan file, struktur, dll.), Mereka di-cache dalam memori dan tidak dibaca kembali untuk setiap permintaan. Selain itu, struktur yang sama dibaca bahkan dengan ruang tabel bersama, sehingga hampir tidak ada (jika ada sama sekali) lebih banyak memori yang diperlukan.
Apakah innodb_file_per_table berpengaruh pada kinerja mysql yang lebih baik?
Sebenarnya, jika ada, kinerja sebenarnya mungkin lebih buruk .
Saat menggunakan ruang tabel bersama, operasi baca dan tulis kadang-kadang dapat / sering digabungkan sehingga server membaca kumpulan data dari beberapa tabel sekaligus ibdata
.
Namun, jika data tersebar di antara beberapa file, maka harus melakukan operasi I / O terpisah untuk masing-masing file secara individual.
Tentu saja ini sekali lagi sepenuhnya tergantung pada database yang dimaksud; dampak kinerja dunia nyata akan tergantung pada ukuran, frekuensi kueri, dan fragmentasi internal ruang tabel bersama. Beberapa orang mungkin melihat perbedaan besar sementara yang lain mungkin tidak melihat dampak sama sekali.
Tablespace dibagi pada ibdata tunggal; bagaimana tablespace khusus untuk tabel terpisah dapat menghemat ruang disk?
Itu tidak. Jika ada, itu meningkatkan penggunaan disk.
Saya tidak memiliki database 60GB untuk diuji, tetapi database pribadi "remeh" yang berisi instalasi WordPress saya dan beberapa tabel kecil untuk penggunaan pribadi dan pengujian pengembangan ditimbang pada ~ 30MB saat menggunakan ruang-tabel bersama. Setelah mengonversinya menjadi file-per-tabel, itu membengkak hingga ~ 85MB. Bahkan dengan menjatuhkan semuanya dan mengimpor kembali, itu masih> 60MB.
Peningkatan ini disebabkan oleh dua faktor:
The minimum absolut ukuran untuk ibdata1
adalah-untuk beberapa alasan-10MB, bahkan jika Anda memiliki apa-apa selain information_schema
yang tersimpan di dalamnya.
Dengan ruang tabel bersama, hanya ibdata1
memiliki overhead seperti tanda tangan file, meta-data, dll, tetapi dengan per-tabel, setiap .ibd
file individu memiliki semua itu. Ini berarti bahwa total (bahkan dengan hipotetis <10MB ibdata1
) akan sedikit lebih besar setidaknya:
GetTotalSizeofOverhead() * GetNumTables()
Jelas ini tidak akan menjadi peningkatan besar (kecuali jika Anda menggunakan host yang membatasi ukuran database Anda atau menyimpannya di flash-drive, dll), tetapi mereka tetap meningkat, dan sambil beralih ( setiap ) tabel ke file -per-tabel Anda dapat menyusut ibdata1
hingga 10MB, total keseluruhan akan selalu lebih dari itu.