Çoğu senaryoda bir char sütununda yaptığınız gibi bir varchar sütununu görüntülemeye çalışmalı ve uzunluğu ölçülü bir şekilde ayarlamalısınız. Her zaman var değiştiriciyi, karar vermenizi maksimum uzunlukta etkileyen bir şey olarak düşünmek zorunda değilsiniz. Sağlanan dizelerin farklı uzunluklarda olacağı gerçekten bir performans ipucu olarak görülmelidir.
Veri tabanı içindekiler tarafından sıkı sıkıya uyulması gereken bir yönerge değildir, tamamen göz ardı edilebilir. Bununla birlikte, ideal bir dünyada olmaması gerekmesine rağmen bazen uygulama sızıntı yapabileceğinden (örneğin sabit uzunluk ve dolgu) buna dikkat edin.
Bir varchar (255) 'e sahipseniz, performans açısından her koşulda bir char (255) için her zaman farklı davranacağını garanti edemezsiniz.
Kılavuzda depolama gereksinimleri hakkında verilen tavsiyeler doğrultusunda 255, 65535, vb. Gibi bir şeye ayarlamak kolay görünebilir. Bu, 0 (evet, bu bir şey) ile 255 arasındaki herhangi bir değerin aynı etkiye sahip olacağı izlenimini verir. Ancak bu tamamen garanti edilebilecek bir şey değildir.
Depolama gereksinimleri, satır depolama açısından düzgün ve olgun kalıcı depolama motorları için doğru olma eğilimindedir veya iyi bir gösterge olma eğilimindedir. Dizinler gibi şeyler için o kadar güçlü bir gösterge değildir.
Bazen zor bir sorudur, bir ip parçası tam olarak ne kadar uzun olmalıdır ki, onu içinde olması gerektiğini bildiğiniz en yüksek sınıra ayarlamak, ancak bunun hiçbir etkisi yoktur. Ne yazık ki bu genellikle kullanıcının yapması gereken bir şeydir ve gerçekten biraz keyfi bir durumdur. Bir dizeyi asla büyütme diyemezsiniz çünkü tam olarak emin olmadığınız durumlar olabilir.
MySQL sorgularının, bir dizi çok uzun olduğunda, kesilmek yerine bir hata attığından emin olmalısınız, böylece en azından hata emisyonlarından çok kısa olup olmadığını bilirsiniz. Sütunları büyütmek veya küçültmek için yeniden boyutlandırmak pahalı bir DDL işlemi olabilir, bu akılda tutulmalıdır.
Uzunluk ve performansın devreye girdiği yerde karakter seti de dikkate alınmalıdır. Uzunluk, bayt yerine bunu ifade eder. Örneğin utf8 kullanılıyorsa (MB4 değil), o zaman varchar (255) gerçekten değişken ikili (3 * 255) 'dir. Testler yapmadan ve kaynak koduna / belgelere derinlemesine bakmadan böyle şeylerin nasıl sonuçlanacağını bilmek zor. Bu nedenle, beklenmedik şekilde şişirilmiş bir etkiye sahip olmak için aşırı uzunluğun kapsamı vardır. bu sadece performans için geçerli değildir. Bir gün bir varchar sütununun karakter kümesini daha büyük bir değere değiştirmeniz gerekiyorsa, gereksiz yere uzun dizelerin mevcut olmasına izin verdiyseniz, kaçınılabilecek herhangi bir rücu olmadan bir sınıra ulaşabilirsiniz. Bu normalde oldukça niş bir sorundur ama ortaya çıkıyor,
MAX (LENGTH (sütun)) değerinin her zaman <64 olduğu ortaya çıkarsa (örneğin, sütun tanımıyla eşleşmeyen bir girdi sınırı olacağına karar verilmişse), ancak varchar (255) varsa, o zaman bir Bazı senaryolarda gerekenden dört kat daha fazla alan kullanma şansınız yüksektir.
Bu şunları içerebilir:
- Farklı motorlar, bazıları tamamen görmezden gelebilir.
- Tampon boyutları, örneğin güncelleme veya ekleme tam 255'i tahsis etmek zorunda kalabilir (bunu kanıtlamak için kaynak kodunu kontrol etmemiş olsam da, bu sadece bir varsayımdır).
- Dizinler, çok sayıda varchar (255) sütundan bir bileşik anahtar yapmaya çalışırsanız, bu hemen anlaşılacaktır.
- Ara tablolar ve olası sonuç kümeleri. İşlemlerin çalışma şekli göz önüne alındığında, bir şeyin tanımlanan sınırın aksine bir sütundaki dizelerin gerçek maksimum uzunluğunu kullanması her zaman mümkün olmayabilir.
- Dahili tahmin optimizasyonları, maksimum uzunluğu girdi olarak alabilir.
- Veritabanı uygulama versiyonlarındaki değişiklikler.
Genel bir kural olarak, bir varchar'ın olması gerekenden daha uzun olmasına gerçekten gerek yoktur, performans sorunları olsun ya da olmasın, bu yüzden mümkün olduğunda buna bağlı kalmanızı öneririm. Verilerinizin boyutunu örneklemek, gerçek bir sınır uygulamak veya sorarak / araştırarak gerçek sınırı bulmak için daha fazla çaba sarf etmek ideal yaklaşımdır.
Yapamadığınızda, şüpheli durumlarda varchar (255) gibi bir şey yapmak istiyorsanız, o zaman bilim yapmanızı tavsiye ederim. Bu, tabloyu çoğaltmaktan, var char sütununun boyutunu küçültmekten ve ardından veriyi orijinalden içine kopyalamaktan ve dizin / satır verilerinin boyutuna bakmaktan (sütunu indeksleyin, ayrıca bunu birincil anahtar olarak deneyin) içerebilir. satırlar birincil anahtara göre sıralandığından InnoDB'de farklı davranabilir). En azından bu şekilde, en hassas darboğazlardan biri olma eğiliminde olan IO üzerinde bir etkinizin olup olmadığını anlayacaksınız. Bellek kullanımını test etmek daha zordur, bunu kapsamlı bir şekilde test etmek zordur. Olası en kötü durumları test etmenizi tavsiye ederim (bellek sonuçlarında çok sayıda ara sonuç içeren sorgular, büyük geçici tablolar için açıklamayla kontrol edin, vb.).
Tabloda çok fazla satır olmayacağını biliyorsanız, sütunu birleşimler, dizinler (özellikle bileşik, benzersiz), vb. İçin kullanmayacaksınız, o zaman büyük olasılıkla pek çok sorun yaşamayacaksınız.
VARCHAR(255) utf8mb4
~ 150.000 satıra sahip tek bir indekslenmiş sütuna sahip bir tablo 11.5MB olarak ölçülmüştür.VARCHAR(48) utf8mb4
Aynı verilere (maksimum uzunluk 46 karakter) sahip indekslenmiş bir sütuna sahip bir tablo 4.5MB kullandı. Sorgularda gerçekten büyük bir fark değil, dizine alınmış. Ancak, sorgu G / Ç ve veritabanı yedeklemeleri gibi şeylerle birleşir.