Heim  >  Artikel  >  Backend-Entwicklung  >  Interviewfrage: Sprechen Sie darüber, wie Sie MySQL-Datenbankabfragen optimieren können

Interviewfrage: Sprechen Sie darüber, wie Sie MySQL-Datenbankabfragen optimieren können

WBOY
WBOYOriginal
2016-08-08 09:19:39838Durchsuche

1. Datentypen optimieren

Wenn Sie ein DBA sind, überprüfen Sie die Datentypen streng nach dem Optimierungsprinzip . , aber Entwickler entscheiden sich möglicherweise für die ihrer Meinung nach einfachste Lösung, um die Codierung zu beschleunigen, oder wählen die naheliegendste Option, sodass Sie möglicherweise nicht mit der besten Wahl konfrontiert werden und wenn möglich versuchen sollten, diese Entscheidungen zu ändern.

(1) Vermeiden Sie die Verwendung von NULL

NULL erfordert für die meisten Datenbanken eine spezielle Behandlung, und MySQL ist keine Ausnahme, es erfordert mehr Code, mehr Aufgrund von Prüfungen und spezieller Indexlogik wissen einige Entwickler überhaupt nicht, dass NULL der Standardwert beim Erstellen einer Tabelle ist, aber in den meisten Fällen sollten Sie NOT NULL oder einen speziellen Wert wie 0, -1 als Standardwert verwenden.

 (2) Es dürfen nur kleinere Felder verwendet werden

Nachdem MySQL die Daten von der Festplatte gelesen hat, werden sie im Speicher gespeichert und dann Verwendete CPU-Zyklen und Festplatten-E/A lesen es, was bedeutet, dass je kleiner der Datentyp ist, desto weniger Platz beansprucht er und die Effizienz beim Lesen von der Festplatte oder beim Packen in den Speicher ist besser, aber seien Sie nicht zu besessen davon Reduzieren des Datentyps, wenn kein Platz für zukünftige Änderungen an der Anwendung ist. Das Ändern der Tabelle erfordert eine Rekonstruktion, was indirekt zu Codeänderungen führen kann. Dies bereitet Kopfschmerzen, daher muss ein Gleichgewicht gefunden werden.

2. Seien Sie vorsichtig bei der Zeichensatzkonvertierung

Der vom Client oder der Anwendung verwendete Zeichensatz kann sich vom Zeichensatz des unterscheiden Die Tabelle selbst ist erforderlich, um die Konvertierung implizit zur Laufzeit durchzuführen. Außerdem muss ermittelt werden, ob Zeichensätze wie UTF-8 Multibyte-Zeichen unterstützen, sodass sie mehr Speicherplatz benötigen.

3. Optimieren Sie count(my_col) und count(*)

Wenn Sie die MyISAM-Tabelle verwenden, ohne where-Klausel. Verwenden Sie count(*) ist sehr schnell, da die Statistiken über die Anzahl der Zeilen sehr genau sind, sodass MySQL nicht Zeile für Zeile durchsucht, um die Anzahl der Zeilen zu ermitteln. Wenn die Spalte my_col keinen Nullwert hat, ist die oben beschriebene Situation anders . Dasselbe, das heißt, count(my_col) wird sehr schnell sein.

Wenn Sie count() verwenden, wenn eine where-Klausel vorhanden ist, kann grundsätzlich keine weitere Optimierung durchgeführt werden. Die offensichtlichen Indexspalten werden in der where-Klausel überschritten. Nur nützlich, wenn ein abdeckender Index verwendet wird.

Zusätzlich zu den oben genannten Vorschlägen können Sie auch Zusammenfassungstabellen verwenden. Sie ermöglichen es Ihnen, den Inhalt der Tabelle auf dem neuesten Stand zu halten. Sie können Trigger oder Anwendungslogik verwenden, um die Zusammenfassung beizubehalten Stellen Sie sicher, dass die Tabellensumme auf dem neuesten Stand ist, oder führen Sie regelmäßig einen Batch-Job aus, um sie mit den neuesten Daten zu füllen. Wenn Sie Letzteres tun, sind Ihre Informationen sehr ähnlich, aber nicht genau, je nachdem, wie oft der Batch-Job ausgeführt wird Es muss ein Gleichgewicht zwischen dem Bedarf des Programms an genauen Informationen und dem Systemaufwand für die Aktualisierung der Daten gefunden werden.

4. Unterabfragen optimieren

Bei Unterabfragen ist die MySQL-Abfrageoptimierungs-Engine nicht immer die effektivste. Aus diesem Grund Wenn Unterabfragen häufig in Join-Abfragen umgewandelt werden, ist darauf zu achten, dass der Optimierer Join-Abfragen korrekt verarbeiten kann. Dabei muss sichergestellt werden, dass die Join-Spalten der Join-Tabelle (der zweiten Tabelle) normalerweise indiziert werden Scannen Sie eine Tabelle relativ zu einer Teilmenge der Abfrage in der zweiten Tabelle als Teil des Nested-Loop-Algorithmus.

5. UNION optimieren

Die Verwendung von UNION beim Überspannen mehrerer verschiedener Datenbanken ist eine interessante Optimierungsmethode Es dürfen keine doppelten Zeilen vorhanden sein, und die Daten müssen auch sortiert werden. Wir wissen, dass das Sortieren sehr ressourcenintensiv ist, insbesondere das Sortieren großer Tabellen.

UNION ALL kann die Arbeit erheblich beschleunigen. Wenn Sie bereits wissen, dass Ihre Daten keine doppelten Zeilen enthalten, oder es Ihnen egal ist, ob doppelte Zeilen angezeigt werden, verwenden Sie in beiden Fällen UNION. ALL ist besser geeignet. Darüber hinaus können einige Methoden in der Anwendungslogik verwendet werden, um doppelte Zeilen zu vermeiden, sodass die von UNION ALL und UNION zurückgegebenen Ergebnisse zwar gleich sind, UNION ALL jedoch nicht sortiert wird.

Originaltext von [Bitnet]: http://soft.chinabyte.com/database/254/11335754.shtml

Verwandte Lektüre

Optimierung von MySQL (wie man SQL-Anweisungen mit geringer Ausführungseffizienz in MySQL abfragt)

Wie man in MySQL Dutzende von gemeinsamen Abfragen für mehrere Tabellen mit derselben Struktur durchführt Millionen von Datenbanken? Wie kann ich die Abfragegeschwindigkeit optimieren oder einrichten, um sie zu verbessern?

Abfrageoptimierung und Paging-Tests von zig Millionen Daten in der MySQL-Datenbank

MySQL-Lernerfahrung

8 Möglichkeiten zur Optimierung der MySQL-Datenbank

Das Obige stellt die Interviewfragen vor: Sprechen Sie über die Optimierung von MYSQL-Datenbankabfragen, einschließlich Aspekten des Inhalts. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

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