Witam.
Zauważyłem, że podczas wykonywania zapytania dla jednej tabeli idzie full scan
mimo, że są dodane indeksy które wydawałby się powinny zostać użyte.
Ku mojemu zaskoczeniu na wybór indeksu ma wpływ to jakie pola użyte są SELECT
Na przykład to zapytanie:
EXPLAIN EXTENDED
SELECT
ngl.id
FROM kontrahenci kh
JOIN naglowki ngl ON ngl.kh_id = kh.id
WHERE ngl.`data` >= "2021-10-25"
zwrócony plan:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra
---------------- | -------------------
1|SIMPLE|ngl|index|q1|q1|9|NULL|24784|20.22|Using where; Using index
1|SIMPLE|kh|eq_ref|PRIMARY,id_UNIQUE|PRIMARY|4|ngl.kh_id|1|100.00|Using index
Zgodnie z oczekiwaniami został użyty indeks q1
.
Jednak w przypadku gdy dodam kolejną kolumnę w select
indeks już nie jest używany.
EXPLAIN EXTENDED
SELECT
ngl.id,
ngl.strefa
FROM kontrahenci kh
JOIN naglowki ngl ON ngl.kh_id = kh.id
WHERE ngl.`data` >= "2021-10-25"
id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra
---------------- | -------------------
1 | SIMPLE | ngl | ALL | q1 | NULL | NULL | NULL | 24784 | 20.22 | Using where
1 | SIMPLE | kh | eq_ref | PRIMARY,id_UNIQUE | PRIMARY | 4 | ngl.kh_id | 1 | 100.00 | Using index
Czy to znaczy, że w indeksie muszę zawszeć wszystkie kolumny które będą użyte w select
.
Wydawało mi się, że w indeksie musza być użyte kolumny których używam przy złączeniach, warunkach wyszukiwania, sortowania, grupowania, agregowania a tych wybieranych do zwrócenia nie musi być...
Z góry dziękuję za pomoc