ich eine einfache Tabelle haben ->Verwendung von IN() Klausel führt filesort
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
by_id INT UNSIGNED NOT NULL
posted_on INT UNSIGNED NOT NULL
ist mein Tisch Motor MyISAM
.
Ich habe einen mehrspaltigen Index combo1
auf by_id,posted_on,id
Ich betreibe diese Abfrage genannt ->
EXPLAIN SELECT * FROM books
WHERE by_id = '1' AND posted_on = '0'
ORDER BY id DESC LIMIT 7;
Die Extra
Spalte sagt Using where
und Schlüsselspalte sagt combo1
Aber, wenn ich laufen Diese Abfrage ->
EXPLAIN SELECT * FROM books
WHERE by_id IN(1,7,10) AND posted_on = '0'
ORDER BY id DESC LIMIT 7;
Die Extra
Spalte sagt Using where; Using filesort
und Schlüssel Spalte sagt combo1
.
Warum tritt ein filesort
im zweiten Fall auf, obwohl der QEP zeigt, dass der Optimierer den Index combo1 verwendet, in dem 'id' indiziert ist.
Dank große Erklärung @Darhazer – sanchitkhanna26
bitte sagen, ob ich dann 'id' aus combo1 Index entfernen sollte .. @Darhazer – sanchitkhanna26
Nun, ich bin mir nicht sicher, ob MySQL den Vorteil nutzt, dass die Zweige bereits geordnet sind und merge_sort anwendet oder nicht; vielleicht hängt es auch von der Version ab. Ohne korrektes Benchmarking würde ich die ID im Index beibehalten. Wenn die Tabelle andererseits InnoDB ist, wird ID am Ende jedes sekundären Indexes eingefügt. Dies wird bei der Sortierung nur in MySQL 5.6 berücksichtigt, wenn ich mich richtig erinnere. –