使用数据库/sql 查询比直接查询数据库慢得多
尽管使用相同的查询,但执行查询之间存在明显的性能差异直接使用 Postgres 的 psql 实用程序并使用 Go 应用程序中的 database/sql 包进行查询。这种差异(在 psql 中需要几毫秒的查询在 Go 中需要几十毫秒)可能归因于实现中的特定因素。
了解数据库/sql 连接
database/sql 初始化一个连接池来建立与数据库的连接,而不是创建单个连接。 database/sql 中查询执行的初始延迟是因为池以零打开连接开始。第一个查询必须在执行 SQL 语句之前建立与服务器的连接。
后续查询也会面临延迟,因为第一个查询的连接尚未释放回池中。这意味着每个后续查询在执行查询之前都需要创建一个新连接。
将连接释放回池
要解决性能差异,请确保连接每次查询后都会释放回池中。释放连接涉及保留 db.Query 的主要返回值,然后调用其 Close 方法。
使用打开的连接初始化池
为了缓解初始延迟,初始化后立即对连接池调用 Ping。这可确保池中至少有一个连接可用。
准备好的语句
虽然不带参数的简单查询按预期执行,但在数据库/sql 中带参数的查询实际上在幕后创建并执行准备好的语句。使用不同参数多次执行相同查询时,准备好的语句可提供性能优势。
解决额外延迟
除了连接管理和准备好的语句之外,还可能存在其他延迟因素需要考虑:
通过解决这些因素并实施根据建议,使用database/sql查询的性能可以得到显着提升,堪比直接查询数据库。
以上是为什么我的 Go 数据库/sql 查询比直接 Postgres psql 查询慢得多?的详细内容。更多信息请关注PHP中文网其他相关文章!