Mysql 避免在WHERE中使用函数SQL的子查询

Mysql 避免在WHERE中使用函数SQL的子查询,mysql,Mysql,你能告诉我哪一个是最好的选择吗,我有一个过程,它在子句中使用函数,其中,我读到sql不使用索引,如果在子句中存在函数,那么我决定创建一个子查询,使sql根据索引获取筛选信息,然后它使用函数,但是有少量的记录 这是第一个选择 SELECT a, b, c FROM table WHERE f = 0 AND d <> 1 AND HOUR(TIMEDIFF(Now(), A.hora)) <= 4

你能告诉我哪一个是最好的选择吗,我有一个过程,它在子句中使用函数,其中,我读到sql不使用索引,如果在子句中存在函数,那么我决定创建一个子查询,使sql根据索引获取筛选信息,然后它使用函数,但是有少量的记录

这是第一个选择

        SELECT a, b, c
        FROM table  
        WHERE f = 0
        AND d <> 1
        AND HOUR(TIMEDIFF(Now(), A.hora)) <= 4 ;
    
选择a、b、c
从桌子上
其中f=0
和d 1

和小时(TIMEDIFF(Now(),A.hora))这根本没有帮助,甚至没有任何区别

如果在
f
和/或
d
上有索引,则可以将其用于这两个查询

但是对于这两个查询,不能使用
hora
(在第一个查询中被错误引用)上的索引或包含该索引的索引

事实上,我怀疑第二个查询的外部查询的
WHERE
子句被下推到子查询中,并且两个查询都产生相同的执行计划

您真正应该做的是从函数中获取
hora
。如果我解释正确,您希望获得过去
hora
不超过四个小时的所有记录。你可以用

hora >= addtime(now(), '-4:00:00.000')

因此。

如果您的表中有许多行,并且希望检查哪个查询正在快速工作,并且它是否使用了表中的索引,那么只需使用
EXPLAIN运行这两个查询即可。MySQL会告诉你它使用了哪些索引以及有多少行被删除,这样你就可以选择更好的一个。

请不要大喊大叫……你对数据运行了这些查询吗?结果如何?
hora >= addtime(now(), '-4:00:00.000')