记录一次mysql有索引但是没有用到的经历

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/white_ice/article/details/83344035

前提:公司测试人员需要连接数据库取数据,但是并发量高的时候会报等待获取连接超时,所以经理让我帮忙处理下,首先想到增大超时等待时间,改为60秒,300百左右并发是没有问题的,但是提高到500以上时又报辣个错误,就在考虑应该优化下查询sql,增加索引使查询时间缩短来减少等待时间。

两个sql很简单,如下:

SELECT ID,ALARM_NUM,AlARM_text from iemp_alarm_inf where STATE = 0 AND ALARM_TYPE IN (1,2,4) AND DIVISION_CODE LIKE '6101%'


SELECT ID,ALARM_NUM,AlARM_text from iemp_alarm_inf where STATE = 2

所以在 state、division_code、alarm_type 三列上创建复合索引,另外根据索引左列限制,故将 state 放在最左列以保证两个sql都能用到索引:

然后使用 explain 查看,竟然都没有用到索引,纳尼???:

百思不得其解,最后怀疑是不是和列的类型有关,打开表发现 state 类型为 char(也不知道谁当时设计成这个,列名字也起错了,猜想应该是想起status),所以将 sql 中的 state = 2 改成 state = '2' 就解决了~

结论:1:索引列为字符型的时候需要加上引号,这样才能用到索引(测试类型为 int  或者 integer 的时候,条件加引号也是可以使用到索引的)!

2:在这个基础上我尝试打乱 where 后条件的顺序,结果都可以使用到index索引,证明where后的条件顺序和索引顺序无关,前提是在遵守索引左列限制的基础上。

3:优化器认为走索引的话比全表扫更耗性能的时候也不会走索引,此时可以使用 force index 索引名 来强制使用索引(但是这大多数是多余的)。

猜你喜欢

转载自blog.csdn.net/white_ice/article/details/83344035