Eines Tages stellte ich fest, dass die Ausführungsgeschwindigkeit einer SQL-Anweisung mit Inner Join nicht sehr langsam war (0,1–0,2), aber nicht die ideale Geschwindigkeit erreichte. Die beiden Tabellen sind verknüpft, und die verknüpften Felder sind Primärschlüssel und die abgefragten Felder sind eindeutige Indizes. Das SQL lautet wie folgt: WÄHLEN p_item_token.*, p_item.produkt_typ AUS p_item_token INNER JOIN p_item ON p_item.itemid = p_item_token.itemid WO 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 Sie sollte idealerweise bei ca. 0,03 s liegen. Der tatsächliche Wert liegt jedoch bei etwa 0,2, was viel langsamer ist. Direktes EXPLAIN, um den Plan anzuzeigen ERKLÄREN WÄHLEN p_item_token.*, p_item.produkt_typ AUS p_item_token INNER JOIN p_item ON p_item.itemid = p_item_token.itemid WO p_item_token.token = "db87a780427d4d02ba2bd49fac8xxx"; Ergebnis: Achten Sie auf das große rote Kästchen oben. Die Tabelle p_item enthält 20.000 Datensätze. Es handelt sich also um einen vollständigen Tabellenscan. Das ist nicht normal. Fügen Sie Show-Warnungen hinzu und sehen Sie nach. Hinweis: In manchen Fällen hat „WARNUNGEN ANZEIGEN“ keine Wirkung. Den Grund kenne ich noch nicht. Es wird empfohlen, mit einer lokalen Testdatenbank zu arbeiten. ERKLÄREN WÄHLEN p_item_token.*, p_item.produkt_typ AUS p_item_token INNER JOIN p_item ON p_item.itemid = p_item_token.itemid WO p_item_token.token = "db87a780427d4d02ba2bd49fac8xxx"; WARNUNGEN ANZEIGEN; Ergebnis 2 zeigt Code=1003. Dahinter verbirgt sich ein SQL-Statement. Diese Anweisung ist die letzte Anweisung, die von MySQL ausgeführt wird, nachdem die von uns eingegebene SQL-Anweisung entsprechend den Regeln umgeschrieben wurde. /* Auswahl#1 */ WÄHLEN '0000eb612d78407a91a9b3854ffffffff' AS `itemid`, /*Hinweis: Drücken Sie direkt die Primärtaste, um den Wert zu finden*/ 'db87a780427d4d02ba2bd49fac8cf98b' ALS `Token`, '2016-12-16 10:46:53' als `create_time`, '' ALS `ftoken`, `p_db`.`p_item`.`Produkttyp` AS `Produkttyp` AUS `p_db`.`p_item_token` JOIN `p_db`.`p_item` WO ( ( KONVERTIEREN ( `p_db`.`p_item`.`itemid` MIT utf8mb4 ) = '0000eb612d78407a91a9b3854fffffff' ) ) Das ist seltsam. Warum steht in „Wo“ ein „CONVERT“? Wir wissen, dass es zu Verlangsamung kommt, wenn sich in der Where-Bedingung eine Funktion auf der linken Seite der Gleichung befindet, also im abzufragenden Feld. (Mein Verständnis: Es ist langsam, weil der Index nicht verwendet wird. Der Wert des Index ist der ursprüngliche Wert, aber der in diesem Zustand verwendete Wert ist der verarbeitete Wert.) Beachten Sie, dass diese Funktion die Kodierung der Spalte itemid in utf8mb4 konvertiert. Mit anderen Worten: Die Kodierung dieser Spalte ist nicht utf8mb4! Öffnen Sie die Tabelle und ändern Sie die Kodierung der ItemID-Spalte in beiden Tabellen in UTF8. Führen Sie die Erklärung noch einmal aus. Es gibt kein Problem bei der Erklärung der Ergebnisse. Schauen Sie sich die Aussage in Ergebnis 2 an: /* Auswahl#1 */ WÄHLEN '0000eb612d78407a91a9b3854fffffff' als `itemid`, 'db87a780427d4d02ba2bd49fac8cf98b' ALS `Token`, '2016-12-16 10:46:53' als `create_time`, '' ALS `ftoken`, „cxx“ AS „Produkttyp“ AUS `Spielzeugartikelplatine`.`p_Artikeltoken` JOIN `toy_item_plat`.`p_item` WO 1 Diese Auswahl ist voller Konstanten. Wie kann es langsam sein? Ausführungsergebnis: 0,036 s. Erfüllt die Erwartungen Erkenntnisse: Explain kann überprüfen, ob der Ausführungsplan den Erwartungen entspricht. Wenn große Zeilen vorhanden sind, bedeutet dies, dass ein vollständiger Tabellenscan aufgetreten ist, der in Zukunft zu einem Leistungsengpass wird. Wenn Sie den Befehl „show warning“ verwenden, können Sie die vom Optimierer verarbeiteten Anweisungen sehen. Wenn es Unstimmigkeiten mit der ursprünglichen Aussage gibt, kann ein sorgfältiger Vergleich und eine sorgfältige Untersuchung das eigentliche Problem aufdecken. Das könnte Sie auch interessieren:
|
<<: Vue-Ereignisparameter $event = Ereigniswertfall
>>: Einführung in den Swap-Speicher des Linux-Systems
Inhaltsverzeichnis Vor der Transformation: Nach d...
Inhaltsverzeichnis 1. Testdaten 2. Die Unannehmli...
<!doctype html> <html xmlns="http:/...
Gelegentlich werden Sie in den Daten Zeichen wie ...
Inhaltsverzeichnis 1. Auf Ereignisse achten 2. Üb...
Vorwort Dieses Steuerelement weist beim direkten ...
Vor ein paar Tagen habe ich erfahren, dass die of...
Dieser Artikel stellt hauptsächlich ein Beispiel ...
Inhaltsverzeichnis Definition Konstruktorkörper s...
Wie unten dargestellt: SELECT Anzahl(DISTINCT(a.r...
Das Filterattribut definiert die visuelle Wirkung...
Entpacken Sie die Datei in ein Verzeichnis Dies i...
1. Fügen Sie die folgenden Abhängigkeiten in pom....
Beim Webdesign ist es sehr wichtig, eine organisi...
Inhaltsverzeichnis Versteckte, absteigende und fu...