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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值