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

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

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

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

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

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

1. 索引是否會(huì)失效?—— 不會(huì)

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

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

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

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

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

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

操作結(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會(huì)把 NULL 當(dāng)作一個(gè)獨(dú)立值多個(gè) NULL 只算一個(gè)

示例

-- 表里有 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. 索引存儲(chǔ)和性能影響

① 索引大小會(huì)變大

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

② 查詢效率略微下降

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

③ 排序時(shí) NULL 的位置

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

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

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

-- 數(shù)據(jù):
(1, 1)
(1, NULL)
(NULL, 2)
(NULL, NULL)

索引能查到什么?

查詢是否走索引說(shuō)明
WHERE a = 1? 走索引正常
WHERE a IS NULL? 走索引NULL 在索引中有記錄
WHERE a = 1 AND b IS NULL? 走索引組合索引完全匹配
WHERE b = 2? 不走索引因?yàn)?b 是組合索引的第二列,不能跳過(guò) a 單獨(dú)查 b

核心:組合索引中,NULL 值也參與索引構(gòu)建,但最左前綴原則依然生效,不受 NULL 影響。

5. 一個(gè)容易被忽略的坑:NOT IN 和 NULL

SELECT * FROM t WHERE name NOT IN ('張三', '李四');

如果 name 允許 NULL,這個(gè)查詢會(huì)漏掉 name = NULL 的行!

原因:NULL 和任何值比較都是 UNKNOWN(既不是 TRUE 也不是 FALSE),所以 NOT IN 會(huì)排除掉所有含 NULL 的行。

正確做法:

SELECT * FROM t WHERE name NOT IN ('張三', '李四') OR name IS NULL;

6. 總結(jié)一張表(記住要點(diǎn))

問(wèn)題結(jié)論
允許 NULL 的字段能建索引嗎?? 可以
IS NULL 能走索引嗎?? 可以
索引中 NULL 占空間嗎?? 占,略大一點(diǎn)
COUNT(字段) 會(huì)統(tǒng)計(jì) NULL 嗎?? 不會(huì),只統(tǒng)計(jì)非 NULL
NOT IN 會(huì)包含 NULL 嗎?? 不會(huì),需要額外加 OR IS NULL
唯一索引允許多個(gè) NULL 嗎?? 允許,多個(gè) 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. 索引存儲(chǔ)更小,性能略好。
  4. 應(yīng)用層不用處理 null 判空邏輯,代碼更干凈。

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

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

相關(guān)文章

  • MySQL中root用戶密碼管理的三種場(chǎng)景完全指南

    MySQL中root用戶密碼管理的三種場(chǎng)景完全指南

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

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

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

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

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

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

    下面小編就為大家?guī)?lái)一篇詳談mysql order by in 的字符順序(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • 點(diǎn)贊功能使用MySQL還是Redis

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

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

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

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

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

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

    mysql 8.0.12 快速安裝教程

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

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

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

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

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

最新評(píng)論

公安县| 海口市| 锦屏县| 许昌市| 曲松县| 措勤县| 牡丹江市| 大关县| 衡山县| 绥滨县| 健康| 攀枝花市| 灵石县| 昌乐县| 蛟河市| 郎溪县| 盱眙县| 铁岭县| 霍城县| 岳普湖县| 长武县| 阜阳市| 万全县| 稷山县| 上林县| 天镇县| 武山县| 利川市| 河北区| 营口市| 武穴市| 佛坪县| 昌吉市| 阜阳市| 梨树县| 三河市| 阿荣旗| 五莲县| 蒙阴县| 五常市| 九龙城区|