【问题标题】:MySQL cache and date functionsMySQL 缓存和日期函数
【发布时间】:2011-01-18 17:13:35
【问题描述】:

我曾经在性能博客中读到,最好使用 PHP 的日期函数在 MySQL 查询中设置日期,而不是使用 curdate() 等 mysql 日期函数,因为 mysql 可以缓存查询或结果或类似的东西.有没有人对此有任何见解?它有水还是没有根据?

示例:

$query = 'SELECT id FROM table WHERE publish_date = \''.date('Y-m-d').'\'';

$query = 'SELECT id FROM table WHERE publish_date = CURDATE()';

【问题讨论】:

    标签: php mysql date query-cache


    【解决方案1】:

    任何包含CURDATE() 的函数都不会被缓存。 Source

    据我所知,硬编码日期仍应被缓存。尽管您可能想考虑使用prepare 功能而不是将字符串拼接到您的查询中(出于理智和安全考虑)。

    【讨论】:

      【解决方案2】:

      其实很简单。 MySQL 服务器看不到您的 PHP 代码,因此它会收到以下代码之一:

      SELECT id FROM table WHERE publish_date = '2010-01-18';
      SELECT id FROM table WHERE publish_date = CURDATE();
      

      它也不会读取您的意图。对于 MySQL,'2010-01-18' 是一个字符串并且是确定性的:它的值始终是 '2010-01-18'。但是,CURDATE() 不是确定性的:它的值取决于您运行它的日期。因此第一个是可缓存的,而第二个不是。

      【讨论】:

      • 是的,我知道 mysql 看不到我的 php 并接收到一个字符串。我知道它肯定可以缓存这个查询。我不确定 mysql 是否有可能使用 curdate 缓存查询直到一天结束或类似的东西。
      • @dqhendricks 嗯,MySQL 通过基础表的修改日期来确定缓存结果的有效性。它并不比这更复杂。
      【解决方案3】:

      我个人更喜欢第一种方式,因为它可以清楚地了解服务器时间(时区),我的 mysql 服务器在承诺时碰巧提前了 10 小时 :)

      PHP 脚本中的本地时间将应用于 SQL

      【讨论】:

      • 虽然不是手头问题的答案,但仍然是一个好点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多