【问题标题】:How to optimize mysql queries containing DATE_ADD()?如何优化包含 DATE_ADD() 的 mysql 查询?
【发布时间】:2011-10-18 07:46:09
【问题描述】:

这里是需要优化的查询:

Scans: 527676 records...
Returns: 496 records...

SELECT * FROM customers c
WHERE DATE_ADD(c.`custdate` ,INTERVAL -5 HOUR) BETWEEN '2011-09-14 00:00:00' AND '2011-09-14 23:59:59'
AND c.`custtype`='L'

不使用 DATE_ADD 也一样:

Scans: 801 records...
Returns: 481 records...

SELECT * FROM customers c
WHERE c.`custdate` BETWEEN '2011-09-14 00:00:00' AND '2011-09-14 23:59:59'

问题是我应该如何使用 DATE_ADD() 函数优化这个查询?不使用 DATE_ADD 它会提取我的索引并且查询很好。

等待这方面的帮助。

谢谢,

拉赫尔

【问题讨论】:

    标签: mysql indexing query-optimization


    【解决方案1】:

    由于您只是向c.custdate 添加了一个恒定时间间隔,因此应该从BETWEEN 值中减去该时间间隔,以获得逻辑上等效但允许 MySQL 使用索引的查询。一般来说,如果查询需要对索引值的函数求值,则不能使用范围扫描。

    即:而不是WHERE子句

    DATE_ADD(c.`custdate` ,INTERVAL -5 HOUR) BETWEEN '2011-09-14 00:00:00' AND '2011-09-14 23:59:59'
    

    做起来

    c.`custdate` BETWEEN '2011-09-14 05:00:00' AND '2011-09-15 04:59:59'
    

    【讨论】:

    • 完全同意 - 当您在相关字段上执行功能时,MySQL 不能使用索引,因此请始终尝试在过滤条件而不是字段上执行功能。 MySQL 然后可以使用可用的索引
    • ... 此外,完全可以对“BETWEEN”子句中的每个值执行“DATE_ADD”函数,因为 MySQL 会尽可能优化这些值。例如。 "c.custdate BETWEEN DATE_ADD('2011-09-14 00:00:00' 间隔 5 小时) 和 DATE_ADD('2011-09-14 23:59:59' 间隔 5 小时)"
    • 是的,它有效.. 正如您建议在两个子句之间的日期添加 5 小时以获得与 GMT-5 相似的结果,您知道一个方便的功能,可以将 5 小时添加到日期时间这样我就可以使用 date_add 重构所有查询。
    • 正如您所建议的,现在我在标准中使用 DATE_ADD 函数而不是在字段中,但是当我在字段中使用间隔 -5 小时时,现在我在标准中使用间隔 +5 小时。 .. SELECT * FROM customers c WHERE c.custdate BETWEEN DATE_ADD('2011-09-14 00:00:00' ,INTERVAL 5 HOUR) AND DATE_ADD('2011-09-14 23:59:59' ,INTERVAL 5 小时)非常感谢您的帮助...
    猜你喜欢
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多