Ich habe meine Tabelle mit einem Index nur für done_status (done_status = INT) eingerichtet:
Wenn ich benutze:
EXPLAIN SELECT * FROM reminder WHERE done_status=2
Ich bekomme das zurück:
id select_type Tabellentyp möglichen_Tasten key key_len ref Zeilen Extra 1 EINFACHE Erinnerung ALL done_status NULL NULL NULL 5 Verwenden von where
Aber wenn ich diesen Befehl gebe:
EXPLAIN SELECT * FROM reminder WHERE done_status=1
Ich bekomme folgendes zurück:
id select_type Tabellentyp möglichen_Tasten key key_len ref Zeilen Extra 1 EINFACHE Erinnerung ref done_status done_status 4 const 2
Das EXPLAIN
zeigt mir, dass es 5 Zeilen verwendet, das zweite Mal 2 Zeilen.
Ich glaube nicht, dass der Index verwendet wird. Wenn ich ihn beim ersten Mal richtig verstanden habe, sollte er mir 3 Zeilen geben. Was mache ich falsch?
SHOW INDEX FROM reminder
::
Tabelle Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Kommentar Index_comment Erinnerung 1 done_status 1 done_status A 5 NULL NULL BTREE
erklären erweitert:
id select_type Tabellentyp möglichen_Tasten key key_len ref Zeilen gefiltert Extra 1 EINFACHE Erinnerung ref done_status done_status 4 const 2 100.00
show warnings
zeigte nichts von Interesse.
Antworten:
Sie verstehen falsch, was das Feld "Zeilen" ist. Es ist die Anzahl der Zeilen, die MySQL schätzt, um gelesen zu werden, um Ihre Anfrage zu erfüllen. Dieser Wert kann sehr ungenau sein. Dies bedeutet nicht, dass dies die Anzahl der Zeilen im Ergebnis ist - oder die tatsächliche Anzahl der von MySQL gelesenen Zeilen
quelle
In der ersten Ausführungsebene wird der Index nicht mit Sicherheit verwendet.
Es kann sein, dass die information_schema.statistics im Index nach einigen Schreibvorgängen die Daten nicht einholt oder dass lange nicht auf die Tabelle zugegriffen wurde.
wie hier erklärt: - Woher liest der MySQL Query Optimizer Indexstatistiken?
Für den zweiten Ausführungsplan scheint information_schema.statistics das NULL-Kardinalitätsproblem bereits aufzuholen und zu beheben.
Daher wird die Abfrage gemäß dem Indexoptimierer ausgeführt.
Für Tabellen mit kleinen Zeilen spielt es keine Rolle.
Die Daten werden jedoch wachsen. Entwickler sollten dies immer überprüfen
und die erforderliche Analysetabelle durchführen, wenn die Kardinalität der Begegnung im Index null ist.
quelle
Der erste Ausführungsplan verwendet keinen Index.
Von der MySQL-Referenzwebsite :
Wenn Ihre Tabelle nur 5 Zeilen enthält und Ihre Abfrage 3 davon auswählt, geht das MySQL-Optimierungsprogramm davon aus, dass das Scannen der gesamten Tabelle effizienter ist.
quelle