Neden innodb_file_per_table kullanıyorsunuz?
Çünkü dosya düzeyinde yapılabildiğinden, bireyi yönetmek daha kolaydır. Bu, sunucu kapalı olsa bile, tablo dosyalarını kopyalayarak verileri kopyalayabileceğiniz anlamına gelir; oysa paylaşılan bir tablo alanı kullanmak , gereksiz yere büyük olabilecek her şeyi kopyalamak veya sunucunun veri ayıklamak için çalışmasını sağlamak için bir yol bulmak anlamına gelir ( verileri gerçekten bir hex-editor ile elle çıkarmak istemiyorsunuz).
Birisi , .ibd
dosyaları bir sunucudan diğerine kopyalayıp yapıştıramadığınız konusunda uyardı . Bu doğru olabilir, ancak aynı sunucudaki yedeklemeler için geçerli olmamalıdır ( burada geleneksel olarak bir kopya oluşturma anlamında yedekleme terimini kullanıyorum ; yani her şeyi büyük ölçüde değiştirmemek). Ayrıca, ibdata1
başlangıçta otomatik olarak yeniden oluşturulur ( çoğu "tablo başına dosyaya dönüştürme" kılavuzlarının silmeibdata1
adımlarında görüldüğü gibi ). Bu nedenle, do not kopyalamanız gerekir ibdata1
sizin ek olarak .ibd
dosyaları (ve onların tekabül .frm
vb dosyaları).
Kayıp bir tablo kurtarmaya çalışırken, o onun kopyalamak yeterli olmalıdır .ibd
ve .frm
dosyayı yanı sıra information_schema
(ki çok daha küçük ibdata1
). Bu şekilde, onları sahte bir sunucuya yerleştirebilir ve masif bir şeyi kopyalamak zorunda kalmadan masanızı çıkarabilirsiniz.
Ancak, daha iyi performans iddiası sorgulanabilir. … İnnodb_file_per_table ile daha fazla disk G / Ç işlemi gerekir; ve bu karmaşık JOIN'lerde ve DIŞ ANAHTAR kısıtlamalarında önemlidir.
Şaşırtıcı olmayan bir şekilde, performans tamamen kullanımdaki spesifik veri tabanlarına bağlı olacaktır. Bir kişi diğerinden farklı sonuçlara sahip olacak
Tablo başına dosya ile daha fazla disk G / Ç işlemi olacağı doğrudur, ancak yalnızca biraz daha fazla. Sistemin nasıl çalıştığını düşünün.
Sunucu çalışırken, sunucuda açık tutamaçlar olduğundan veri dosyalarını taşıyamayacağınızı fark edeceksiniz. Bunun nedeni, başladığında, onları açıp, açık bırakmasıdır. Her bir sorgu için bunları açıp kapatmaz.
Bu nedenle, başlangıçta, sunucu başlatıldığında yalnızca biraz daha fazla G / Ç işlemi vardır; çalışırken değil. Ayrıca, her bir .ibd
dosyanın kendi ayrı ek yükü (dosya imzaları, yapıları vb.) Varken, bellekte önbelleğe alınır ve her sorgu için yeniden okunmaz. Dahası, aynı yapılar paylaşılan bir masa boşluğunda bile okunur, bu nedenle daha fazla (hiç bir şekilde) daha fazla hafıza gerekli değildir.
İnnodb_file_per_table, mysql'in daha iyi performansına etki eder mi?
Aslında, bir şey olursa, performans aslında daha kötü olabilir .
Paylaşılan bir tablo alanı kullanırken, okuma ve yazma işlemleri bazen / sıklıkla birleştirilebilir, böylece sunucu bir seferde birden fazla tablodan bir veri örneğini okuyabilir ibdata
.
Ancak, veriler birden fazla dosya arasında dağıtılmışsa, her biri için ayrı ayrı ayrı bir G / Ç işlemi gerçekleştirmesi gerekir.
Tabii ki, bu yine tamamen söz konusu veritabanına bağlıdır; gerçek dünyadaki performansın etkisi, büyüklüğüne, sorgu sıklığına ve paylaşılan tablo alanının iç parçalanmasına bağlı olacaktır. Bazı insanlar büyük bir fark görebilirken, diğerleri hiç bir etki görmeyebilir.
Tablo alanı, tek ibdata üzerinde paylaşılır; Ayrı tablolar için tahsis edilmiş tablolar nasıl disk alanı kazanabilir?
O değil. Bir şey olursa, disk kullanımını biraz arttırır .
Test etmek için 60 GB'lık bir veritabanım yok, ancak WordPress kurulumumu ve kişisel kullanım ve geliştirme testi için paylaşılan bir masa alanını kullanırken ~ 30 MB'de tartılan bazı "küçük" masaları ve WordPress kurulumumu içeren "birinci sınıf" kişisel veritabanım var. Tablo başına dosyaya dönüştürdükten sonra, ~ 85MB'a şişirilmiş. Her şeyi bırakıp yeniden ithal ederek bile, hala> 60 MB'dı.
Bu artış iki faktörden kaynaklanmaktadır:
Bunun için mutlak asgari boyut ibdata1
, bir nedenden ötürü, information_schema
içinde saklanmış olan hiçbir şey olmasa bile, 10 MB'dir .
Paylaşılan bir tablo alanıyla, yalnızca ibdata1
dosya imzaları, meta-veriler vb .ibd
. Bu, toplamın (varsayımsal <10MB olsa bile ibdata1
) en azından biraz daha büyük olacağı anlamına gelir :
GetTotalSizeofOverhead() * GetNumTables()
Açıkçası, bunlar büyük artışlar olmayacak (veritabanı boyutunuzu sınırlayan bir ana bilgisayar kullanıyorsanız veya bir flash sürücüde saklıyorsanız vs.), ancak yine de ( her ) tabloyu dosyaya geçirerek artarlar. -per-masa 10 ibdata1
MB'a kadar küçültebilir , toplam toplam kaçınılmaz olduğundan daha fazla olacaktır.