mysql索引

近期遇到一个索引的问题,先看现象:

EXPLAIN SELECT * FROM schedule_detail
WHERE schedule_date = CURDATE();

这里写图片描述
如上,这句sql没有用到索引

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的时候,也要注意索引字段的类型,确保索引是能够被用上的。

你可能感兴趣的:(mysql,mysql,索引)