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

Wydajność MySQL BIGINT(20) vs Varchar(31)

To naprawdę musiałoby zostać zmierzone, możemy zrobić kilka „odgadnięć” na podstawie tego, co wiemy i co zakładamy, ale to tylko domysły.

Nie wspominasz, czy ta tabela to InnoDB, czy MyISAM z dynamicznymi wierszami, czy MyISAM z wierszami o stałej długości. To trochę zmieni.

Ale dla wartości takich jak ta, którą opublikowałeś, '961637593864109_412954765521130' (31 znaków), zakładając, że używasz jednobajtowego zestawu znaków (np. latin1) lub zestawu znaków, który koduje te konkretne znaki w pojedynczy bajt (np. utf8)...

W przypadku formatu dynamicznego InnoDB i MyISAM jest to 31+1-8=24 dodatkowych bajtów dla tego wiersza. (BIGINT mieści się w 8 bajtach, wartość VARCHAR(31) o długości 31 znaków będzie używać 32 bajtów.)

W przypadku tabeli MyISAM z wierszami o stałej długości byłaby to różnica 23 bajtów na wiersz. (Przestrzeń jest zarezerwowana dla wszystkich 31 znaków, a długość nie musi być przechowywana.)

Ta wartość klucza podstawowego będzie również powtarzana w każdym indeksie, więc w każdym indeksie jest również zwiększona przestrzeń.

Zakładając, że twoje wiersze tabeli mają 120 bajtów przy użyciu BIGINT, a wiersze mają 144 bajty przy VARCHAR, to jest 20% zwiększać. Im większe wiersze, tym mniejszy procentowy wzrost i na odwrót.

Za 1 000 000 wierszy (chcę powiedzieć „jeden meelyun wiersze” w taki sam sposób, w jaki Dr Zło kładzie swój mały palec w kąciku ust i mówi „milion dolarów”), że dodatkowe 24 bajty na wiersz wynoszą około 24 MB.

Ale to nie jest takie proste. Jeśli chodzi o przestrzeń InnoDB, to kwestia tego, jak wiersze „pasują” do bloku. Im większy średni rozmiar wiersza, tym większa ilość wolnego miejsca w bloku.

Jeśli nie robisz nic z wierszami poza przechowywaniem ich na dysku, to tak naprawdę jest to tylko zwiększenie miejsca na dysku oraz dodatkowy czas i miejsce na kopie zapasowe.

Jeśli ta sama liczba wierszy „144 bajtów” zmieści się w bloku, co wierszy „120 bajtów”, nie zobaczysz żadnej różnicy w przestrzeni. Ale jeśli mniej wierszy mieści się w bloku, to więcej bloków, więcej miejsca w puli buforów InnoDB, więcej we/wy itp.

W przypadku zapytań o pojedynczy wiersz, albo według wartości klucza podstawowego, albo przez inne unikalne wyszukiwanie indeksu, różnica będzie nieistotna.

Jeśli masz do czynienia z większymi zestawami wyników, jest to dodatkowa pamięć do przygotowania zestawu wyników i dodatkowe bajty do przesłania do klienta itp.

Jeśli klucz VARCHAR jest zaprojektowany w taki sposób, że „grupy” wierszy, do których uzyskuje się dostęp razem, mają tę samą wiodącą część wartości klucza, to w przypadku InnoDB może faktycznie nastąpić pewna poprawa wydajności. Dzieje się tak, ponieważ klucz podstawowy jest kluczem klastra… znacznie większa szansa, że ​​wiersze potrzebne do spełnienia zapytania znajdują się w tym samym bloku, niż są rozłożone na kilka bloków.

Odwrotna sytuacja jest taka, że ​​jeśli wykonano wstawianie i usuwanie, w niektórych blokach będzie więcej wolnego miejsca. (W przypadku usunięć miejsce na usunięte wiersze pozostaje w bloku; aby je ponownie wykorzystać, musisz wstawić wiersz, który ma tę samą wartość klucza (lub przynajmniej wartość klucza wystarczająco blisko, aby wylądował w tym samym bloku .) A dzięki losowym wstawieniom otrzymamy podziały bloków.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najlepszy sposób na przechowywanie godzin pracy i efektywne wyszukiwanie

  2. MySQL LEFT JOIN 3 stoły

  3. Prześlij wiele plików na serwer, a php nie przesyła na serwer wszystkich plików

  4. Zaawansowany MySQL:znajdź korelacje między odpowiedziami na ankiety

  5. CakePHP konwertuje liczby całkowite MySQL na łańcuchy... psuje funkcję rand()