Mysql 5.7.29
首先我们建立一个表
表的一个字段default空字符串,一个字段default null
接下来我们往数据库插入10条数据,下面的SQL执行10次,那么我们会得到下面的数据
那么,下面这两条语句会走索引吗
explain select id, configuration, description from t_my_jvm2 where configuration = '2' ;
explain select id, configuration, description from t_my_jvm2 where description = '描述' ;
复制代码
是否走索引
根据查看执行计划的key列,你会得到这样的答案,上面那条不走索引,下面那条走索引
这很令人吃惊,为什么第一条不走索引呢????
我们接下来修改一下数据。
删除configuration的5条数据,往description添加5条数据
我们再来查一次
发现两列数据,都走索引了
我们再来试验一个东西,两列数据都增加一行数据
再测试一次,发现都不走索引了
小推测
所以我们简单的推测一下,
# configuration = '2' 当空串''的数量,小于等于40%的时候(10条有4条及以下),不会走索引
# configuration = '2' 当空串''的数量,大于40%的时候(10条有4条以上),走索引
# description = '描述' 当null的数量,小于等于40%的时候(10条有4条及以下),不会走索引
# description = '描述' 当null的数量,大于40%的时候(10条有4条以上),会走索引
复制代码
测试 is null 和 is not null
我们接下来看一下 is null 和 is not null
我们先把数据恢复
执行下面两条语句
explain select id, configuration, description from t_my_jvm2 where description is null ;
explain select id, configuration, description from t_my_jvm2 where description is not null ;
复制代码
结果是,上面的 is null 语句,不走索引,下面的 is not null 语句走索引
我们先测试 is null,我们来修改一下数据
再执行一次,is null,仍然不会走索引
我们再次修改一下数据
再执行一次,is null,发现走索引了
与此同时,我们执行一下,is not null,发现不走索引
我们修改一下数据,
再执行一次,is not null,发现还是不走索引
再修改一下数据
再执行一次,is not null,发现走索引了
总结
# configuration = '2' 当空串''的数量,小于等于40%的时候(10条有4条及以下),不会走索引
# configuration = '2' 当空串''的数量,大于40%的时候(10条有4条以上),会走索引
# is null 当null的数量,小于等于40%的时候(10条有4条及以下),不会走索引
# is null 当null的数量,大于40%的时候(10条有4条以上),会走索引
复制代码
# is not null 当null的数量,小于等于30%的时候(10条有3条及以下),会走索引
# is not null 当null的数量,大于30%的时候(10条有3条以上),不会走索引
# description = '描述' 当null的数量,小于等于40%的时候(10条有4条及以下),不会走索引
# description = '描述' 当null的数量,大于40%的时候(10条有4条以上),会走索引
复制代码
最后
1,走过路过记得点赞啊,盆友们
2,掘金的markdown编辑器真难用,比不上typora,连CSDN都比不上,虽然一个网站内容是最重要的,但是写作环境这么差,谁写啊!!!!!!!!!!吐槽!!!!