【问题标题】:Which is faster: to run the same sql query twice or run only once and store the result in arrays?哪个更快:运行相同的 sql 查询两次或只运行一次并将结果存储在数组中?
【发布时间】:2016-03-08 16:01:25
【问题描述】:

假设我有一个 SQL 查询,它给了我一些复杂的数据,为了在 HTML 中正确显示它,我想出了一个方法,我运行两次相同(或相似)的查询。

为了避免两次运行相同的查询,我可以在内存中创建一个表(最多几百行),使用数组数组或类似的东西。

我的问题是:Postgresql 是否为最后一次操作提供某种缓存,在这种情况下,两次运行完全相同的查询而不是创建数组数组可能更有利?

【问题讨论】:

  • 您是在请求之间存储还是在同一个 http 请求中存储?如果它是相同的,我会将结果存储在 PHP 中并重用它。你总是可以benchmark it
  • 除非是海量数据,否则缓存在php中。即使使用 DB 查询缓存,您仍然需要强制 DB 和 PHP 对数据进行编码/解码以进行在线传输,以及构建内部数据结构以保存查询数据的所有开销,等等等等。

标签: php performance postgresql caching


【解决方案1】:

将结果存储在 RAM 中无疑会更快,但会使用更多 RAM。这是一个权衡。即使 Postgre 确实有一些最后的查询缓存,您仍然需要通过网络移动数据才能访问它,这仍然比简单地去 RAM 获取数据要慢。 p>

【讨论】:

  • 如果DB服务器与Web服务器相同,则不会通过网络移动。
  • 这是一个公平的观点,但我想仍然会涉及到套接字(我不确定 Postgre 尤其如此)。 仍然比 RAM 慢。
【解决方案2】:

如果你想知道 postgresql 是否有 mysql query cache 的等价物,简短的回答是否定的。长答案是它可以通过各种方式获得,例如pgpool

但是应该注意的是,如果已经为 postgresql 分配了足够的内存,它将在内存中缓存索引和数据,并且第二次执行查询时,即使结果集没有被缓存,它也会比第一次快得多默认情况下。

即使您将结果集保存在内存中,它也可能不会比从数据库中获取它更有效,如果没有基准测试很难说。

如果你知道你的查询很慢并且不能用更好的索引来优化,并且你想在不同的 http 请求中使用结果,你应该投资一个缓存机制,比如 redis 或 memcached。您将看到性能大幅提升。

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 2017-02-17
    • 1970-01-01
    • 2013-05-14
    相关资源
    最近更新 更多