Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy jest jakaś różnica między varchar(10) i varchar(1000), gdy przechowujemy ciąg, którego długość jest mniejsza niż 10?

Zależy to całkowicie od używanego silnika DBMS. Sam SQL nie określa sposobu fizycznego przechowywania rzeczy, tylko logicznego ich postrzegania.

Na przykład Twój DBMS może przydzielić miejsce w rzędzie dla maksymalnego rozmiaru plus kilka dodatkowych bajtów do przechowywania długości. W takim przypadku byłaby duża różnica między varchar(10) i varchar(1000) ponieważ zmarnowałbyś sporo miejsca na rząd.

Alternatywnie może użyć puli buforów dla varchar dane i przechowuj tylko długość i "adres początkowy" puli buforów w wierszu. W takim przypadku każdy wiersz przechowywałby informacje o identycznych rozmiarach dla varchar kolumna niezależnie od jej rozmiaru, ale byłby dodatkowy krok do wyodrębnienia rzeczywistych danych z tej kolumny (po kliknięciu łącza do puli buforów).

Powód, dla którego używasz varchar właśnie dlatego nazywa się varchar . Umożliwia przechowywanie elementów danych o zmiennej wielkości. Zazwyczaj char(10) daje dziesięć znaków, bez względu na wszystko, dopełniając je spacjami, jeśli wstawisz coś krótszego. Możesz usuwać końcowe spacje podczas ich wyodrębniania, ale nie zadziała to tak dobrze, jeśli dane, które chcesz przechowywać, to w rzeczywistości "hello " , z spację, którą chcesz zachować.

Porządny silnik DBMS może zdecydować się na kompromis w zależności od maksymalnego rozmiaru varchar kolumna. W przypadku krótkich może po prostu przechowywać go w wierszu i zużywać dodatkowe bajty na rozmiar.

Dłuższy varchar kolumny mogą być „zlecone” do oddzielnej puli buforów, aby zapewnić wydajne odczytywanie wierszy (przynajmniej do czasu, gdy potrzebujesz duży varchar w każdym razie kolumna).

Musisz ponownie zadać pytanie dotyczące konkretnego DBMS, aby uzyskać bardziej ukierunkowaną odpowiedź.

Lub, szczerze mówiąc, zaprojektuj swoją bazę danych tak, aby przechowywała tylko maksymalny rozmiar. Jeśli wiesz, że to 10, to varchar(1000) jest marnotrawstwem. Jeśli w przyszłości będziesz musiał powiększyć kolumnę, to to czas, aby to zrobić, a nie teraz (patrz YAGNI ).

W przypadku MySQL warto zapoznać się z Chapter 14 Storage Engines dokumentacji online.

Obejmuje różne silniki pamięci masowej (takie jak InnoDB i MyISAM), których używa MySQL, a patrząc wystarczająco głęboko, możesz zobaczyć, w jaki sposób informacje są fizycznie przechowywane.

Na przykład w MyISAM obecność danych o zmiennej długości w tabeli (varchar włączone) zwykle oznacza tabele dynamiczne . Jest to schemat z grubsza analogiczny do koncepcji puli buforów, o której wspomniałem powyżej, z tą zaletą, że mniej miejsca jest marnowane na kolumny o zmiennej wielkości, a wadą jest to, że wiersze mogą ulec fragmentacji.

Innym formatem przechowywania (z dyskontem skompresowanym, ponieważ tak naprawdę jest używany tylko w przypadku tabel tylko do odczytu) jest statyczny , gdzie dane są przechowywane w jednym fizycznym rzędzie.

Informacje o fizycznych strukturach InnoDB można znaleźć tutaj . W zależności od tego, czy używasz formatu pliku Antelope, czy Barracuda, otrzymujesz sytuację „wszystkie informacje są fizycznym wierszem” lub „pulą buforów”, podobnie jak w przypadku rozróżnienia MyISAM między dynamicznym a statycznym.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wiele aplikacji Rails, pojedyncza baza danych MySQL

  2. Projekt bazy danych do tworzenia aplikacji internetowych „Quiz” przy użyciu PHP i MySQL

  3. Najszybszy sposób na konwersję/przetwarzanie Datatable na niestandardowy PSObject

  4. JPA:MySQL mówi, że tabela nie istnieje, ale faktycznie istnieje

  5. Ta sama nazwa dla pól formularza i pól tabeli bazy danych?