Maison  >  Article  >  développement back-end  >  Pourquoi ma requête de base de données/sql Go est-elle considérablement plus lente qu'une requête psql Postgres directe ?

Pourquoi ma requête de base de données/sql Go est-elle considérablement plus lente qu'une requête psql Postgres directe ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-22 09:44:11816parcourir

Why is my Go database/sql Query Significantly Slower Than a Direct Postgres psql Query?

L'interrogation à l'aide de la base de données/sql est nettement plus lente que l'interrogation directe de la base de données

Malgré l'utilisation de requêtes identiques, il existe un écart de performances notable entre l'exécution d'un requête directement à l'aide de l'utilitaire psql de Postgres et en utilisant le package base de données/sql dans une application Go. Cet écart, où les requêtes qui prennent des millisecondes dans psql prennent des dizaines de millisecondes dans Go, pourrait être attribuée à des facteurs spécifiques dans la mise en œuvre.

Comprendre les connexions base de données/sql

database/sql initialise un pool de connexions pour établir des connexions à la base de données, plutôt que de créer une seule connexion. Le retard initial dans l'exécution des requêtes dans la base de données/sql est dû au fait que le pool commence avec zéro connexion ouverte. La première requête doit établir une connexion au serveur avant d'exécuter l'instruction SQL.

Les requêtes suivantes sont également confrontées à des retards car la connexion de la première requête n'a pas été rétablie dans le pool. Cela signifie que chaque requête suivante doit créer une nouvelle connexion avant d'exécuter la requête.

Libération des connexions vers le pool

Pour résoudre l'écart de performances, assurez-vous que les connexions sont libérés dans le pool après chaque requête. La libération d'une connexion implique de conserver la valeur de retour principale de db.Query et d'appeler ensuite la méthode Close dessus.

Initialisation du pool avec une connexion ouverte

Pour atténuer les délai initial, appelez Ping sur le pool de connexions immédiatement après l'initialisation. Cela garantit qu'au moins une connexion est disponible dans le pool.

Déclarations préparées

Bien que les requêtes simples sans arguments soient exécutées comme prévu, les requêtes avec des arguments dans la base de données/sql créez et exécutez réellement des instructions préparées sous le capot. Les instructions préparées offrent des avantages en termes de performances lors de l'exécution de la même requête plusieurs fois avec des arguments différents.

Résolution de la latence supplémentaire

Outre la gestion des connexions et les instructions préparées, il peut y avoir des facteurs de latence supplémentaires à considérer :

  • Latence du réseau : Le retard causé par le transfert de données sur le réseau entre l'application et la base de données.
  • Charge du serveur : La charge de travail du serveur de base de données peut affecter les temps d'exécution des requêtes.

En abordant ces facteurs et en mettant en œuvre les recommandations à condition que les performances des requêtes utilisant base de données/sql puissent être considérablement améliorées, ce qui les rend comparables à l'interrogation directe de la 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