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.