Heim >Backend-Entwicklung >Golang >Warum ist „database/sql' in Go so viel langsamer als direkte PostgreSQL-Abfragen?

Warum ist „database/sql' in Go so viel langsamer als direkte PostgreSQL-Abfragen?

DDD
DDDOriginal
2024-11-18 02:52:02812Durchsuche

Why is `database/sql` in Go so much slower than direct PostgreSQL queries?

Diskrepanz in der Abfrageausführungszeit zwischen Datenbank-/SQL- und direkten Datenbankabfragen

In einer Go-Anwendung beobachten Sie einen erheblichen Zeitunterschied beim direkten Abfragen einer PostgreSQL-Datenbank über psql im Vergleich zur Verwendung des Datenbank/SQL-Pakets. Beim Ausführen derselben Abfrage ist Ihnen aufgefallen, dass Datenbank/SQL etwa 24 ms benötigt, während psql die Abfrage in nur 1 ms verarbeitet.

Den Unterschied verstehen:

Die Die Diskrepanz kann auf zwei Hauptfaktoren zurückgeführt werden:

1. Erstellung und Verwaltung von Datenbankverbindungen:

  • psql: Wenn Sie eine Abfrage direkt mit psql ausführen, wird eine einzelne, aktive Verbindung zur Datenbank hergestellt, die offen bleibt für die Dauer Ihrer Sitzung.
  • Datenbank/SQL: Im Gegensatz dazu verwendet Datenbank/SQL einen Verbindungspool, der mehrere Verbindungen zur Datenbank verwaltet. Zunächst gibt es keine aktiven Verbindungen im Pool. Wenn eine Abfrage mit Datenbank/SQL ausgeführt wird, stellt der Pool eine neue Verbindung her.

2. Ausführung vorbereiteter Anweisungen:

  • psql: Wenn Sie eine Abfrage über psql ausführen, handelt es sich im Allgemeinen um eine „einfache Abfrage“ ohne Parameter.
  • Datenbank/SQL: Standardmäßig verwendet Datenbank/SQL vorbereitete Anweisungen. Obwohl Ihre Abfrage keine Parameter hat, führt die Verwendung von $1 in der Abfrage dazu, dass Datenbank/SQL eine vorbereitete Anweisung erstellt und ausführt.

Optimierung der Abfrageleistung:

Um den Zeitunterschied zu minimieren, berücksichtigen Sie die folgenden Optimierungen:

1. Initialisieren Sie den Verbindungspool:

  • Verwenden Sie die Methode db.Ping() unmittelbar nach der Initialisierung der Datenbank-/SQL-Verbindung, um sicherzustellen, dass mindestens eine Verbindung im Pool geöffnet ist. Dadurch verringert sich die Latenz beim ersten Verbindungsaufbau.

2. Verbindungen freigeben:

  • Nachdem Sie eine Abfrage mit db.Query ausgeführt haben, rufen Sie die rows.Close()-Methode auf, um die Verbindung wieder in den Pool freizugeben. Andernfalls bleiben die Verbindungen offen, was zu potenziellen Ressourcenlecks führen kann.

3. Verwenden Sie nach Möglichkeit einfache Abfragen:

  • Wenn Ihre Abfrage keine Parametrisierung erfordert, geben Sie sie als Zeichenfolge direkt in db.Query an. Dadurch wird der Aufwand für das Erstellen und Ausführen vorbereiteter Anweisungen vermieden.

Durch die Implementierung dieser Optimierungen sollten Sie die Abfrageausführungszeit mithilfe von Datenbank/SQL deutlich reduzieren und sie der Leistung direkter Datenbankabfragen näher bringen.

Das obige ist der detaillierte Inhalt vonWarum ist „database/sql' in Go so viel langsamer als direkte PostgreSQL-Abfragen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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