繁体   English   中英

子查询以避免 function SQL 在 WHERE

[英]Subquery to avoid function SQL in WHERE

你能告诉我哪个是最好的选择吗,我有一个程序,它在 where 子句中使用 function,我读到 sql 不要使用索引,如果在子句中存在 ZC1C425268E68385D1AB5074C17,那么我决定为 D1AB5074C17 创建一个子查询使 sql 根据索引获取过滤器信息,然后使用 function,但记录很少。

这是第一个选项。

        SELECT a, b, c
        FROM table  
        WHERE f = 0
        AND d <> 1
        AND HOUR(TIMEDIFF(Now(), A.hora)) <= 4 ;
    

这是另一个。

SELECT a,b,c
    FROM 
    (
        SELECT a, b, c,hora
        FROM table  
        WHERE f = 0
        AND d <> 1
    ) AS A
    WHERE  HOUR(TIMEDIFF(Now(), A.hora)) <= 4 ;

谢谢你的帮助。

这根本没有帮助,甚至没有任何区别。

如果f和/或d上有索引,则它可以用于两个查询。

但是,对于这两个查询,都不能使用包含hora的索引(顺便说一句,在第一个查询中错误地引用了该索引)。

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

你真正应该做的是让hora脱离这些功能。 如果我的解释是正确的,你想获得过去不超过四个小时hora的所有记录。 你可以使用

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

为了那个原因。

如果您的表中有很多行并且想要检查哪个查询正在快速运行并且它是否使用了您的表中的索引,只需使用EXPLAIN https://dev.mysql.com/doc/refman/8.0运行这两个查询/en/explain.html MySQL 会告诉你它使用了哪些索引以及有多少行出去,所以你可以选择更好的一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM