当前位置: 代码网 > it编程>数据库>Mysql > mysql字段设置为null的问题解决

mysql字段设置为null的问题解决

2026年07月21日 Mysql 我要评论
这个问题非常经典,直接给你结论:mysql 中,字段允许为 null,索引依然可以正常使用,但在统计、查询、存储和性能上有几个非常重要的“坑”需要注意。我用最直白的方式给你讲清

这个问题非常经典,直接给你结论:

mysql 中,字段允许为 null,索引依然可以正常使用,但在统计、查询、存储和性能上有几个非常重要的“坑”需要注意。

我用最直白的方式给你讲清楚。

1. 索引是否会失效?—— 不会

只要查询条件写对了,索引就能用。

-- 表 t,字段 name 允许 null,name 上有索引

select * from t where name = '张三';  -- ✅ 可以用索引
select * from t where name is null;   -- ✅ 也可以用索引(这个很多人误以为不行)

关键点:is null 在索引中是有记录的,mysql 会把 null 值也存进索引里(放在最前面或最后面,取决于引擎和排序方式)。

2. 最大的坑:count、distinct、分组统计会失真

这是最容易踩的坑,因为 null 在聚合函数里会被忽略。

操作结果原因
count(name)只统计 非 null 的行数null 不算
count(*)统计所有行不受 null 影响
sum(age)忽略 null 值null 不参与计算
avg(age)只算非 null 的平均值分母不包含 null 的行
distinct name会把 null 当作一个独立值多个 null 只算一个

示例

-- 表里有 10 行,其中 3 行的 name 是 null
select count(name) from t;   -- 结果是 7,不是 10 ❗
select count(*) from t;      -- 结果是 10 ✅

教训:如果你想要统计所有行,用 count(*) 或 count(主键),别用 count(可为 null 的字段)。

3. 索引存储和性能影响

① 索引大小会变大

  • 每个 null 值在索引中也需要占用存储空间(通常 1 个字节标记是否为 null)。
  • 如果字段允许 null,索引记录会多一个 null 标志位,导致索引稍微变大。

② 查询效率略微下降

  • 因为索引中多了一个“是否为 null”的判断逻辑。
  • 实际影响微乎其微,除非表非常巨大(几亿行),否则感觉不到。

③ 排序时 null 的位置

  • innodb 中,null 在索引中默认排在最前面(等价于最小值)。
  • myisam 中,null 默认排在最后面
  • 这会影响 order by 的结果顺序。

4. 组合索引中的 null 表现(很重要)

假设有组合索引 (a, b),两个字段都允许 null:

-- 数据:
(1, 1)
(1, null)
(null, 2)
(null, null)

索引能查到什么?

查询是否走索引说明
where a = 1✅ 走索引正常
where a is null✅ 走索引null 在索引中有记录
where a = 1 and b is null✅ 走索引组合索引完全匹配
where b = 2❌ 不走索引因为 b 是组合索引的第二列,不能跳过 a 单独查 b

核心:组合索引中,null 值也参与索引构建,但最左前缀原则依然生效,不受 null 影响。

5. 一个容易被忽略的坑:not in 和 null

select * from t where name not in ('张三', '李四');

如果 name 允许 null,这个查询会漏掉 name = null 的行!

原因:null 和任何值比较都是 unknown(既不是 true 也不是 false),所以 not in 会排除掉所有含 null 的行。

正确做法:

select * from t where name not in ('张三', '李四') or name is null;

6. 总结一张表(记住要点)

问题结论
允许 null 的字段能建索引吗?✅ 可以
is null 能走索引吗?✅ 可以
索引中 null 占空间吗?✅ 占,略大一点
count(字段) 会统计 null 吗?❌ 不会,只统计非 null
not in 会包含 null 吗?❌ 不会,需要额外加 or is null
唯一索引允许多个 null 吗?✅ 允许,多个 null 不冲突(因为 null != null)

7. 最佳实践建议

能设置 not null + 默认值,就尽量别允许 null。

原因:

  1. 避免统计失真(count、avg 等)。
  2. 避免查询条件中漏掉数据(not in 等)。
  3. 索引存储更小,性能略好。
  4. 应用层不用处理 null 判空逻辑,代码更干净。

如果业务上确实需要表示“未知/无值”,那允许 null 也可以,但写 sql 时一定要留意上述坑。

到此这篇关于mysql字段设置为null的问题解决的文章就介绍到这了,更多相关mysql字段为null内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com