Vorwort
MySQL verzeichnete auch im Jahr 2016 einen starken Wachstumstrend bei der Beliebtheit von Datenbanken. Immer mehr Kunden bauen ihre Anwendungen auf der MySQL-Datenbank auf oder migrieren sogar von Oracle auf MySQL. Allerdings stoßen einige Kunden auch auf Probleme wie langsame Antwortzeiten und volle CPU-Auslastung bei der Verwendung der MySQL-Datenbank.
Das Expertenteam von Alibaba Cloud RDS hat Cloud-Kunden bei der Lösung vieler Notfallprobleme geholfen. Einige häufige SQL-Probleme, die im „ApsaraDB Expert Diagnostic Report“ auftauchen, sind zu Ihrer Information wie folgt zusammengefasst.
1. LIMIT-Anweisung
Paging-Abfrage ist eines der am häufigsten verwendeten Szenarios, aber normalerweise auch das anfälligste für Probleme.
Für die folgende einfache Anweisung besteht die Idee des allgemeinen DBA beispielsweise darin, einen kombinierten Index für die Felder „Typ“, „Name“ und „Erstellungszeit“ hinzuzufügen. Auf diese Weise kann die bedingte Sortierung den Index effektiv nutzen und die Leistung schnell verbessern.
SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' ORDER BY create_time LIMIT 1000, 10;
Nun, vielleicht lösen mehr als 90 % der Datenbankadministratoren dieses Problem und hören dort auf.
Aber wenn die LIMIT-Klausel zu „LIMIT 1000000,10“ wird, werden sich Programmierer immer noch beschweren: Warum ist es immer noch langsam, wenn ich nur 10 Datensätze abrufe?
Sie müssen wissen, dass die Datenbank nicht weiß, wo der 1.000.000ste Datensatz beginnt. Auch wenn ein Index vorhanden ist, muss dieser von Anfang an berechnet werden. Wenn ein solches Leistungsproblem auftritt, ist der Programmierer in den meisten Fällen faul. In Szenarien wie Front-End-Datendurchsuchen und Seitenumblättern oder Big-Data-Export in Stapeln kann der Maximalwert der vorherigen Seite als Parameter als Abfragebedingung verwendet werden. SQL wurde wie folgt neu gestaltet:
SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' AND create_time > '2017-03-16 14:00:00' ORDER BY create_time limit 10;
2. Implizite Konvertierung
Nichtübereinstimmung zwischen Abfragevariablen- und Felddefinitionstypen in SQL-Anweisungen ist ein weiterer häufiger Fehler. Zum Beispiel die folgende Anweisung:
Das Feld bpn ist als varchar(20) definiert. Die Strategie von MySQL besteht darin, die Zeichenfolge vor dem Vergleich in eine Zahl umzuwandeln. Die Funktion wirkt auf Tabellenfelder und der Index wird ungültig.
Bei der oben genannten Situation handelt es sich möglicherweise um die vom Anwendungsframework automatisch ausgefüllten Parameter und nicht um die ursprüngliche Absicht des Programmierers. Heutzutage gibt es viele Anwendungs-Frameworks, die zwar einfach zu verwenden sind, aber seien Sie vorsichtig, dass sie Ihnen Lücken bereiten.
3. Assoziationsaktualisierung, löschen
Obwohl MySQL5.6 die Materialisierungsfunktion einführt, sollte besonders darauf geachtet werden, dass es derzeit nur für Abfrageanweisungen optimiert ist . Für Aktualisierungen oder Löschungen müssen Sie es manuell in JOIN umschreiben.
Zum Beispiel führt MySQL in der folgenden UPDATE-Anweisung tatsächlich eine Schleife/verschachtelte Unterabfrage (DEPENDENT SUBQUERY) aus, und die Ausführungszeit kann man sich vorstellen.
Ausführungsplan:
4. Gemischte Sortierung
MySQL Für die gemischte Sortierung können keine Indizes verwendet werden. In einigen Szenarien gibt es jedoch immer noch Möglichkeiten, spezielle Methoden zur Leistungsverbesserung einzusetzen.
Der Ausführungsplan wird als vollständiger Tabellenscan angezeigt:
Da is_reply nur zwei Zustände hat: 0 und 1, wir folgen Nachdem die folgende Methode neu geschrieben wurde, wurde die Ausführungszeit von 1,58 Sekunden auf 2 Millisekunden reduziert.
5、EXISTS语句
MySQL 对待 EXISTS 子句时,仍然采用嵌套子查询的执行方式。如下面的 SQL 语句:
执行计划为:
去掉 exists 更改为 join,能够避免嵌套子查询,将执行时间从1.93秒降低为1毫秒。
新的执行计划:
6、条件下推
外部查询条件不能够下推到复杂的视图或子查询的情况有:
聚合子查询;
含有 LIMIT 的子查询;
UNION 或 UNION ALL 子查询;
输出字段中的子查询;
如下面的语句,从执行计划可以看出其条件作用于聚合子查询之后:
确定从语义上查询条件可以直接下推后,重写如下:
SELECT target Count(*) FROM operation WHERE target = 'rm-xxxx' GROUP BY target
执行计划变为:
关于 MySQL 外部条件不能下推的详细解释说明请参考文章:
http://mysql.taobao.org/monthly/2016/07/08
相了解更多相关问题请访问PHP中文网:mysql视频教程
Das obige ist der detaillierte Inhalt von8 häufige SQL-Nutzungsfehler in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!