在生产中记录 SQL 查询?

Posted

技术标签:

【中文标题】在生产中记录 SQL 查询?【英文标题】:Log SQL queries in production? 【发布时间】:2011-02-27 22:14:03 【问题描述】:

我在是否也要在生产环境中记录 SQL 查询方面陷入两难境地。

我不知道在 php 中写入文件有多慢。也许一些基准可以给出一些答案,但我想看看你们之前的想法。

什么会使过程变慢或不会变慢?或者它可能取决于什么?

【问题讨论】:

【参考方案1】:

作为记录(您没有指定您的数据库),Postgresql 有一个与日志记录相关的bunch of options。其中,我使用 log_min_duration_statement 来记录运行时间超过 N 秒的查询。用于分析,无需填充日志文件并干扰性能。我敢打赌大多数数据库都有类似的东西。

【讨论】:

【参考方案2】:

大多数数据库都有用于记录查询和慢速查询的内置选项,因此您不需要通过 PHP 进行记录。除非您遇到问题并且这是故障排除过程的一部分,否则您不应记录生产中的所有查询。您可以并且应该记录慢速查询,以便查看可能导致您的生产站点变慢的原因。

如果您的框架支持它,则只有在页面生成需要一定时间时才能记录查询(这就是我所做的)。然后,您将有条件地进行日志记录,并且可能会发现正在运行的查询数量过多。

【讨论】:

注意内置的数据库日志,如果不仔细应用可能会降低整体性能 这就是我们在我们的应用程序上所做的。如果它很慢,我们会记录查询并在日志消息中放置一个易于识别的字符串。如果我们想要所有的查询,我们就去 dbas。如果您依赖数据库查询日志,建议在每个查询中放置一个唯一的注释字符串,这样您就可以知道它来自应用程序的哪个位置。这很好,因为我们关心的是出了什么问题,而不是发生的一切。 这就是我们所做的。 mysql 记录自己的查询,慢日志是分开的。日志是文本文件(不同于用于复制和恢复的二进制事务日志文件)并且可以非常快速地追加到。此外,日志记录在与系统和数据库不同的物理磁盘上完成,从而避免了磁盘争用。 +1:事务日志是数据库恢复/恢复的基础【参考方案3】:

你有几个选择:

让您的数据库记录查询 使用静态方法创建一个记录器类,该方法使用缓存的文件句柄进行写入。这非常快。此外,您可以将此类设置为查看配置中的日志变量,以忽略传入的 sql 查询或将其记录到文件中。假设您使用的是数据库 API,您可以扩展查询函数以包含此额外的代码行以用于(可选)日志记录

【讨论】:

【参考方案4】:

嗯,第 1 件会很慢的事情是通过访问数据库进行磁盘 IO。最好的答案是让您在一些不平凡的情况下尝试它(记住,对于小 n 来说一切都很快)并询问一些利益相关者是否可以接受性能。这可能不是您想要的答案,但它确实是最好的答案。

【讨论】:

以上是关于在生产中记录 SQL 查询?的主要内容,如果未能解决你的问题,请参考以下文章

何时在 oracle 查询中使用提示 [重复]

spark在生产中是否要禁止掉BHJ(BroadcastHashJoin)

是否有一种生产安全的方法来测量使用 Python 在生产中花费的时间?

BigQuery 未准确返回结果

记录仅节省20%的时间

使用 ELK 堆栈进行应用程序日志记录