Вопрос

I have a simple table ->

id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
by_id INT UNSIGNED NOT NULL
posted_on INT UNSIGNED NOT NULL

My table engine is MyISAM.

I have a multiple column index called combo1 on by_id,posted_on,id

I run this query ->

EXPLAIN SELECT * FROM books 
        WHERE by_id = '1' AND posted_on = '0' 
        ORDER BY id DESC LIMIT 7;

The Extra column says Using where and key column says combo1

But, when i run this query ->

EXPLAIN SELECT * FROM books 
        WHERE by_id IN(1,7,10) AND posted_on = '0' 
        ORDER BY id DESC LIMIT 7;

The Extra column says Using where; Using filesort and key column says combo1.

Why is a filesort occuring in second case even though the QEP shows that optimizer is using the index combo1 which has 'id' indexed in it.

Это было полезно?

Решение

The index is a B+ tree. That means that under the by_id 1 there are all records with posted_on 0 and by_id 1, and then you have all the ids for those records. Under the by_id 7 however you have another tree branch, that contains records with posted_on 0 and they contains the records with their ids.

When you have in clause, you are retrieving 3 different branches of the tree, you have to merge them and resort them, since ids with 1,2,4 may be under by_id 1, but 3,5 under by_id 10; MySQL retrieves 1,2,4,3,5 and have to resort them.

In the first case there is only one branch, and each branch is already sorted

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top