Benzer bir soru daha önce de sorulmuştu.
MySQL VARCHAR boyutlarının performans etkileri
İşte cevabımın alıntı
CHAR vs VARCHAR kullanmanın değişmezliğini gerçekleştirmelisin.
CHAR alanları ile tahsis ettiğiniz tam olarak ne elde ettiğinizdir. Örneğin, CHAR (15), alana ne kadar karakter koyduğunuz önemli değil, 15 bayt ayırır ve saklar. Veri alanının boyutu tamamen tahmin edilebilir olduğundan, dize manipülasyonu basit ve kolaydır.
VARCHAR alanları ile tamamen farklı bir hikaye edinirsiniz. Örneğin VARCHAR (15) aslında veri için en fazla 16 bayt, veri için 15 ve en az 1 veri baytını depolar. Eğer saklamak için 'merhaba' dizgesi varsa, 6 bayt alacaktır, 5 değil. Dize manipülasyonu her zaman her durumda bir miktar uzunluk kontrolü yapmalıdır.
İki şeyi yaptığınızda tradeoff daha belirgindir: 1. Milyonları veya milyarlarca satırı saklamak 2. CHAR veya VARCHAR olan sütunların indekslenmesi
TRADEOFF # 1 Açıkçası VARCHAR, değişken uzunluktaki veriler daha küçük satırlar ve dolayısıyla daha küçük fiziksel dosyalar üreteceğinden avantaj sağlar.
TRADEOFF # 2 CHAR alanları sabit alan genişlikleri nedeniyle daha az string işleme gerektirdiğinden, CHAR alanına karşı indeks aramaları VARCHAR alanlarına göre ortalama% 20 daha hızlıdır. Bu benim açımdan herhangi bir varsayım değil. MySQL Veritabanı Tasarımı ve Ayarlaması kitabı bunu kanıtlamak için MyISAM masasında muhteşem bir şey yaptı. Kitaptaki örnek şöyle bir şey yaptı:
ALTER TABLE tblname ROW_FORMAT=FIXED;
Bu yönerge, tüm VARCHAR'ları CHAR'lar gibi davranmaya zorlar. Bunu 2007'deki önceki işimde yaptım ve 300 GB'lık bir masa aldım ve başka bir şeyi değiştirmeden dizin aramalarını% 20 artırdım. Yayınlandığı gibi çalıştı. Ancak, neredeyse iki katı büyüklüğünde bir masa üretti, ancak bu sadece 1 numaralı tradeoff'a geri döndü.
MySQL'in sütun tanımı için neler önerdiğini görmek için depolanan verileri analiz edebilirsiniz. Sadece aşağıdakileri herhangi bir masaya karşı çalıştırın:
SELECT * FROM tblname PROCEDURE ANALYSE();
Bu, tüm tabloyu geçecek ve içerdiği verilere, minimum alan değerlerine, maksimum alan değerlerine ve benzerlerine bağlı olarak her sütun için sütun tanımları önerecektir. Bazen, CHAR vs VARCHAR'ı planlarken sağduyunuzu kullanmanız gerekir. İşte güzel bir örnek:
IP adreslerini saklıyorsanız, böyle bir sütunun maskesi en çok 15 karakterdir (xxx.xxx.xxx.xxx). Tam bir atlayışta CHAR(15)
zıplayacağım, çünkü IP adreslerinin uzunluğu o kadar fazla değişmeyecek ve ek bir bayt tarafından kontrol edilen dize manipülasyonunun karmaşıklığı da değişmeyecek. PROCEDURE ANALYSE()
Böyle bir sütuna karşı hala bir şey yapabilirsin . VARCHAR'ı bile önerebilir. Bu durumda param hala VARCHAR üzerinden CHAR'da olacaktı.
CHAR-VARCHAR sorunları sadece uygun planlama ile çözülebilir. Büyük güç ile büyük sorumluluk gelir (klişe ama gerçek).
GÜNCELLEME
MD5 söz konusu strlen
olduğunda, tüm satır formatı değiştirilirken dahili olarak hesaplanması elimine edilmelidir. Alan tanımını değiştirmeye gerek kalmayacaktı.
MD5 anahtarı yalnızca mevcut VARCHAR ise, bunun için gider ve tablo satır biçimini sabit hale getirirdim . Çok sayıda başka VARCHAR alanı mevcutsa, bunlar da fayda sağlar. Buna karşılık, masa, boyutunun yaklaşık iki katı kadar genişlerdi. Ancak, sorgular ilave ayar yapılmadan yaklaşık% 20 daha fazla hızlanmalıdır.