2013-04-30 17 views
6

ile endeks için boş uzunluk maksimum değeri, MySQL 5.6'nın sadece varchar (veya diğer metin tabanlı türlerin) the first 767 bytes dizinini okuyabildiğini okuyorum. Şema karakter kümem utf-8, dolayısıyla her karakter 3 bayta kadar saklanabilir. 767/3 = 255.66'dan beri bu, 255 karakterde endekslenmesi gereken bir metin sütununun maksimum uzunluğunu gösterir. varchar(256) içinInnoDB ve UTF-8

create table gaga (
    val varchar(255), 
    index(val) 
) engine = InnoDB; 

Ama val tanımını değiştirerek bir ":; max anahtar uzunluğu 767 bayt 1071. Belirtilen anahtar çok uzundu Hata Kodu" verir: Deneyim aşağıdaki geçerken bunu doğrular gibiydi.

Bu günde, 255 karakter sınırlaması çok düşük görünüyor, bu nedenle: bu doğru mu? MySQL ile endeksli büyük metin parçaları elde etmenin en iyi yolu nedir? (Bundan kaçınmalı mıyım? Bir SHA depolamalı mı? Başka bir tür indeks kullan? Başka bir veri tabanı karakter kodlaması kullan?)

cevap

7

Sınırlama saçma gibi görünse de, bu kadar uzun bir varchar için indekse ihtiyacınız varsa alan. 767 byte olsa bile, dizin boyutu çok hızlı büyür ve büyük bir tablo için (en kullanışlı olduğu yerde) büyük olasılıkla belleğe sığmaz.

Diğer taraftan, uzun bir varchar alanını indekslemem gereken en azından benim tecrübemdeki tek sık rastlanan durum benzersiz bir kısıtlamadır. Ve tüm bu durumlarda varchar alanından bir grup id ve MD5 kompozit indeksi yeterliydi. Tek sorun, her durumda benim ikili harmanlama kullandığım halde, bu yüzden bir sorun teşkil etmese de, vaka-duyarsız harmanlamayı taklit etmektir (aksanlı kırıklar ve vurgulu olmayan eşitliği dikkate alır).

UPD. Uzun bir varcharın endekslenmesi için sıkça görülen başka bir durum sipariş vermektir. Bu durumda genellikle veri dağıtımına bağlı olarak 5-15 karakterlik bir önek olan ayrı bir dizinlenmiş sıralayıcı alanı tanımlarım. Benim için, nadiren yanlış sıralamaya göre kompakt bir dizin daha fazla tercih edilir.