【问题标题】:Reusing MySQL results重用 MySQL 结果
【发布时间】:2011-01-12 08:20:54
【问题描述】:

我有一些理论上的问题:我正在设计自己的 CMS/应用程序框架(就像许多 PHP 程序员以前在各个级别上所做的那样......并且永远都会这样做)以制作可用于生产的解决方案或开发各种模块/plugins 我稍后会用到。

无论如何,我正在考虑从整个应用程序收集 SQL 连接,然后在一个地方运行它们:

index.php:
<?php
  include ('latestposts.php');
  include ('sidebar.php');
?>

latestposts.php:
<?php
  function gather_data ($arg){ $sql= ""; }
  function draw ($data) {...}
?>

sidebar.php:
<?php
  function gather_data ($arg){ $sql= ""; }
  function draw ($data) {...}
?>

现在,虽然整个模块系统应用程序尚待构思,但它的想法已经浮现在我脑海中的某个地方。但是,我在想,如果我能够先加载所有 gather_data 函数,然后运行 ​​sql,然后运行 ​​draw 函数 - 并且我能够重用结果!

例如,如果$sqlSELECT * FROM POSTS LIMIT 10 并且$sql2SELECT * FROM POSTS LIMIT 5,是否可以编写PHP 来查看:“啊,这是相同的SQL,我只调用一次并重用前 5 行”?

或者是否可以将此行为添加到某些 DRM 中?

但是,正如标签所说,这仍然只是一个正在进行的想法。如果证明它很容易完成,那么我将发布更多问题:)

所以,基本上:这可能吗,有意义吗?如果两者都是肯定的,那么......有什么想法吗?

【问题讨论】:

    标签: php mysql theory application-design


    【解决方案1】:

    不要误会我的意思,这听起来像是一个合理的想法,你可能会让它运行起来。但我想知道它是否真的会有益。它会导致系统更快吗?给你更多控制权?让开发更轻松?

    我只是考虑使用(或构建)一个使用经过良好实践的 MVC 样式编码标准的系统,构建一个良好的数据库结构,并调整 Apache(或使用类似 Lighttpd 之类的东西)。如果您决定将代码开源,那么您的代码将会得到更广泛的认可,并且如果您需要帮助,其他开发人员可以直接介入并拿起键盘。

    另外,请查看 MySQL 中的查询缓存——您将看到与查询示例相关的缓存查询结果服务器端的类似(尽管不是一对一)好处。更好的是存储在服务器内存中,这样 PHP/MySQL 开销就被降低了,而且您不必编写代码。

    除此之外,我确实认为这是可能的。 =)

    【讨论】:

    • 我有一个应用程序,它有可能生成几个类似的请求。所有数据库交互都通过数据库对象隔离,并且对象本身(对应用程序的其余部分保持沉默)具有非常基本的缓存系统;基本上,某些非易失性函数会检查它们之前是否使用相同的参数调用过,如果是,则返回存储在数组中的结果。执行时间不到百分之几秒,但如果命中缓存而不是数据库,则可以节省 1-2 个数量级的时间。值得深思。
    • 如果您在某些情况下看到这种类型的返回,那么它可能是合适的——我已经多次存储 mysql 查询集,这些查询集在 gzip 压缩的平面文件中保持静态服务器进行检索,而不是通过 MySQL(语言翻译之类的东西不会改变)。我主要担心会有多个用户交互导致您的数据在您使用停滞缓存时变得无关紧要。但在正确的情况下,做你所说的可能是有意义的——但总的来说,你会获得足够的收益来应对麻烦吗?
    【解决方案2】:

    一般来说,这样的缓存系统可以节省大量时间,但代价是内存和复杂性。您想要保留的结果越多,占用的内存就越多;并且无法保证您的结果会被再次使用,尤其是较大的结果集。

    其次,有些查询永远不应该被缓存,或者即使它们在缓存中也应该再次运行。在大多数情况下,只有 SELECT 和 SHOW 查询可以被有效缓存,但是您需要担心在修改底层数据时它们会失效。即使在同一个页面浏览中,您有时也会发现自己在使用自己的缓存系统。

    第三,这种问题已经解决了好几次了。首先,考虑开启 MySQL 查询缓存。大多数情况下,它会加快速度,而无需您更改任何代码。但是,使条目无效有点激进,因此您可以在更高级别获得一些性能。

    如果您需要另一个级别,请考虑memcached。您必须手动存储条目并使其无效,但它可以跨页面视图存储结果(您将真正发现性能优势),并且会让未使用的条目在内存不足之前过期。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2019-04-18
      • 2013-08-05
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多