MySQL数据库的表中 NULL 和 空值 到底有什么区别呢

Mysql 5.7.29

首先我们建立一个表

表的一个字段default空字符串,一个字段default null

接下来我们往数据库插入10条数据,下面的SQL执行10次,那么我们会得到下面的数据

那么,下面这两条语句会走索引吗

1
2
3
csharp复制代码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条数据

我们再来查一次

发现两列数据,都走索引了

我们再来试验一个东西,两列数据都增加一行数据

再测试一次,发现都不走索引了

小推测

所以我们简单的推测一下,

1
2
3
4
5
shell复制代码# 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

我们先把数据恢复

执行下面两条语句

1
2
3
csharp复制代码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,发现走索引了

总结

1
2
3
4
5
kotlin复制代码# configuration = '2' 当空串''的数量,小于等于40%的时候(10条有4条及以下),不会走索引
# configuration = '2' 当空串''的数量,大于40%的时候(10条有4条以上),会走索引

# is null 当null的数量,小于等于40%的时候(10条有4条及以下),不会走索引
# is null 当null的数量,大于40%的时候(10条有4条以上),会走索引
1
2
3
4
5
kotlin复制代码# 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都比不上,虽然一个网站内容是最重要的,但是写作环境这么差,谁写啊!!!!!!!!!!吐槽!!!!

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%