最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql字段設(shè)置為null的問題解決

 更新時間:2026年07月21日 09:33:15   作者:Ethan0107  
MySQL允許NULL的字段也能正常使用索引,但統(tǒng)計(jì)查詢有大坑,本文用最直白的語言,帶你避開COUNT、NOTIN和分組統(tǒng)計(jì)中的致命陷阱,感興趣的可以了解一下

這個問題非常經(jīng)典,直接給你結(jié)論:

MySQL 中,字段允許為 NULL,索引依然可以正常使用,但在統(tǒng)計(jì)、查詢、存儲和性能上有幾個非常重要的“坑”需要注意。

我用最直白的方式給你講清楚。

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

只要查詢條件寫對了,索引就能用。

-- 表 t,字段 name 允許 NULL,name 上有索引

SELECT * FROM t WHERE name = '張三';  -- ? 可以用索引
SELECT * FROM t WHERE name IS NULL;   -- ? 也可以用索引(這個很多人誤以為不行)

關(guān)鍵點(diǎn):IS NULL 在索引中是有記錄的,MySQL 會把 NULL 值也存進(jìn)索引里(放在最前面或最后面,取決于引擎和排序方式)。

2. 最大的坑:COUNT、DISTINCT、分組統(tǒng)計(jì)會失真

這是最容易踩的坑,因?yàn)?NULL 在聚合函數(shù)里會被忽略。

操作結(jié)果原因
COUNT(name)只統(tǒng)計(jì) 非 NULL 的行數(shù)NULL 不算
COUNT(*)統(tǒng)計(jì)所有行不受 NULL 影響
SUM(age)忽略 NULL 值NULL 不參與計(jì)算
AVG(age)只算非 NULL 的平均值分母不包含 NULL 的行
DISTINCT name會把 NULL 當(dāng)作一個獨(dú)立值多個 NULL 只算一個

示例

-- 表里有 10 行,其中 3 行的 name 是 NULL
SELECT COUNT(name) FROM t;   -- 結(jié)果是 7,不是 10 ?
SELECT COUNT(*) FROM t;      -- 結(jié)果是 10 ?

教訓(xùn):如果你想要統(tǒng)計(jì)所有行,用 COUNT(*) 或 COUNT(主鍵),別用 COUNT(可為 NULL 的字段)。

3. 索引存儲和性能影響

① 索引大小會變大

  • 每個 NULL 值在索引中也需要占用存儲空間(通常 1 個字節(jié)標(biāo)記是否為 NULL)。
  • 如果字段允許 NULL,索引記錄會多一個 NULL 標(biāo)志位,導(dǎo)致索引稍微變大。

② 查詢效率略微下降

  • 因?yàn)樗饕卸嗔艘粋€“是否為 NULL”的判斷邏輯。
  • 實(shí)際影響微乎其微,除非表非常巨大(幾億行),否則感覺不到。

③ 排序時 NULL 的位置

  • InnoDB 中,NULL 在索引中默認(rèn)排在最前面(等價于最小值)。
  • MyISAM 中,NULL 默認(rèn)排在最后面
  • 這會影響 ORDER BY 的結(jié)果順序。

4. 組合索引中的 NULL 表現(xiàn)(很重要)

假設(shè)有組合索引 (a, b),兩個字段都允許 NULL:

-- 數(shù)據(jù):
(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? 不走索引因?yàn)?b 是組合索引的第二列,不能跳過 a 單獨(dú)查 b

核心:組合索引中,NULL 值也參與索引構(gòu)建,但最左前綴原則依然生效,不受 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. 總結(jié)一張表(記住要點(diǎn))

問題結(jié)論
允許 NULL 的字段能建索引嗎?? 可以
IS NULL 能走索引嗎?? 可以
索引中 NULL 占空間嗎?? 占,略大一點(diǎn)
COUNT(字段) 會統(tǒng)計(jì) NULL 嗎?? 不會,只統(tǒng)計(jì)非 NULL
NOT IN 會包含 NULL 嗎?? 不會,需要額外加 OR IS NULL
唯一索引允許多個 NULL 嗎?? 允許,多個 NULL 不沖突(因?yàn)?NULL != NULL)

7. 最佳實(shí)踐建議

能設(shè)置 NOT NULL + 默認(rèn)值,就盡量別允許 NULL。

