使用的数据库是 MySQL ,今天遇到一个索引没有被正确使用的情况: 大概过程是这样的,遇到一个表大概长这样:
create table order_info(
`id` int(11) NOT NULL AUTO_INCREMENT,
……
`order_no` varchar(45) NOT NULL,
……
PRIMARY KEY (`id`),
KEY `order_no` (`order_no`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
然后慢查询里面出现这么一句:select * from order_info where order_no= 12786123123
乍一看没啥问题啊,这里order_no都建了索引了,结果看执行计划中 type
是 ALL
,key
是空的,百思不得其解。
后来大佬加了一个引号在查询条件上select * from order_info where order_no= "12786123123"
,时间立刻骤降,查看查询计划 type
是 ref
,key
是order_no
。
原来是因为数据类型不匹配造成的全表扫描,使用语言框架或者写原生SQL语句的时候一定要注意类型。