近期遇到一个索引的问题,先看现象:
EXPLAIN SELECT * FROM schedule_detail
WHERE schedule_date = CURDATE();
EXPLAIN SELECT * FROM schedule_detail
WHERE schedule_date = DATE_FORMAT(NOW(), '%Y-%m-%d');
而第二句用了DATE_FORMAT( )来格式化了之后用到了索引。
当时觉得很奇怪,为什么直接用CURDATE()用不上索引,反而用DATE_FORMAT( )格式化后却用到了,格式化这个过程不就降低了sql的效率了吗?
于是去请教了DBA,他让我先看看schedule_date的字段类型是什么。我一看,恍然大悟
原来schedule_date的字段类型是varchar,那么直接schedule_date = CURDATE()这个等式其实存在隐式转换,导致索引用不上了。反而是用DATE_FORMAT( )格式化后得到的就是varchar类型,可以直接判断是否相等,继而索引就能用上了。
总结:这个问题很简单,但是如果不注意,没有写完sql用EXPLAIN分析一下的习惯的话,很可能有些索引你根本没用上。同时写sql的时候,也要注意索引字段的类型,确保索引是能够被用上的。