2008-11-14 11 views
39

Mam tabelę mysql, gdzie indeksowana kolumna INT będzie wynosić 0 dla 90% wierszy. Jeśli zmienię te wiersze, aby używać wartości NULL zamiast 0, czy zostaną one pominięte w indeksie, co spowoduje, że indeks będzie o 90% mniejszy?Czy wartości mysql indeksu puste?

+0

Doskonałe pytanie –

Odpowiedz

5

Wygląda na to, że indeksuje także NULL.

Bądź ostrożny podczas uruchamiania tego powodu MySQL zablokować tabela pisze podczas tworzenia indeksu. Budowanie indeksu może zająć trochę czasu na dużych tabelach, nawet jeśli kolumna jest pusta (wszystkie wartości zerowe).

Reference.

+2

Jak doszło do tego wniosku? Nie widzę żadnej wzmianki na ten temat. –

+0

To było w komentarzach na dole artykułu. Wyciągnąłem odpowiednią część. –

+5

Wierzę, że powodem, dla którego zajmuje dużo czasu na dużych stołach, jest to, że MySQL musi przeczytać całą tabelę, a nie dlatego, że buduje gigantyczny indeks. Mogę się mylić. –

1

Nie, nadal będzie je zawierał, ale nie rób zbyt wielu założeń co do konsekwencji w obu przypadkach. Wiele zależy od zakresu innych wartości (google dla "liczności").

MSSQL ma nowy typ indeksu zwany "przefiltrowanym indeksem" dla tego typu sytuacji (tzn. Zawiera rekordy w indeksie na podstawie filtru). Systemy typu dBASE miały podobne możliwości i były bardzo przydatne.

2

Dopuszczenie, że kolumna będzie pusta, spowoduje dodanie bajtu do wymagań dotyczących pamięci w kolumnie. Doprowadzi to do zwiększenia rozmiaru indeksu, który prawdopodobnie nie jest dobry. To powiedziawszy, jeśli wiele twoich zapytań zostanie zmienionych na "IS NULL" lub "NOT NULL", mogą one być ogólnie szybsze niż porównywanie wartości.

Moje gut nie powiedziałby mi nic, ale jest jedna odpowiedź: test!

+3

-1 To nie odpowiada na pytanie. – user359996

+1

Pytanie brzmiało, czy wskaźnik zwiększy swój rozmiar. Odpowiedź brzmiała, że ​​zwiększyłoby to wielkość indeksu w drugim zdaniu. –

+3

Tytuł * pyta, czy MySQL indeksuje puste kolumny (robi to). Wydaje się, że * description * zadaje nieco inne pytanie, ale tak naprawdę jest tylko wyjaśnieniem, dlaczego pytanie (tytułowe) zostało zadane w pierwszej kolejności. Co więcej, ponieważ ludzie w dużej mierze decydują, czy czytać pytanie na podstawie jego tytułu, powiedziałbym, że tytuł formularza w większości przypadków zastępuje formularz opisu. – user359996

13

http://dev.mysql.com/doc/refman/5.0/en/is-null-optimization.html

MySQL może wykonywać tę samą optymalizację na COL_NAME IS NULL, że można go używać do COL_NAME = constant_value. Na przykład MySQL może używać indeksów i zakresów do wyszukiwania wartości NULL z IS NULL

+0

Należy pamiętać, że w dokumentacji wymieniono pewne zastrzeżenia, np. "optymalizacja może obsłużyć tylko jedną IS NULL". – Timo

0

Każdy indeks ma liczność oznacza liczbę różnych wartości są indeksowane. AFAIK nie jest rozsądnym pomysłem, aby powiedzieć, że indeksy powtarzają tę samą wartość dla wielu wierszy, ale indeks będzie odnosił się tylko do powtarzanej wartości do indeksu klastrowanego z wielu wierszy (wiersze z wartością pustą dla tego pola) i zachowując identyfikator odwołania do indeksu klastrowego oznacza: każdy wiersz z polem indeksowanym wartości NULL marnuje rozmiar tak duży jak PK (z tego powodu eksperci zalecają mieć rozsądny PK rozmiar, jeśli masz złożoną PK).

Powiązane problemy