Mam proste tabeli ->Korzystanie IN() Klauzula powstałego w filesort
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
by_id INT UNSIGNED NOT NULL
posted_on INT UNSIGNED NOT NULL
Mój silnik tabela jest MyISAM
.
Mam wielu indeks kolumny o nazwie combo1
na by_id,posted_on,id
uruchomić tej kwerendy ->
EXPLAIN SELECT * FROM books
WHERE by_id = '1' AND posted_on = '0'
ORDER BY id DESC LIMIT 7;
Kolumna Extra
mówi Using where
i klucz kolumna mówi combo1
Ale gdy uruchamiam to zapytanie ->
EXPLAIN SELECT * FROM books
WHERE by_id IN(1,7,10) AND posted_on = '0'
ORDER BY id DESC LIMIT 7;
Kolumna Extra
mówi Using where; Using filesort
, a kolumna klucza mówi: combo1
.
Występuje w drugim przypadku filesort
, mimo że QEP pokazuje, że optymalizator używa indeksu combo1, który ma indeks "id" w nim indeksowany.
Thanks wielką wyjaśnienie @Darhazer – sanchitkhanna26
proszę powiedzieć, czy należy wtedy usunąć 'id' z indeksu combo1 .. @Darhazer – sanchitkhanna26
dobrze, nie jestem pewien, czy MySQL korzysta z tego, że gałęzie są już uporządkowane i stosuje się do nich polecenie merge_sort; może to też zależy od wersji. Bez odpowiedniego testu porównawczego zachowałbym id w indeksie. Z drugiej strony, jeśli tabela była InnoDB, identyfikator jest zawarty na końcu każdego indeksu wtórnego. Jest to brane pod uwagę podczas sortowania tylko w MySQL 5.6, o ile dobrze pamiętam. –