Mysql Reihenfolge nach Klausel mit "FileSort"

8

Ich habe eine Tabellenstruktur wie

%Vor%

Wenn ich Anfrage wie

abfange %Vor%

Es gibt die Ergebnisse als

aus %Vor%

Warum kann ich den Index, den ich als Primärschlüssel definiert habe, nicht finden?

    
Akash 12.08.2012, 08:51
quelle

2 Antworten

6

Immer wenn eine Sortierung von einem Index aus nicht durchgeführt werden kann, handelt es sich um einen Filesort.

Das seltsame Ding hier ist, dass Sie den Index für dieses Feld haben sollten, da es ein Primärschlüssel ist (und eine Primärschlüsselspalte ist implizit indiziert), Testen auf einer Testdatenbank Ich habe gerade bemerkt, dass MySQL FileSort verwendet, wenn Sie ein SELECT * , dies ist ein sinnloses Verhalten (ich weiß), aber wenn Sie Ihre Abfrage auf diese Weise neu schreiben:

%Vor%

Es wird den Index korrekt verwenden. Vielleicht könnte ein Fehler von mysql sein ...

    
aleroot 12.08.2012, 09:12
quelle
10

Das liegt nicht daran, dass der Index nicht verwendet werden kann. Das liegt daran, dass das Optimierungsprogramm der Meinung ist, dass es schneller ist, den Index nicht zu verwenden und einen filesort 1 zu erstellen. Sie sollten ein unterschiedliches Verhalten in MyiSAM- und InnoDB-Tabellen sehen.

InnoDB erstellt den Schlüssel PRIMARY als einen gruppierten Schlüssel (oder den ersten UNIQUE , wenn kein primärer Schlüssel definiert ist) und kann für Abfragen mit ORDER BY pk oder WHERE pk BETWEEN low AND high verwendet werden, da alle erforderlichen Werte enthalten sind Dieser gruppierte Schlüssel und an aufeinanderfolgenden Orten (der gruppierte Schlüssel ist die Tabelle).

MyISAM -Tabellen haben nur B-Baum-Indizes. Wenn die Abfrage diesen Index verwendet, müsste sie den gesamten Index lesen und die comment_id -Werte in der gewünschten Reihenfolge haben (das ist wirklich gut), hätte es dann aber auch die Tabelle zu lesen (nicht so gut), um alle anderen gewünschten Spalten zu bekommen. Also, der Optimierer denkt, dass, weil es die Tabelle lesen wird, warum nicht alles scannen und den filesort tun? Sie können das testen, indem Sie Folgendes versuchen:

%Vor%

Es wird den Index verwenden und keinen filesort ausführen, da die Abfrage nur die Werte benötigt, die im Index gespeichert sind.

Wenn Sie ein ähnliches (zu InnoDB) Verhalten in MyiSAM möchten, sollten Sie versuchen, einen Index für (comment_id, comment_content, comment_author, comment_author_url) zu erstellen und dann Ihre Abfrage zu versuchen. Alle benötigten Werte würden auf dem Index und in der richtigen Reihenfolge gefunden werden, so dass kein filesort ausgeführt würde.

Der zusätzliche Index benötigt natürlich fast so viel Speicherplatz auf der Festplatte wie die Tabelle.

1 : filesort ist nicht immer schlecht und bedeutet nicht, dass eine Datei auf der Festplatte gespeichert wird. Wenn die Größe der Daten klein ist, wird sie im Speicher ausgeführt.

    
ypercubeᵀᴹ 12.08.2012 10:28
quelle