在生产环境中记录SQL查询?

6

我正在犹豫是否在生产环境中记录SQL查询。

我不知道PHP中写入文件的速度有多慢。可能一些基准测试可以提供一些答案,但我想先听听你们的想法。

什么会使这个过程变慢?或者它可能取决于哪些因素?

4个回答

5

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

如果您所使用的框架支持,可以仅在页面生成所需时间超过某个特定值时记录查询(这就是我所做的)。然后,您是有条件地记录,并且可能会发现运行的查询数量过多。


1
请注意内置数据库日志记录,如果不小心应用,可能会降低整体性能。 - pcent
2
这是我们在应用中执行的操作。如果它变慢,我们会记录查询并在日志消息中放置一个易于搜索的字符串。如果我们想要所有的查询,我们会去找数据库管理员。如果您依赖于数据库查询日志,建议在每个查询中放置一个唯一的注释字符串,以便您可以知道它来自应用程序的哪个部分。这非常有效,因为我们关心的是出了什么问题,而不是发生了什么事情。 - Richard Levasseur
这就是我们所做的。MySQL会记录自己的查询,而慢查询日志是单独的。这些日志都是文本文件(不同于用于复制和恢复的二进制事务日志文件),非常快速方便地附加到其中。另外,日志记录在与系统和数据库不同的物理硬盘上,避免了磁盘争用的问题。 - Marcus Adams
+1:事务日志对于数据库恢复/还原至关重要。 - OMG Ponies

1

你有几个选项:

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

1
记录一下(您没有指定您的数据库),Postgresql有与日志记录相关的一堆选项。其中,我使用log_min_duration_statement来记录运行时间超过N秒的查询。这对于分析很有用,可以避免填满日志文件并干扰性能。我敢打赌大多数数据库都有类似的功能。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接