Heim  >  Artikel  >  Datenbank  >  Detaillierte Einführung in den grafischen Code der MySQL-SQL-Optimierungstechniken

Detaillierte Einführung in den grafischen Code der MySQL-SQL-Optimierungstechniken

黄舟
黄舟Original
2017-03-06 13:31:071342Durchsuche

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)!


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn