2012-01-20 9 views
10

Wykonuję indeksy do tabeli z milionami rekordów, które są używane do wyszukiwania wyników. Wyświetlam wyniki według zamówienia ASC lub DESC. Moje pytanie brzmi, czy kolumna powinna mieć indeks, czy nie? Mam 2 dodatkowe indeksy na tym stole. W jaki sposób wpłynie to na wydajność, wprowadzając indeks do tej kolumny, czy nie?Porządek według kolumny powinien mieć indeks, czy nie?

+0

Możliwy duplikat http://stackoverflow.com/questions/7475332/mysql-index-for-group- by-order-by –

+0

@Tichodroma: Widziałem to pytanie wcześniej było o grupie przez. Mój scenariusz jest inny. Potrzebuję indeksu dla kolumny z warunkiem (gdzie) dla filtra wyszukiwania. –

Odpowiedz

9

Porządek według kolumn służy do porządkowania zestawu wyników, a nie filtrowania. Indeks na kolumnach wymienionych w klauzuli "porządek" raczej nie zmieni niczego, zwłaszcza jeśli nie jest używany do filtrowania danych.

+0

: Ta kolumna będzie używana również w tym stanie. Jak wpłynie to na czas złożoności zapytania? –

+0

Dodanie indeksu powinno skrócić czas. Bez spojrzenia na plany wykonania kwerendy lub zapytania nie ma możliwości dowiedzenia się. – Sathya

+0

Ok. Sprawdzę wtedy plany realizacji zapytań. Dzięki. –

3

Właściwie - dla niektórych milionów wierszy lepiej zastosować dobrze przemyślany indeks, to nie jest tak duży zbiór danych, by zacząć martwić się kwestiami związanymi z przestrzenią kosmiczną.

ale

Jeśli czytasz tę tabelę raz dziennie i zmiana/usuwanie wierszy 100 razy na sekundę - to efekt z indeksu może pogorszyć osiągi podstawowych operacji, podczas occasinally wybierając wykona lepiej.

Więc odpowiedź jak zwykle - zależy

+0

To jest logika wyszukiwania. Zatem tabela będzie odczytywana 10000 razy niż jeden zapis. Co powinienem zrobić? –

+0

Zdecydowanie dobry indeks - to twój przypadek –

0

Korzystanie ORDER BY na indeksowana kolumna nie jest dobrym pomysłem. W rzeczywistości celem używania indeksu jest przyspieszenie wyszukiwania, więc kolumna indeksu pomaga w utrzymaniu danych w posortowanej kolejności. Zasugeruję ci użycie ORDER BY w nieindeksowanej kolumnie. Uruchomiłem próbkę zapytania w MySql i otrzymałem wynik jak wspomniano poniżej.

SELECT 
    ci.id AS item_id, ci.brand_id, ci.category_id, 
    ci.item_size_type, ci.is_express_processing, ci.packing, 
    ci.parent_service_id, ci.product_id, ci.size, 
    ci.create_date AS item_create_date, cis.service_id, cis.quantity 
FROM 
    cart AS c 
INNER JOIN 
    cart_items AS ci ON ci.cart_id = c.id 
LEFT JOIN 
    cart_item_services AS cis ON cis.item_id = ci.id 
WHERE 
    c.id = 144 
ORDER BY 
    c.create_date; 

Tutaj używam ORDER BY na nieindeksowane kolumnie create_date i wynik jest następujący:

# Time: 2017-11-03T10:30:33.237056Z 
# [email protected]: root[root] @ localhost [] Id:  3 
# Query_time: 0.000340 
# Lock_time: 0.000154 Rows_sent: 2 Rows_examined: 4 

A teraz mam zamiar użyć ORDER BY na kolumnie indeksowanej item_id:

SELECT 
    ci.id AS item_id, ci.brand_id, ci.category_id, 
    ci.item_size_type, ci.is_express_processing, ci.packing, 
    ci.parent_service_id, ci.product_id, ci.size, 
    ci.create_date AS item_create_date, cis.service_id, cis.quantity 
FROM 
    cart AS c 
INNER JOIN 
    cart_items AS ci ON ci.cart_id = c.id 
LEFT JOIN 
    cart_item_services AS cis ON cis.item_id = ci.id 
WHERE 
    c.id = 144 
ORDER BY 
    item_id; 

Teraz otrzymałem wynik w następujący sposób.

# Time: 2017-11-03T10:30:47.802392Z 
# [email protected]: root[root] @ localhost [] Id:  3 
# Query_time: 0.000383 
# Lock_time: 0.000176 Rows_sent: 2 Rows_examined: 4 

więc w powyższym wyniku widzimy indeksowanych kolumn Query_time i Lock_time jest wyższa niż kolumny nie indeksowane.

Dla bardziej szczegółowej analizy o standardzie kwerendy i wydajność można odnieść poniżej linkiem:

http://mysql.rjweb.org/doc.php/index_cookbook_mysql

Powiązane problemy