玖叶教程网

前端编程开发入门

Python 之 MySql“未解之谜”13--都是 NULL 惹的祸(上)


NULL 和 空值的区别

● 本质区别

空值不占空间,用''表示

NULL 值占空间,用NULL表示

空值代表杯子是真空的,NULL 代表杯子中装满了空气,2 个杯子看起来一样,但是有本质的区别

MySql 官方:

“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”

NULL 占空间


NULL 和 空值的保存问题

以 varchar 类型

● 如果字段是 NOT NULL

可以保存空值,不能保存 NULL值

● 如果字段是 NULL

可以保存空值和 NULL 值

字段类型是 NOT NULL,为什么可以插入空值?

NULL 表示未知,没有类型可言,而 '' 是有类型的,表示一个空的字符串。所以有NOT NULL 约束的列是可以插入 '' 的。


NULL 和空值对聚合函数的影响

● COUNT(expr)

在进行 COUNT(expr) 统计某列的记录数的时候,如果采用的是 NULL 值,系统会自动忽略,但是空值是会进行统计到其中的

>>> SELECT COUNT(NAME) FROM USER ;

>>> 3

● AVG(expr)

name 是 varchar 类型

>>>SELECT AVG(NAME) FROM USER ;

>>>2.25

我们可以看出:MySql 在计算 AVG(expr) 时 会自动将 NULL 值过滤掉不参与计算,但是不排除空值

● MIN(expr)

>>>SELECT MIN(NAME) FROM USER ;

>>>''

我们可以看出:MySql 在计算 MIN(expr) 时 会自动将 NULL 值过滤掉不参与计算,但是不排除空值



NULL 和空值对 order by 和 group by 的影响


>>> SELECT * FROM USER ORDER BY NAME;

>>> SELECT * FROM USER GROUP BY NAME;


MySql 对空值或者 NULL 的判断

围观下《阿里巴巴开发手册》中 MySql 部分描述

●【强制】使用 ISNULL()来判断是否为 NULL 值

说明:NULL 与任何值的直接比较都为 NULL

1) NULL<>NULL 的返回结果是 NULL,而不是 false

2) NULL=NULL 的返回结果是 NULL,而不是 true

3) NULL<>1 的返回结果是 NULL,而不是 true

注意:

ISNULL (expr) 函数:如果 expr 为 null 返回 1,否则返回 0;ISNULL (expr) = 0 不会排除空值;使用 <> 查询时,会筛选掉空值和 NULL 值。


NULL 对索引的影响

结论看第 3 点

1、给 a 列增加索引 idx_a,a 列可以为 NULL

测试数据总量为 10w 条数据,其中有一条记录 a 列为 NULL的测试数据

● 查询所有列

① WHERE 条件中 IS NULL

type : ref (非唯一性索引)

key : idx_a

可以看出 WHERE 条件使用 IS NULL ,查询所有列使用 idx_a ,type 为 ref。

② WHERE 条件中 IS NOT NULL

type : ALL

key : (NULL)

可以看出 WHERE 条件使用 IS NOT NULL ,全表扫描,未走索引。


查询索引列

① WHERE 条件中 IS NULL

type : ref (非唯一性索引)

key : idx_a

可以看出 where 条件使用 is null ,查询所有列使用 idx_a ,type 为 ref

② WHERE 条件中 IS NOT NULL

可以看出 where 条件使用 is not null ,查询所有列使用 idx_a ,type 为 range。


2、给 a 列增加索引 idx_a,a 列可以为 NOT NULL

● 查询所有列

① WHERE 条件中 IS NULL

无意义,不会使用索引。

Extra 显示:Impossible WHERE

② WHERE 条件中 IS NOT NULL

全表扫描


● 查询索引列

① WHERE 条件中 IS NULL

无意义,不会使用索引。

Extra 显示:Impossible WHERE

② WHERE 条件中 IS NOT NULL

可以看出 where 条件使用 is not null ,查询所有列使用 idx_a ,type 为 index。


3、汇总

注:当 a 列为 NOT NULL 且建立 idx_a 索引,无论 WHERE 后时 IS NULL 还是 IS NOT NULL,相当于“脱裤子放屁”,参考价值不大。主要研究当 a 列为 NULL 且建立 idx_a 索引,在MySql 5.7 版本使用 InnoDB 存储引擎

结论如下:


>>>Python 之 MySql“未解之谜”12--一个*号引发的思考

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言