2011-02-08 12 views
5

Właśnie przeczytałem zaakceptowaną odpowiedź this question, która pozostawiła mi to pytanie.Czy jest jakiś sens używania CHAR, jeśli masz VARCHAR w tej samej tabeli?

Oto cytat z tej odpowiedzi:

„Ale ponieważ określili to pytanie z MySQL, będę wspomnieć MySQL specyficzne wskazówka: gdy zapytanie niejawnie generuje tabelę tymczasową, na przykład podczas sortowania lub GROUP BY , VARCHAR pola są konwertowane na CHAR, aby uzyskać korzyści z pracy z wierszami o stałej szerokości.Jeśli używasz wielu pól VARCHAR(255) dla danych, które nie muszą być tak długie, może to spowodować, że tabela tymczasowa będzie bardzo duża. "

Jak rozumiem, zaletą CHAR jest to, że otrzymujesz wiersze o stałej szerokości, więc czy w tym samym stole nie ma problemu z VARCHAR? Czy są jakieś zalety korzystania z CHAR, gdy masz VARCHAR w tej samej tabeli?


Oto przykład:

Tabela z CHAR:

CREATE TABLE address (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    street VARCHAR(100) NOT NULL, 
    postcode CHAR(8) NOT NULL, 
    PRIMARY KEY (id) 
); 

Tabela bez CHAR:

CREATE TABLE address (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    street VARCHAR(100) NOT NULL, 
    postcode VARCHAR(8) NOT NULL, 
    PRIMARY KEY (id) 
); 

Czy stół z CHAR wykonać lepiej niż stole bez CHAR , a jeśli tak, to w czym sytuacje?

+0

Prawdopodobny duplikat - http://stackoverflow.com/questions/3408930/does-anyone-dostepny-niepieczny-to-char-jest-pasiec-than-varchar – ocodo

+0

Tabela "char" będzie wykorzystywać mniej miejsca, ponieważ nie ma dodatkowego pola dla "długości ciągu kodu pocztowego" w każdym rekordzie. –

+0

@Slomojo: To pytanie dotyczy tego, czy istnieją zalety "CHAR" w ogóle i nie o to proszę. –

Odpowiedz

2

"VARCHAR" zasadniczo ustawia maksymalną długość pola i przechowuje tylko dane wprowadzone do niego, oszczędzając w ten sposób miejsce. Typ "CHAR" ma stałą długość, więc jeśli ustawisz "CHAR(100)", zostanie użytych 100 znaków przestrzeni bez względu na zawartość.

Jedyny moment, w którym uzyskasz przewagę prędkości, to brak pól o zmiennej długości w rekordzie ("VARCHAR", "TEXT" itp.). Możesz zauważyć, że Wewnętrznie wszystkie twoje pola "CHAR" zmieniają się na "VARCHAR", gdy tylko typ pola o zmiennej długości zostanie dodany przez MySQL.

Również "CHAR" jest mniej wydajny z punktu widzenia przechowywania przestrzeni, ale bardziej wydajny w wyszukiwaniu i dodawaniu. Jest szybszy, ponieważ baza danych musi tylko odczytać wartość przesunięcia, aby uzyskać zapis, a nie czytać części, dopóki nie znajdzie końca rekordu. Rekordy o stałej długości zminimalizują fragmentację, ponieważ skasowana przestrzeń rekordu może być ponownie wykorzystana dla nowych rekordów.

Mam nadzieję, że to pomaga.

+0

Czy mówisz, że kod pocztowy będzie traktowany jako "VARCHAR" tylko dlatego, że ulica to "VARCHAR"? Czy to się stanie wewnętrznie, czy też MySQL powie mi, że moje pole 'CHAR' jest teraz polem' VARCHAR'? –

+0

@Erik - To się stanie wewnętrznie. Edytowano odpowiedź. –

+0

Nie mam żadnego rzeczywistego dowodu, że to, co mówisz, jest prawdą, ale zostało przegłosowane, ma sens i nikt się temu nie sprzeciwił, więc przyjmuję to jako moją odpowiedź. –

Powiązane problemy