Dieser Artikel stellt hauptsächlich den Austausch von MySQL-SQL-Optimierungsfähigkeiten vor. Er ist sehr gut und hat Referenzwert.
Eines Tages habe ich eine SQL mit innerer Verknüpfung gefunden Die Geschwindigkeit ist nicht sehr langsam (0,1-0,2), aber die ideale Geschwindigkeit wird nicht erreicht. Die beiden Tabellen stehen in Beziehung, die zugehörigen Felder sind Primärschlüssel und die abgefragten Felder sind eindeutige Indizes.
SQL lautet wie folgt:
SELECT p_item_token.*, p_item.product_type FROM p_item_token INNER JOIN p_item ON p_item.itemid = p_item_token.itemid WHERE p_item_token.token ='db87a780427d4d02ba2bd49fac8xxx';
In der Tabelle p_item_token ist itemid der Primärschlüssel und token der eindeutige Index. itemid in p_item ist der Primärschlüssel
Entsprechend der idealen Geschwindigkeit sollte sie etwa 0,03 s betragen. Der tatsächliche Wert liegt jedoch bei etwa 0,2, was viel langsamer ist.
Erklären Sie direkt, um den Plan zu sehen
EXPLAIN SELECT p_item_token.*, p_item.product_type FROM p_item_token INNER JOIN p_item ON p_item.itemid = p_item_token.itemid WHERE p_item_token.token = 'db87a780427d4d02ba2bd49fac8xxx';
Ergebnis:
Achten Sie auf das große rote Kästchen oben. Die p_item-Tabelle enthält 2w Datenelemente, es handelt sich also um einen vollständigen Tabellenscan.
Das ist nicht normal.
Showwarnungen hinzufügen und einen Blick darauf werfen. Hinweis: In einigen Fällen führt SHOW WARNINGS zu keinen Ergebnissen. Den Grund kenne ich noch nicht. Es wird empfohlen, mit einer lokalen Testdatenbank zu arbeiten.
EXPLAIN SELECT p_item_token.*, p_item.product_type FROM p_item_token INNER JOIN p_item ON p_item.itemid = p_item_token.itemid WHERE p_item_token.token = 'db87a780427d4d02ba2bd49fac8xxx'; SHOW WARNINGS;
Ergebnis 2 zeigt code=1003. Dahinter steckt eine SQL-Anweisung. Diese Anweisung ist die letzte Anweisung, die von MySQL ausgeführt wird, nachdem die von uns eingegebene SQL-Anweisung gemäß den Regeln neu geschrieben wurde.
/* select#1 */ SELECT '0000eb612d78407a91a9b3854ffffffff' AS `itemid`, /*注:直接按主键把值查出来了*/ 'db87a780427d4d02ba2bd49fac8cf98b' AS `token`, '2016-12-16 10:46:53' AS `create_time`, '' AS `ftoken`, `p_db`.`p_item`.`product_type` AS `product_type` FROM `p_db`.`p_item_token` JOIN `p_db`.`p_item` WHERE ( ( CONVERT ( `p_db`.`p_item`.`itemid` USING utf8mb4 ) = '0000eb612d78407a91a9b3854fffffff' ) )
Seltsam. Warum gibt es CONVERT in Wo? Wir wissen, dass eine Funktion auf der linken Seite der Gleichung in der Where-Bedingung, also dem abzufragenden Feld, zu einer Verlangsamung führt. (Mein Verständnis: Es ist langsam, weil der Index nicht mehr verwendet wird. Der Wert des Index ist der ursprüngliche Wert, aber der verarbeitete Wert wird in diesem Zustand verwendet.)
Achten Sie auf diese Funktion, bedeutet, die Codierung dieser Spalte in utf8mb4 zu ändern.
Öffnen Sie die Tabelle und ändern Sie die Codierung der Spalte itemid in beiden Tabellen nach utf8. Führen Sie „explain“ erneut aus.
Den Interpretationsergebnissen nach zu urteilen, gibt es kein Problem.
Sehen Sie sich die Anweisungen in Ergebnis 2 an:
/* select#1 */ SELECT '0000eb612d78407a91a9b3854fffffff' AS `itemid`, 'db87a780427d4d02ba2bd49fac8cf98b' AS `token`, '2016-12-16 10:46:53' AS `create_time`, '' AS `ftoken`, 'cxx' AS `product_type` FROM `toy_item_plat`.`p_item_token` JOIN `toy_item_plat`.`p_item` WHERE 1
Diese Auswahl besteht ausschließlich aus Konstanten. Kann es schneller sein?
Das Ausführungsergebnis beträgt 0,036 Sekunden. Entspricht den Erwartungen
Erfahrungszusammenfassung:
Erklären Sie, ob der Ausführungsplan den Erwartungen entspricht. Wenn große Zeilen vorhanden sind, bedeutet dies, dass ein vollständiger Tabellenscan stattgefunden hat wird in Zukunft zu einem Leistungsengpass führen
Warnungsergebnisse anzeigen, Sie können die vom Optimierer verarbeitete Anweisung sehen. Sollte es Abweichungen von der ursprünglichen Aussage geben, kann ein sorgfältiger Vergleich und eine sorgfältige Untersuchung das tatsächliche Problem aufdecken.
Das Obige ist eine detaillierte Einführung in den grafischen Code der MySQL-SQL-Optimierungstechnik. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)!