Boş bir sütun değeri, doldurulmuş bir sütun değeriyle aynı depolama alanını kaplıyor mu?


16

2 sütunlu bir tablo var. Her iki sütunun türü olarak ayarlanır varchar(38). Sütunlardan biri için boş bir değere sahip bir satır oluşturursam, değer boş değilse aynı depolama alanını alacak mı?

Başka bir deyişle, MySQL bir satır oluşturulduğunda sütun için (türüne bağlı olarak) depolama alanı ayıracak mı?

Yanıtlar:


11

Gönderen YEDEKLİ ROW_FORMAT altında InnoDB Fiziksel Satır Yapısı, Bulletpoint 7.

SQL NULL değeri, kayıt dizininde bir veya iki bayt ayırır. Bunun yanı sıra, bir SQL NULL değeri değişken uzunluklu bir sütunda saklanırsa kaydın veri kısmında sıfır bayt ayırır . Bir de sabit uzunluklu kolonu, bu kaydın veri kısmında kolonun sabit uzunluğa sahiptir. Sabit alanın NULL değerleri için ayrılması, dizin sayfasının parçalanmasına neden olmadan sütunun NULL'dan NULL olmayan bir değere güncellenmesini sağlar.

Gönderen KOMPAKT ROW_FORMAT altında InnoDB Fiziksel Satır Yapısı, Bulletpoint 2.

Kayıt başlığının değişken uzunluktaki kısmı, NULL sütunları belirtmek için bir bit vektörü içerir. Dizinde NULL olabilecek sütun sayısı N ise, bit vektörü CEILING (N / 8) baytını işgal eder . (Örneğin, NULL olabilen 9 ila 15 sütun arasında herhangi bir yer varsa, bit vektörü iki bayt kullanır.) NULL olan sütunlar, bu vektördeki bit dışında bir alan işgal etmez . Üstbilginin değişken uzunluktaki kısmı, değişken uzunluktaki sütunların uzunluklarını da içerir. Her uzunluk, sütunun maksimum uzunluğuna bağlı olarak bir veya iki bayt alır. Dizindeki tüm sütunlar BOŞ DEĞİLDİR ve sabit bir uzunluğa sahipse, kayıt üstbilgisinde değişken uzunlukta bir parça yoktur.

Bu madde işaretlerine dayanarak, NULLbir sütunun depolanması için bir değerin ne olduğu

  • değişken uzunluk: NULL değer satırın kendisinde depolama alanı oluşturmaz
  • sabit uzunluk: Ayrılmış alanı kaplar

Şimdi, CHAR ve VARCHAR kullanımı arasında ilk nokta ne ortaya çıktığı için karar vermelisiniz

NULL değerleri için sabit alan ayırmak, dizin sayfasının parçalanmasına neden olmadan sütunun NULL değerinden NULL olmayan bir değere güncellenmesini sağlar

Bu, NULL olmayan veriler saklandıktan sonra bir satırın yoldan aşağıya herhangi bir şekilde parçalanmasını önleyecektir. Bu MyISAM açısından daha önce tartıştığımız bir şeydir: benim eski sonrası bakın sabit boyutlu sahada VARCHAR vs CHAR kullanmanın performans etkisi nedir? .


Merhaba Rolando, bahsetmeyi unuttuğum başka bir öğe daha vardı, varchar (5) ve varchar (100) tipi bildirimi arasındaki bellek ayırma farkı. Ya da gerçekten aşırı tahsis nedeniyle oluşan ceza.
Craig Efrein

@CraigEfrein Cevabınıza kesinlikle bellek ayırma eklemeniz gerekir. (BTW zaten cevap upvoted)
RolandoMySQLDBA

1
Aşırı tahsis cezası, SELECTgeçici tablo oluşturmanız gereken bir kompleksiniz olduğunda ortaya çıkar . Mümkünse, bu kullanacağız MEMORYve dönüştürmek VARCHARiçin CHARtmp tablo için. Şimdi VARCHAR(100)sabit bir 100 (veya 300) bayt alır, böylece muhtemelen sorguyu yavaşlatır.
Rick James

@RolandoMySQLDBA, Cevabınızda açıklanan davranış Mysql 5.7 DYNAMIC ve COMPACT satır biçimleri için uygulanabilir mi?
Dinesh Kumar

@DineshKumar Bu paragraflar hala 5.7 / 8.0 Dokümanlar'da. DYNAMIC için lütfen dev.mysql.com/doc/refman/5.7/en/innodb-row-format-dynamic.html adresine bakın .
RolandoMySQLDBA

8

Varchar sütununuz için tanımladığınız uzunluk ne olursa olsun, boş bir sütun tarafından kullanılan depolama alanı aynı olacaktır.

CHAR ve VARCHAR Çeşitleri

resim açıklamasını buraya girin

Bu yalnızca varchar sütununun kullandığı alanı ele alır ve satır tarafından kullanılan toplam depolama alanını, dizinlerini, birincil anahtarlarını ve diğer sütunları dikkate almaz.

Ypercube yorumunda belirtildiği gibi, en az bir boş sütun olduğunda bir bütün olarak satır depolaması için ek hususlar vardır.

Innodb Fiziksel Sıra Yapısı

Kayıt başlığının değişken uzunluktaki kısmı, NULL sütunları belirtmek için bir bit vektörü içerir. NULL olabilen 9 ila 15 sütun arasında herhangi bir yer varsa, bit vektörü iki bayt kullanır.)

...

Üstbilginin değişken uzunluktaki kısmı, değişken uzunluktaki sütunların uzunluklarını da içerir. Her uzunluk, sütunun maksimum uzunluğuna bağlı olarak bir veya iki bayt alır. Dizindeki tüm sütunlar BOŞ DEĞİLDİR ve sabit bir uzunluğa sahipse, kayıt üstbilgisinde değişken uzunlukta bir parça yoktur

Ve evet, kullanılan depolama alanı seçtiğiniz türe göre değişir, sabit veya değişken, harmanlama ve motor gibi diğer faktörlere göre değişir.

MySQL burada veri depolama alanını optimize etme konusunda önerilerde bulunur: Veri Boyutunu Optimize Etme

Güncelleme

Varchar ile ek bir düşünce ve bu hafıza. MySQL'de değişken uzunluktaki bir sütunun boyutunu olabildiğince sınırlamak önemlidir. Sütun değişken ve kullanılan depolama alanı değişken olsa da, MySQL değerleri depolamak için sabit parçalar halinde bellek ayıracaktır. Örneğin varchar (200), varchar (5) 'ten daha fazla bellek kullanacaktır. Bu bir depolama alanı sorunu değil, sütunlarınızı tanımlarken göz önünde bulundurulması gereken bir şeydir.


Yukarıdaki sayılar CHARACTER SETlatin1 veya ascii olduğunu varsayar . Utf8 için Gerekli Depolama Alanı CHAR(4)12'dir.
Rick James
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.