2009-04-19 16 views

Odpowiedz

39

Istnieje ogromna wydajność kara użyciem ENUM dla operacji takich jak:

  • zapytań na liście dozwolonych wartości w ENUM, na przykład do wypełnienia menu rozwijanego. Musisz zapytać o typ danych od INFORMATION_SCHEMA i przeanalizować listę z zwróconego pola BLOB.

  • Zmienić zestaw dozwolonych wartości. Wymaga instrukcji ALTER TABLE, która blokuje tabelę i może wykonać restrukturyzację.

Nie jestem fanem MySQL's ENUM. Wolę korzystać z tabel odnośników. Zobacz także moją odpowiedź na "How to handle enumerations without enum fields in a database?"

+4

moje wartości wyliczeniowe będą takie jak demografia (W, B, A, H, O, U) Płeć (M, F, U) i Impreza (R, D, I, U) te nigdy się nie zmieniły. więc zawsze mogą być mocno zakodowane w mojej logice aplikacji. Tak więc zapytanie o wartości rozwijane i zmiana struktury nie są aż tak istotne. – gsueagle2008

+33

"moje wartości wyliczeniowe ... nigdy się nie zmienią". Chciałbym ** love **, aby uzyskać statystyki na temat tego, ile razy ta instrukcja została udowodniona źle. – benmarks

+2

Podczas gdy podane punkty są prawdziwe, ENUM jest nadal szybsze niż JOINS, szczególnie jeśli zamawiasz w tej kolumnie. W przypadku kolumn takich jak płeć z ustawionymi wartościami, które się nie zmieniają, wolę używać ENUM. Jeśli istnieje nawet zdalna możliwość, że będziesz musiał dodać lub usunąć wartości, skorzystaj z JOIN lub użyj CHAR/VARCHAR/TINYINT i zarządzaj nimi na poziomie aplikacji. Jeszcze jedno ... MySQL nie przechowuje rzeczywistej wartości w kolumnie, tylko indeks (INT), więc równie dobrze możesz użyć pełnego tekstu do wyświetlenia użytkownikom (np. Male zamiast M) i zapisać dodatkowe kodowanie.;-) – Jabari

1

Nie patrz porównanie here

Zaletą leży w czytelności kodu.

+10

Według artykułu, który łączyłeś, JEST korzyścią wynikającą ze stosowania ENUM, o ile nie zmieniasz możliwych stanów. –

24

ENUM są reprezentowane wewnętrznie 1 lub 2 bajtami, w zależności od liczby wartości. Jeśli przechowywane łańcuchy mają rozmiar większy niż 2 bajty i rzadko się zmieniają, to należy wybrać opcję ENUM. Porównanie będzie szybsze dzięki enum i zajmą mniej miejsca na dysku, co z kolei może prowadzić do szybszego wyszukiwania.

Wadą jest to, że wyliczenia są mniej elastyczne, jeśli chodzi o dodawanie/usuwanie wartości.

+0

Nie jestem pewien, której wersji MySQL miałeś na myśli. Ale od wersji 5.0 rozmiar typu wyliczeniowego wynosi 1 lub 2 bajty w zależności od liczby możliwych wartości zgodnie z instrukcją: http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html istnieje tylko 5 do 10 możliwych wartości, rozmiar powinien wynosić 1 bajt – Lacek

+0

@Lacek Masz rację! Zmienię odpowiedź z 16 bitów na 1 lub 2 bajty –

9

W tym artykule http://fernandoipar.com/2009/03/09/using-the-enum-data-type-to-increase-performance/ Fernando przygląda się występom typu Enum dla zapytań.

Powoduje to, że podczas korzystania z ENUM może wydawać się nieco mniej elegancki z punktu widzenia projektu (jeśli wartość ENUM zmienia się czasami), wzrost wydajności jest oczywiste dla dużych zestawów danych. Zobacz jego artykuł, aby poznać szczegóły. Czy sie zgadzasz?

Powiązane problemy