我在tbl1.date和tbl2.datetime上有索引。当我执行以下操作时:
EXPLAIN SELECT * FROM tbl1 LEFT JOIN tbl2 ON tbl2.datetime = tbl1.date
tbl2.datetime
索引被使用(如预期的那样)
显然,我需要将tbl2.datetime
转换为日期,以便SELECT
语句在现实生活中发挥作用。但是,这样做会导致没有使用任何索引:
EXPLAIN SELECT * FROM tbl1 LEFT JOIN tbl2 ON DATE(tbl2.date) = tbl1.date
我错过了什么?
更新: 我尝试过类似的东西,但不断收到语法错误
“#1064 ....查看与您的MySQL服务器版本对应的手册,以便在'SELECT * FROM tbl1 LEFT JOIN tbl2 ON DATE(SELECT * FROM(SELECT DISTINCT datetime FROM tbl2.datetime)'附近使用正确的语法如第1行的“tem”
EXPLAIN SELECT * FROM tbl1 LEFT JOIN tbl2 ON DATE( SELECT * FROM (SELECT DISTINCT
datetime FROM tbl2.datetime) as tempTable ) = quotes.GOOG.date
答案 0 :(得分:3)
我错过了什么?
没什么 - 你不能改变数据或数据类型,并期望能够使用索引。
在进行比较时进行更改时,索引中的值与您想要/需要使用的值之间没有任何关联。唯一的选择是以不需要更改的方式存储值,如果您想要查看索引的使用。
答案 1 :(得分:0)
有趣的问题。作为一种解决方法,我试图在JOIN条件的一方面隔离DATETIME
...
EXPLAIN SELECT *
FROM tbl1
LEFT JOIN tbl2 ON tbl2.datetime
BETWEEN CONCAT( tbl1.date, ' 00:00:00' ) AND CONCAT( tbl1.date, ' 23:59:59' )
FWIW,这是一次失败。