原因:

  1. 避免統(tǒng)計(jì)失真(COUNT、AVG 等)。
  2. 避免查詢條件中漏掉數(shù)據(jù)(NOT IN 等)。
  3. 索引存儲更小,性能略好。
  4. 應(yīng)用層不用處理 null 判空邏輯,代碼更干凈。

如果業(yè)務(wù)上確實(shí)需要表示“未知/無值”,那允許 NULL 也可以,但寫 SQL 時一定要留意上述坑。

到此這篇關(guān)于mysql字段設(shè)置為null的問題解決的文章就介紹到這了,更多相關(guān)mysql字段為null內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL中root用戶密碼管理的三種場景完全指南

    MySQL中root用戶密碼管理的三種場景完全指南

    在MySQL數(shù)據(jù)庫的日常運(yùn)維中,root用戶密碼管理是最基礎(chǔ)也最重要的操作之一,本文將針對三種常見場景,分別給出詳細(xì)的操作步驟,涵蓋MySQL?5.6、5.7、8.0三個主流版本,感興趣的小伙伴可以了解下
    2026-02-02
  • mysql distinct去重,IFNULL空值處理方式

    mysql distinct去重,IFNULL空值處理方式

    文章介紹了如何在MySQL中使用`DISTINCT`命令去重和使用`IFNULL`函數(shù)處理空值,首先,通過Navicat新建數(shù)據(jù)庫并準(zhǔn)備數(shù)據(jù),然后展示了如何使用`DISTINCT`命令去除重復(fù)數(shù)據(jù)和使用`IFNULL`函數(shù)將空值替換為“暫無”
    2025-01-01
  • Centos7 安裝mysql 8.0.13(rpm)的教程詳解

    Centos7 安裝mysql 8.0.13(rpm)的教程詳解

    這篇文章主要介紹了Centos7 安裝mysql 8.0.13(rpm)的教程詳解,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-11-11
  • 詳談mysql order by in 的字符順序(推薦)

    詳談mysql order by in 的字符順序(推薦)

    下面小編就為大家?guī)硪黄斦刴ysql order by in 的字符順序(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 點(diǎn)贊功能使用MySQL還是Redis

    點(diǎn)贊功能使用MySQL還是Redis

    本文主要介紹了點(diǎn)贊功能使用MySQL還是Redis,這是最近面試時被問到的1道面試題,本篇博客對此問題進(jìn)行總結(jié)分享,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 防止web項(xiàng)目中的SQL注入

    防止web項(xiàng)目中的SQL注入

    這篇文章介紹了防止web項(xiàng)目中的SQL注入,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12
  • mysql-5.5.28源碼安裝過程中錯誤總結(jié)

    mysql-5.5.28源碼安裝過程中錯誤總結(jié)

    介紹一下關(guān)于mysql-5.5.28源碼安裝過程中幾大錯誤總結(jié),希望此文章對各位同學(xué)有所幫助。
    2013-10-10
  • mysql 8.0.12 快速安裝教程

    mysql 8.0.12 快速安裝教程

    這篇文章主要為大家詳細(xì)介紹了mysql 8.0.12的快速安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • MySQL的指定范圍隨機(jī)數(shù)函數(shù)rand()的使用技巧

    MySQL的指定范圍隨機(jī)數(shù)函數(shù)rand()的使用技巧

    這篇文章主要介紹了MySQL的指定范圍隨機(jī)數(shù)函數(shù)rand()的使用技巧,需要的朋友可以參考下
    2016-09-09
  • mysql存儲中使用while批量插入數(shù)據(jù)(批量提交和單個提交的區(qū)別)

    mysql存儲中使用while批量插入數(shù)據(jù)(批量提交和單個提交的區(qū)別)

    這篇文章主要介紹了mysql存儲中使用while批量插入數(shù)據(jù)(批量提交和單個提交的性能差異),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08

最新評論

蓝田县| 大悟县| 东城区| 北票市| 健康| 将乐县| 建湖县| 抚顺县| 高陵县| 安化县| 广丰县| 沧源| 阿鲁科尔沁旗| 伊吾县| 五华县| 凌云县| 岳阳县| 昭觉县| 扎囊县| 岐山县| 达日县| 墨江| 论坛| 农安县| 德州市| 白城市| 运城市| 临潭县| 长治市| 名山县| 大余县| 康保县| 合江县| 闽侯县| 阿拉善左旗| 阳谷县| 杭锦后旗| 乌鲁木齐县| 鞍山市| 错那县| 密云县|