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

Czy kolumny VARCHAR powinny być umieszczane na końcu definicji tabel w MySQL?

Zadawanie tego pytania o „MySQL” nie jest pomocne, ponieważ MySQL przenosi pamięć masową do silników pamięci masowej, które implementują pamięć masową na bardzo różne sposoby. Warto zadać to pytanie dla dowolnego silnika pamięci masowej.

W silniku MEMORY typy danych o zmiennej długości nie istnieją. VARCHAR jest po cichu zmieniany w CHAR. W kontekście twojego pytania:nie ma znaczenia, gdzie w definicji tabeli umieścisz swój VARCHAR.

W silniku MyISAM, jeśli tabela nie zawiera żadnych danych o zmiennej długości (VARCHAR, VARBINARY lub dowolny typ TEXT lub BLOB), jest to FIXED wariant MyISAM, to znaczy rekordy mają stałą długość w bajtach. Może to mieć wpływ na wydajność, zwłaszcza jeśli dane są wielokrotnie usuwane i wstawiane (tj. tabela nie jest tylko dołączana). Gdy tylko dowolny typ danych o zmiennej długości jest częścią definicji tabeli, staje się on DYNAMICM wariantem MyISAM, a MyISAM wewnętrznie zmienia dowolny typ CHAR poza najkrótszym na VARCHAR. Ponownie, pozycja, a nawet definicja CHAR/VARCHAR nie ma znaczenia.

W silniku InnoDB dane przechowywane są na stronach o rozmiarze 16 KB. Strona ma stopkę z sumą kontrolną oraz nagłówek strony z m.in. katalogiem stron. Katalog strony zawiera dla każdego wiersza przesunięcie tego wiersza względem początku strony. Strona zawiera również wolne miejsce, a wszystkie operacje we/wy są wykonywane na stronach.

W związku z tym InnoDB może, o ile na stronie jest wolne miejsce, powiększać VARCHAR w miejscu i przenosić wiersze wewnątrz strony, bez ponoszenia dodatkowych operacji we/wy. Ponadto, ponieważ wszystkie wiersze są adresowane jako (numer strony, wpis katalogu strony), ruch wiersza wewnątrz strony jest zlokalizowany na stronie i niewidoczny z zewnątrz.

Oznacza to również, że również w przypadku InnoDB kolejność kolumn w wierszu nie ma żadnego znaczenia.

Są to trzy silniki przechowywania, które są najczęściej używane w MySQL, a kolejność kolumn nie ma znaczenia dla żadnego z tych trzech. Możliwe, że istnieją inne, bardziej egzotyczne silniki pamięci masowej, w przypadku których nie jest to prawdą.



  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 mogę manipulować trafnością wyszukiwania pełnotekstowego MySQL, aby jedno pole było bardziej „wartościowe” niż inne?

  2. Jak zoptymalizować to zapytanie MySQL? Miliony rzędów

  3. wstawić tablicę wartości do bazy danych za pomocą zapytania SQL?

  4. Rails 5 i Ruby 2.3.3 nie mogą załadować libmysql.dll

  5. Scal 2 tablice i zsumuj wartości (klucze numeryczne)