2013-02-21 13 views
5

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.

Odpowiedz

6

Indeks jest drzewem B +. Oznacza to, że pod by_id 1 znajdują się wszystkie rekordy z posted_on 0 i by id 1, a następnie masz wszystkie identyfikatory dla tych rekordów. W ramach by_id 7 masz jednak gałąź drzewa, która zawiera rekordy z wpisem_on 0 i zawiera rekordy z ich identyfikatorami.

Kiedy posiadasz klauzulę, odzyskujesz 3 różne gałęzie drzewa, musisz je scalić i wykorzystać, ponieważ id z 1,2,4 może być poniżej byid 1, ale 3,5 poniżej byid 10 ; MySQL pobiera 1,2,4,3,5 i musi ich użyć.

W pierwszym przypadku istnieje tylko jeden oddział, a każdy oddział jest już posortowana

+0

Thanks wielką wyjaśnienie @Darhazer – sanchitkhanna26

+0

proszę powiedzieć, czy należy wtedy usunąć 'id' z indeksu combo1 .. @Darhazer – sanchitkhanna26

+0

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. –

Powiązane problemy