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

Czy istnieją wady używania ogólnego varchar(255) dla wszystkich pól tekstowych?

W pamięci VARCHAR(255) jest wystarczająco sprytny, aby przechowywać tylko potrzebną długość w danym wierszu, w przeciwieństwie do CHAR(255) który zawsze przechowuje 255 znaków.

Ale ponieważ oznaczyłeś to pytanie za pomocą MySQL, wspomnę o wskazówce dotyczącej MySQL:ponieważ wiersze są kopiowane z warstwy silnika pamięci masowej do warstwy SQL, VARCHAR pola są konwertowane na CHAR aby uzyskać przewagę pracy z rzędami o stałej szerokości. Tak więc ciągi w pamięci zostają wypełnione do maksymalnej długości z zadeklarowanych VARCHAR kolumna.

Gdy zapytanie niejawnie generuje tabelę tymczasową, na przykład podczas sortowania lub GROUP BY , może to zużywać dużo pamięci. Jeśli używasz dużo VARCHAR(255) pola dla danych, które nie muszą być tak długie, może to spowodować, że tabela tymczasowa będzie bardzo duża.

Możesz również chcieć wiedzieć, że to zachowanie „wypełniania” oznacza, że ​​ciąg zadeklarowany za pomocą zestawu znaków utf8 dopełnia się do trzech bajtów na znak, nawet w przypadku ciągów, które przechowujesz z zawartością jednobajtową (np. znaki ascii lub latin1). Podobnie zestaw znaków utf8mb4 powoduje, że ciąg jest wypełniany do czterech bajtów na znak w pamięci.

Więc VARCHAR(255) w utf8 przechowywanie krótkiego ciągu, takiego jak „Brak opinii”, zajmuje 11 bajtów na dysku (dziesięć znaków z niższego zestawu znaków, plus jeden bajt długości), ale zajmuje 765 bajtów w pamięci, a więc w tabelach tymczasowych lub posortowanych wynikach.

Pomogłem użytkownikom MySQL, którzy nieświadomie często tworzyli tabele tymczasowe o pojemności 1,5 GB i zapełniali swoje miejsce na dysku. Mieli dużo VARCHAR(255) kolumny, które w praktyce przechowują bardzo krótkie ciągi.

Najlepiej zdefiniować kolumnę na podstawie typu danych, które zamierzasz przechowywać. Ma korzyści z egzekwowania ograniczeń związanych z aplikacjami, o czym wspominali inni. Ale ma to fizyczne zalety, aby uniknąć marnowania pamięci, które opisałem powyżej.

Oczywiście trudno jest określić, jaki jest najdłuższy adres pocztowy, dlatego wiele osób wybiera długi VARCHAR to z pewnością jest dłuższe niż jakikolwiek adres. A 255 jest zwyczajowe, ponieważ jest to maksymalna długość VARCHAR dla których długość może być zakodowana jednym bajtem. Był to również maksymalny VARCHAR długość w MySQL starszym niż 5.0.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać czas z ciągu znaków w MySQL?

  2. Jaki jest odpowiednik MySQL funkcji CHOOSE() w SQL Server?

  3. Funkcja MySQL CEILING() — zaokrąglanie w górę do najbliższej liczby całkowitej

  4. Nie można zwrócić wyników z procedury składowanej za pomocą kursora Pythona

  5. Jak działa funkcja CHARACTER_LENGTH() w MySQL