是否可以优化具有日期时间字段差异的mysql查询?

时间:2012-10-17 13:56:22

标签: mysql datetime

我有一个名为date_created的DATETIME字段的表,需要使用这种查询检查一些数据:

SELECT * FROM table WHERE UNIX_TIMESTAMP(date_created) + $number < UNIX_TIMESTAMP()

是否可以在没有UNIX_TIMESTAMP()函数的情况下执行此操作?也许与NOW())? 如果是的话,会更快吗?

2 个答案:

答案 0 :(得分:2)

  1.   

    是否可以在没有UNIX_TIMESTAMP()函数的情况下执行此操作?也许用NOW())?

    不完全是。虽然您可以执行以下操作,但它不会达到完全相同的结果:

    SELECT * FROM `table` WHERE date_created + INTERVAL $number SECOND < NOW()
    

    原因在于,TIMESTAMPDATETIME不同,$number既不打算也不能及时表示特定实例;相反,它有效地代表了日历/时钟的显示(不一样)。

    当使用不通过UTC时间戳的上述查询时,比较仅仅是现在时钟是否显示的日期/时间晚于数据库中记录的日期/时间的问题(加{{1 }}秒。。

    然而,当转换为UTC时间戳时,相应时钟显示的时区变得相关,并且因为许多时区不是恒定的(例如,它们经常四处移动以进行夏令时),多个DATETIME值可能会导致相同的UTC时间戳。

    例如:

    CREATE TABLE `table` (date_created DATETIME);
    INSERT INTO  `table` VALUES ('2012-10-28 01:00:00'), ('2012-10-28 02:00:00');
    

    然后在英国2012-10-28 02:00:00运行时比较两个查询的结果:

    • 您的原始查询:

      SET SESSION time_zone = 'Europe/London';
      
      SELECT *
      FROM   `table`
      WHERE  UNIX_TIMESTAMP(date_created) + 100
           < UNIX_TIMESTAMP('2012-10-28 02:00:00');
      
    • 上面的替代查询:

      SELECT *
      FROM   `table`
      WHERE   date_created + INTERVAL 100 SECOND
            < '2012-10-28 02:00:00';
      
  2.   

    如果是的话,它会更快吗?

    可能(比较的词典顺序就足够了,而不是根据会话时区的规则解析并将DATETIME值转换为UTC,然后进行减法和符号检查),但我建议您执行自己的基准测试

答案 1 :(得分:0)

如果可能,应避免在WHERE子句中使用eval表达式。它会阻止正确使用索引。如果可能,在代码中进行数学运算并将值作为查询参数发送。