Maison  >  Article  >  développement back-end  >  Pourquoi la base de données/sql dans Go est-elle plus lente que l'interrogation directe de Postgres ?

Pourquoi la base de données/sql dans Go est-elle plus lente que l'interrogation directe de Postgres ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-21 11:09:12612parcourir

Why is database/sql in Go Slower than Directly Querying Postgres?

Requête à l'aide de base de données/sql plus lente que l'interrogation directe vers Postgres

Lors de l'interrogation d'une instance Postgres locale à l'aide d'une application Go, il peut y avoir un différence de performances notable entre l'utilisation de base de données/sql et l'interrogation directe de la base de données. Cette question explore les causes potentielles de cet écart.

Informations générales

Le package database/sql fournit une interface pour interagir avec les bases de données SQL. Il gère un pool de connexions à la base de données, et chaque connexion peut être utilisée pour exécuter plusieurs requêtes. Cependant, il est crucial de comprendre la gestion des connexions lors de l'utilisation de base de données/sql.

  • Pool de connexions : sql.DB représente un pool de connexions, pas une seule connexion. Le pool peut être configuré avec des options telles que le nombre maximum de connexions et la durée de vie maximale des connexions.
  • Ouverture de connexion paresseuse : Lorsque vous ouvrez une connexion à l'aide de sql.Open, la connexion réelle l’établissement peut ne pas se produire immédiatement. La piscine ouvre paresseusement les connexions selon les besoins.

Explication de la différence de performances

La principale raison de la différence de performances est la suivante :

1. Établissement de nouvelles connexions :

  • La première db.Query est relativement lente car elle implique l'établissement d'une nouvelle connexion à la base de données.
  • La deuxième db.Query est légèrement plus lente car le pool ouvre une nouvelle connexion au lieu de réutiliser la connexion de la première requête.

Solution :

Pour éliminer les pertes de performances causées par l'établissement de nouvelles connexions, il est recommandé de :

  • Rétablir les connexions au pool : Après avoir terminé chaque requête, fermez l'objet rows renvoyé par db.Query. Cela libère la connexion associée au pool.
  • Pré-initialisez le pool : Après avoir ouvert le pool, appelez db.Ping pour forcer l'établissement d'au moins une connexion avant d'exécuter des requêtes. . Cela garantit qu'il y aura une connexion disponible pour la première requête.

Avec ces optimisations, les performances des requêtes base de données/sql peuvent être considérablement améliorées.

Remarque sur Déclarations préparées :

Si vos requêtes impliquent des arguments, il est important de noter que database/sql crée et exécute en fait une instruction préparée sous le capot. Les instructions préparées offrent des avantages en termes d'efficacité, mais elles impliquent également une certaine surcharge, en particulier pour les requêtes simples sans arguments.

En comprenant la gestion des connexions et le comportement des instructions préparées de la base de données/sql, vous pouvez optimiser les performances de vos requêtes et éliminer ralentissements importants.

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