Jak używać indeksu w instrukcji select?

99

Powiedzmy, że w tabeli pracowników utworzyłem indeks (idx_name) w emp_namekolumnie tabeli.

Czy muszę jawnie określić nazwę indeksu w klauzuli select, czy będzie ona automatycznie używana do przyspieszenia zapytań.

Jeśli jest to wymagane w klauzuli select, jaka jest składnia używania indeksu w zapytaniu wybierającym?

Vivek
źródło

Odpowiedzi:

91

Jeśli chcesz przetestować indeks, aby sprawdzić, czy działa, oto składnia:

SELECT *
FROM Table WITH(INDEX(Index_Name))

Instrukcja WITH wymusi użycie indeksu.

Jason
źródło
83
Ten post nie odpowiada na pytanie. Krótko mówiąc: nie musisz określać indeksu w zapytaniu. Jest używany (lub nie) automagicznie. Możesz to jednak wymusić. Więcej szczegółów (kiedy i dlaczego to zrobić) w innych wpisach poniżej.
Rast
34

Dobre pytanie,

Zwykle silnik bazy danych powinien automatycznie wybierać indeks do użycia na podstawie planów wykonywania zapytań, które tworzy. Jednak są dość rzadkie przypadki, w których chcesz zmusić bazę danych do użycia określonego indeksu.

Aby móc odpowiedzieć na swoje konkretne pytanie, musisz określić używaną bazę danych.

W przypadku MySQL należy przeczytać dokumentację dotyczącą składni wskazówki dotyczącej indeksu, aby dowiedzieć się, jak to zrobić

Tudor Constantin
źródło
30

Jak używać indeksu w instrukcji select?
tą drogą:

   SELECT * FROM table1 USE INDEX (col1_index,col2_index)
    WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM table1 IGNORE INDEX (col3_index)
WHERE col1=1 AND col2=2 AND col3=3;


SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX (i2) USE INDEX (i2);

I wiele innych sposobów, aby to sprawdzić

Czy muszę wyraźnie określić?

  • Nie, nie ma potrzeby wyraźnego określania.
  • Silnik bazy danych powinien automatycznie wybrać indeks do użycia w oparciu o plany wykonywania zapytań, które buduje na podstawie odpowiedzi @Tudor Constantin.
  • Optymalizator oceni, czy użycie indeksu przyspieszy wykonanie zapytania, a jeśli tak, to użyje indeksu. z odpowiedzi @niktrl
VdeX
źródło
13

Ogólnie rzecz biorąc , indeks zostanie użyty, jeśli zakładany koszt użycia indeksu, a następnie ewentualna konieczność wykonywania dalszych wyszukiwań zakładek, jest niższy niż koszt samego skanowania całej tabeli.

Jeśli Twoje zapytanie ma postać:

SELECT Name from Table where Name = 'Boris'

A 1 wiersz na 1000 ma nazwę Boris, prawie na pewno będzie używany. Jeśli wszyscy nazywają się Boris, prawdopodobnie ucieknie się do skanowania tabeli, ponieważ indeks nie jest prawdopodobnie bardziej wydajną strategią dostępu do danych.

Jeśli jest to szeroki stół (wiele kolumn) i tak:

SELECT * from Table where Name = 'Boris'

Wtedy nadal może zdecydować się na wykonanie skanowania tabeli, jeśli rozsądne jest założenie, że pobranie innych kolumn z tabeli zajmie więcej czasu niż po prostu wyszukanie nazwy, lub ponownie, jeśli prawdopodobnie będzie pobierać i tak wiele rzędów.

Damien_The_Unbeliever
źródło
9

Optymalizator oceni, czy użycie indeksu przyspieszy wykonanie zapytania, a jeśli tak, to użyje indeksu.

W zależności od systemu RDBMS możesz wymusić użycie indeksu, chociaż nie jest to zalecane, chyba że wiesz, co robisz.

Ogólnie rzecz biorąc, należy indeksować kolumny używane w instrukcjach sprzężeń i where tabeli

niktrs
źródło
5

Używając kolumny, do której indeks jest stosowany w Twoich warunkach, zostanie on uwzględniony automatycznie. Nie musisz go używać, ale przyspieszy on zapytania, gdy jest używany.

SELECT * FROM TABLE WHERE attribute = 'value'

Użyje odpowiedniego indeksu.

ChrisBint
źródło
5

Ogólnie rzecz biorąc, podczas tworzenia indeksu w tabeli baza danych automatycznie użyje tego indeksu podczas wyszukiwania danych w tej tabeli. Nie musisz nic z tym robić.

Jednak w MSSQL można określić, index hintktóry może określić, że do wykonania tego zapytania należy użyć określonego indeksu. Więcej informacji na ten temat można znaleźć tutaj .

Index hintwydaje się być również dostępny dla MySQL . Dzięki Tudor Constantine.

MD Sayem Ahmed
źródło
1

Wskazówka dotycząca indeksu jest dostępna tylko dla serwerów baz danych Microsoft Dynamics. W przypadku tradycyjnego serwera SQL filtry zdefiniowane w klauzuli „Where” powinny przekonać silnik do użycia odpowiednich indeksów ... Pod warunkiem, że plan wykonania silnika może skutecznie zidentyfikować sposób odczytywania informacji (czy to pełne skanowanie tabeli, czy skanowanie indeksowane ) - musi porównać te dwa elementy przed wykonaniem właściwej instrukcji, w ramach wbudowanego optymalizatora wydajności.

Możesz jednak zmusić optymalizator do skanowania, używając czegoś takiego jak

    Select  *
    From    [yourtable] With (Index(0))
    Where   ...

Lub poszukać określonego indeksu, używając czegoś takiego jak

    Select  *
    From    [yourtable] With (Index(1))
    Where   ...

Wybór nalezy do ciebie. Przyjrzyj się właściwościom indeksu tabeli w panelu obiektów, aby zorientować się, którego indeksu chcesz użyć. Powinien pasować do twojego filtra (ów).

Aby uzyskać najlepsze wyniki, wypisz filtry, które jako pierwsze zwróciłyby najmniej wyników. Nie wiem, czy mam rację, ale wygląda na to, że filtry zapytań są sekwencyjne; jeśli uzyskasz prawidłową sekwencję, optymalizator nie powinien robić tego za Ciebie, porównując wszystkie kombinacje, a przynajmniej nie rozpoczynać porównania z droższymi zapytaniami.

Cory
źródło