Mam bardzo dużą tabelę MySQL z około 150 000 wierszy danych. Obecnie, kiedy próbuję uruchomić
SELECT * FROM table WHERE id = '1';
kod działa poprawnie, ponieważ pole ID jest indeksem podstawowym. Jednak w przypadku ostatniego rozwoju projektu muszę przeszukać bazę danych według innego pola. Na przykład:
SELECT * FROM table WHERE product_id = '1';
To pole nie było wcześniej indeksowane; Jednak dodałem jeden, więc mysql teraz indeksuje pole, ale kiedy próbuję uruchomić powyższe zapytanie, działa ono bardzo wolno. Zapytanie EXPLAIN ujawnia, że nie ma indeksu dla pola product_id, gdy już go dodałem, w wyniku czego zapytanie zajmuje od 20 minut do 30 minut, aby zwrócić pojedynczy wiersz.
Moje pełne wyniki WYJAŚNIJ to:
| id | select_type | table | type | possible_keys| key | key_len | ref | rows | Extra |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
| 1 | SIMPLE | table | ALL | NULL | NULL | NULL | NULL |157211 | Using where |
+----+-------------+-------+------+--------------+------+---------+------+-------+------------------+
Warto zauważyć, że właśnie spojrzałem, a pole ID jest przechowywane jako INT, natomiast pole PRODUCT_ID jest przechowywane jako VARCHAR. Czy to może być przyczyną problemu?
źródło
EXPLAIN
wyniki? Czy jesteś pewien, że to nie ma indeksu? Czy jest tam indeks, ale MySQL decyduje się go nie używać?Odpowiedzi:
Nigdy nie porównuj
integer
zstrings
MySQL. Jeśliid
takint
, usuń cytaty.źródło
SHOW INDEXES FROM YOURTABLE
dev.mysql.com/doc/refman/5.0/en/show-index.html, aby sprawdzić, czy indeksy zostały dodaneźródło
ALTER TABLE tbl ADD INDEX (col)
zamiastALTER TABLE tbl ADD INDEX col (col)
, a następnie przy użyciuALTER TABLE tbl ADD INDEX (col)
więcej niż jeden raz będzie utrzymywać dodanie wskaźników nazwanychcol_2
,col_3
... za każdym razem. Podczas korzystania zALTER TABLE tbl ADD INDEX col (col)
2 raz daERROR 1061 (42000): Duplicate key name 'col'
.Możesz użyć tej składni, aby dodać indeks i kontrolować rodzaj indeksu (HASH lub BTREE).
Możesz dowiedzieć się o różnicach między indeksami BTREE i HASH tutaj: http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
źródło
Warto zauważyć, że wiele indeksów pól może znacznie poprawić wydajność zapytań. Tak więc w powyższym przykładzie zakładamy, że ProductID to jedyne pole do wyszukiwania, ale w zapytaniu było powiedzone ProductID = 1 AND Category = 7, wtedy pomaga indeks wielu kolumn. Osiąga się to dzięki:
Dodatkowo indeks powinien być zgodny z kolejnością pól zapytań. W moim rozszerzonym przykładzie indeks powinien wynosić (ProductID, Category), a nie na odwrót.
źródło
the index should match the order of the query fields
?Można dodać indeksy dwóch typów: kiedy zdefiniujesz klucz podstawowy, MySQL domyślnie przyjmie go jako indeks.
Wyjaśnienie
Klucz podstawowy jako indeks
Rozważ, że masz
tbl_student
tabelę i chceszstudent_id
jako klucz podstawowy:Powyższa instrukcja dodaje klucz podstawowy, co oznacza, że indeksowane wartości muszą być unikalne i nie mogą mieć wartości NULL.
Podaj nazwę indeksu
Powyższa instrukcja utworzy zwykły indeks o
student_index
nazwie.Utwórz unikalny indeks
Tutaj
student_unique_index
jest nazwa indeksu przypisana do student_id i tworzy indeks, dla którego wartości muszą być unikalne (tutaj można zaakceptować null).Opcja pełnego tekstu
Powyższa instrukcja utworzy nazwę indeksu pełnotekstowego
student_fulltext_index
, dla której potrzebujesz MyISAM Mysql Engine.Jak usunąć indeksy?
Jak sprawdzić dostępne indeksy?
źródło
Mówisz, że masz indeks, wyjaśnienie mówi inaczej. Jeśli jednak tak naprawdę robisz, możesz kontynuować:
Jeśli masz indeks w kolumnie, a MySQL postanawia go nie używać, może to dlatego, że:
ANALYZE TABLE
pomaga.W przypadku (2) lub (3) możesz nakłonić MySQL do użycia indeksu według sytax podpowiedzi indeksu , ale jeśli to zrobisz, upewnij się, że wykonałeś kilka testów w celu ustalenia, czy rzeczywiście poprawia ono wydajność korzystania z indeksu podczas jego podpowiedzi .
źródło