2011-10-05 11 views
9

Szybkie pytanie. Czy ma znaczenie z punktu przechowywania danych, czy będę używać dziesiętnych limitów pola lub szesnastkowych (powiedzmy 16,32,64 zamiast 10,20,50)?Czy varchar (128) jest lepszy od varchar (100)

Pytam, ponieważ zastanawiam się, czy to będzie miało coś wspólnego z klastrami na HDD?

Dzięki!

+2

Czy to pytanie dotyczy konkretnego RDBMS lub ogólnego? –

+0

Czy zamierzasz przechowywać dane dziesiętne w polu varchar? –

+0

ypercube: mysql, InnoDB Tudor: nie, tylko tekst ... chyba że tekst jest liczbą :) – RandomWhiteTrash

Odpowiedz

9

VARCHAR (128) jest lepszy niż VARCHAR (100), jeśli zachodzi potrzeba przechowywania ciągów dłuższych niż 100 bajtów.

W przeciwnym razie istnieje bardzo niewiele możliwości wyboru między nimi; powinieneś wybrać ten, który lepiej pasuje do maksymalnej długości danych, które możesz przechowywać. Nie będziesz w stanie zmierzyć różnicy w wydajności między nimi. Poza tym DBMS prawdopodobnie przechowuje tylko dane, które wysyłasz, więc jeśli twój średni łańcuch wynosi, powiedzmy, 16 bajtów, użyje tylko 16 bajtów na dysku (lub, co jest bardziej prawdopodobne, 17 - pozwalając na 1 bajt na przechowywanie długości) bajtów . Większy rozmiar może wpłynąć na obliczenie liczby wierszy, które mogą zmieścić się na stronie - co jest szkodliwe. Wybór najmniejszego rozmiaru, który jest odpowiedni, ma sens - nie marnuj, nie chcesz.

Podsumowując, istnieje niewielka różnica między tymi dwoma pod względem wydajności lub użycia dysku, a dostosowanie do wygodnych granic binarnych nie ma większego znaczenia.

2

Tak, ale to nie jest takie proste. Czasami 128 może być lepszych niż 100, a czasem jest odwrotnie.

Co się dzieje? varchar przydziela tylko tyle miejsca, ile potrzeba, więc jeśli zapiszesz hello world w varchar(100), zajmie dokładnie tyle samo miejsca, co w przypadku varchar(128).

Pytanie brzmi: jeśli wypełnisz wiersze, czy trafisz na "blok" limit/granicę, czy nie?

Bazy danych przechowują swoje dane w blokach. Mają stały rozmiar, na przykład 512 (tę wartość można skonfigurować dla niektórych baz danych). Pytanie brzmi: Ile bloków DB musi przeczytać, aby pobrać każdy wiersz? Wiersze obejmujące kilka bloków będą wymagać więcej operacji we/wy, więc spowolni to działanie.

Ale znowu: nie zależy to od teoretycznego maksymalnego rozmiaru kolumn, ale od a) liczby kolumn (każda kolumna potrzebuje trochę miejsca, nawet gdy jest pusta lub null), b) ile kolumny o stałej szerokości, które masz (number/decimal, char), a na końcu c) ile masz danych w zmiennych kolumnach.

3

Gdyby to był program C, poświęciłbym trochę czasu na przemyślenie tego. Ale z bazą danych zostawię ją silnikowi DB.

Programiści DB spędzili dużo czasu zastanawiając się nad najlepszym układem pamięci, więc po prostu powiedz tej bazie danych, czego potrzebujesz, i przechowuj dane w sposób najlepiej odpowiadający silnikowi bazy danych (zwykle).

Jeśli chcesz wyrównać swoje dane, musisz dokładnie wiedzy o wewnętrznej organizacji danych: Jak przechowywana jest ciąg? Jeden, dwa lub cztery bajty do przechowywania długości? Czy jest przechowywany jako sekwencja bajtów prostych lub zakodowanych w UTF-8 UTF-16 UTF-32? Czy baza danych wymaga dodatkowych bajtów do identyfikacji wartości NULL lub> MAXINT? Może ciąg jest przechowywany jako sekwencja bajtów zakończonych znakiem NUL - wtedy jeden bajt więcej jest potrzebny wewnętrznie.

Również z VARCHAR nie jest konieczne, aby DB zawsze przydzielał 100 (128) bajtów dla ciągu znaków. Może przechowuje tylko wskaźnik do miejsca, w którym znajdują się rzeczywiste dane.

Dlatego zdecydowanie zalecam używanie VARCHAR (100), jeśli jest to wymagane. Jeśli DB zdecyduje się go wyrównać, to jest też miejsce na dodatkowe wewnętrzne dane.

W inny sposób: Załóżmy, że używasz VARCHAR (128) i wszystkie elementy się łączą: DB przydziela 128 bajtów dla twoich danych. Dodatkowo potrzebuje 2 bajtów więcej, aby zapisać faktyczną długość ciągu znaków - tworzy 130 bajtów - i wtedy może być tak, że DB wyrównuje dane do następnej (powiedzmy 32 bajty) granicy: Rzeczywiste dane potrzebne na dysku to teraz 160 bajtów 8-}