Beginnen wir mit einer seltsamen Sache:
Ich erstelle einige Daten, um das Problem zu reproduzieren, und erstelle eine Benutzertabelle:
CREATE TABLE `user` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID', `name` varchar(100) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(11) NOT NULL DEFAULT 0 COMMENT '年龄', PRIMARY KEY (`id`), KEY `idx_age` (`age`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Fragen Sie die Benutzerinformationen dieses Alters anhand eines Stapels von Benutzeraltern ab und prüfen Sie Geben Sie den SQL-Ausführungsplan ein:
explain select * from user where age in (1,2,3,4,5,6,7,8,9);
Die Where-Bedingung enthält 9 Parameter. Konzentrieren Sie sich auf die geschätzte Anzahl gescannter Zeilen im Ausführungsplan, die 279 Zeilen beträgt.
Hier gibt es kein Problem, die Schätzung ist sehr genau, es sind tatsächlich 279 Zeilen.
Wenn wir jedoch einen weiteren Parameter zur Where-Bedingung hinzufügen, hätte sich die geschätzte Anzahl der gescannten Zeilen erhöhen sollen, aber das Ergebnis wurde stark reduziert.
explain select * from user where age in (1,2,3,4,5,6,7,8,9,10);
Es wurde plötzlich auf 30 Zeilen reduziert, aber wie viele Zeilen sind tatsächlich vorhanden?
Die tatsächliche Anzahl beträgt 310 Zeilen und die geschätzte Anzahl der gescannten Zeilen beträgt 30 Zeilen. Es ist wirklich ein Fehler der Großmutter.
Was ist mit MySQL los? Lässt sich das noch abschätzen?
Wenn Sie es nicht vorhersagen können, nutzen Sie jemand anderen!
Alle müssen verwirrt gewesen sein, bis ich auf die offizielle Website ging und ein Wort sah: Index dive.
Im Zusammenhang mit diesem Wort gibt es auch einen Konfigurationsparameter eq_range_index_dive_limit.
MySQL5.7.3Vor der Version war dieser Wert standardmäßig 10 und in späteren Versionen war dieser Wert standardmäßig 200.
Mit dem Befehl können Sie die Größe dieses Werts überprüfen:
show variables like '%eq_range_index_dive_limit%';
Natürlich können wir die Größe dieses Werts auch manuell ändern:
set eq_range_index_dive_limit=200;
Dieser eq_range_index_dive_limit Die Rolle des Die Konfiguration lautet:
Wenn die Anzahl der Parameter in der Bedingungsanweisung unter diesem Wert liegt, verwendet MySQL Index Dive, um die Anzahl der gescannten Zeilen zu schätzen, was sehr genau ist.
Wenn die Anzahl der Parameter in der In-Bedingung der where-Anweisung größer oder gleich diesem Wert ist, verwendet MySQL eine andere Methode Indexstatistik (Indexstatistik) , um die Anzahl der gescannten Zeilen zu schätzen, mit einem großen Fehler.
Warum macht MySQL das?
Wir alle verwenden Index dive, um die Anzahl der gescannten Zeilen zu schätzen, ist das nicht gut?
Tatsächlich basiert dies auf Kostenüberlegungen IndextauchenDie geschätzten Kosten sind höher und für kleine Datenmengen geeignet. IndexstatistikDie geschätzten Kosten sind niedrig und für große Datenmengen geeignet.
Im Allgemeinen hat die In-Bedingung unserer where-Anweisung nicht zu viele Parameter, daher ist es geeignet, Indextauchen zu verwenden, um die Anzahl der gescannten Zeilen zu schätzen.
Es wird empfohlen, dass Schüler, die noch die vorherige Version von MySQL5.7.3 verwenden, die Konfigurationsparameter von Index Diving manuell auf geeignete Werte ändern.
Wenn der In-Zustand in Ihrem Projekt bis zu 500 Parameter hat, ändern Sie den Konfigurationsparameter auf 501.
Auf diese Weise schätzt MySQL die Anzahl der gescannten Zeilen genauer und kann einen passenderen Index auswählen.
Das obige ist der detaillierte Inhalt vonIndex-Diving-Instanzanalyse zur Optimierung der MySQL-Abfrageleistung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!