Mysql 避免在WHERE中使用函数SQL的子查询
你能告诉我哪一个是最好的选择吗,我有一个过程,它在子句中使用函数,其中,我读到sql不使用索引,如果在子句中存在函数,那么我决定创建一个子查询,使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
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')