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?
Odpowiedz
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.
: Ta kolumna będzie używana również w tym stanie. Jak wpłynie to na czas złożoności zapytania? –
Dodanie indeksu powinno skrócić czas. Bez spojrzenia na plany wykonania kwerendy lub zapytania nie ma możliwości dowiedzenia się. – Sathya
Ok. Sprawdzę wtedy plany realizacji zapytań. Dzięki. –
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
To jest logika wyszukiwania. Zatem tabela będzie odczytywana 10000 razy niż jeden zapis. Co powinienem zrobić? –
Zdecydowanie dobry indeks - to twój przypadek –
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:
Możliwy duplikat http://stackoverflow.com/questions/7475332/mysql-index-for-group- by-order-by –
@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. –