Maison >développement back-end >Golang >Pourquoi « database/sql » dans Go est-il tellement plus lent que les requêtes directes PostgreSQL ?

Pourquoi « database/sql » dans Go est-il tellement plus lent que les requêtes directes PostgreSQL ?

DDD
DDDoriginal
2024-11-18 02:52:02808parcourir

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

Différence dans le temps d'exécution des requêtes entre les requêtes base de données/sql et les requêtes directes de base de données

Dans une application Go, vous observez une différence de temps significative lors de l'interrogation d'une base de données PostgreSQL directement via psql par rapport à l'utilisation du package database/sql. En exécutant la même requête, vous avez remarqué que database/sql prend environ 24 ms, tandis que psql traite la requête en seulement 1 ms.

Comprendre la différence :

Le L'écart peut être attribué à deux facteurs principaux :

1. Création et gestion des connexions à la base de données :

  • psql : Lorsque vous exécutez une requête directement à l'aide de psql, celle-ci établit une connexion unique et active à la base de données, qui reste ouverte pendant toute la durée de votre session.
  • database/sql : En revanche, database/sql utilise un pool de connexions, qui gère plusieurs connexions à la base de données. Initialement, il n’y a aucune connexion active dans le pool. Lorsqu'une requête est exécutée à l'aide de base de données/sql, le pool établit une nouvelle connexion.

2. Exécution des instructions préparées :

  • psql : Lorsque vous exécutez une requête via psql, il s'agit généralement d'une "requête simple" sans aucun paramètre.
  • database/sql : Par défaut, database/sql utilise des instructions préparées. Bien que votre requête ne comporte aucun paramètre, l'utilisation de $1 dans la requête amène la base de données/sql à créer et à exécuter une instruction préparée.

Optimisation des performances de la requête :

Pour minimiser le décalage horaire, envisagez les optimisations suivantes :

1. Initialisez le pool de connexions :

  • Utilisez la méthode db.Ping() immédiatement après avoir initialisé la connexion base de données/sql pour vous assurer qu'au moins une connexion est ouverte dans le pool. Cela réduit la latence de l'établissement initial de la connexion.

2. Libérer les connexions :

  • Après avoir exécuté une requête à l'aide de db.Query, appelez la méthode rows.Close() pour libérer la connexion dans le pool. Ne pas le faire maintient les connexions ouvertes, entraînant des fuites potentielles de ressources.

3. Utilisez des requêtes simples lorsque cela est possible :

  • Si votre requête ne nécessite pas de paramétrage, spécifiez-la sous forme de chaîne directement dans db.Query. Cela évite la surcharge liée à la création et à l'exécution d'instructions préparées.

En mettant en œuvre ces optimisations, vous devriez réduire considérablement le temps d'exécution des requêtes à l'aide de base de données/sql et le rapprocher des performances des requêtes directes de base de données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn