Heim  >  Artikel  >  Datenbank  >  8 häufige SQL-Nutzungsfehler in MySQL

8 häufige SQL-Nutzungsfehler in MySQL

王林
王林nach vorne
2019-08-27 10:49:442633Durchsuche

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:

8 häufige SQL-Nutzungsfehler in MySQL

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.

8 häufige SQL-Nutzungsfehler in MySQL

Ausführungsplan:

8 häufige SQL-Nutzungsfehler in MySQL

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.

8 häufige SQL-Nutzungsfehler in MySQL

Der Ausführungsplan wird als vollständiger Tabellenscan angezeigt:

8 häufige SQL-Nutzungsfehler in MySQL

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.

8 häufige SQL-Nutzungsfehler in MySQL

5、EXISTS语句

MySQL 对待 EXISTS 子句时,仍然采用嵌套子查询的执行方式。如下面的 SQL 语句:

8 häufige SQL-Nutzungsfehler in MySQL

执行计划为:

8 häufige SQL-Nutzungsfehler in MySQL

去掉 exists 更改为 join,能够避免嵌套子查询,将执行时间从1.93秒降低为1毫秒。

8 häufige SQL-Nutzungsfehler in MySQL

新的执行计划:

8 häufige SQL-Nutzungsfehler in MySQL

6、条件下推

外部查询条件不能够下推到复杂的视图或子查询的情况有:

聚合子查询;

含有 LIMIT 的子查询;

UNION 或 UNION ALL 子查询;

输出字段中的子查询;

如下面的语句,从执行计划可以看出其条件作用于聚合子查询之后:

8 häufige SQL-Nutzungsfehler in MySQL

8 häufige SQL-Nutzungsfehler in MySQL

确定从语义上查询条件可以直接下推后,重写如下:

SELECT target Count(*)  FROM   operation  WHERE  target = 'rm-xxxx'  GROUP  BY target

执行计划变为:

8 häufige SQL-Nutzungsfehler in MySQL

关于 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:cnblogs.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen