萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL ISNULL() 與 IS NULL 使用詳解:索引效能與常見誤區

MySQL 中判斷 NULL 值的兩種方式

在 MySQL 中處理 NULL 值時,常見兩種寫法:ISNULL() 函數與 IS NULL / IS NOT NULL 運算子。它們行為不同,效能表現也各有特點,本文深入解析並釐清常見迷思。

ISNULL() 函數 vs IS NULL 運算子

  • ISNULL(expr):回傳 1(expr 為 NULL)或 0(非 NULL)。注意:MySQL 的 ISNULL() 僅接受單一參數,與 SQL Server 的 ISNULL(expr, replacement)(兩參數、可替換值)完全不同。
  • expr IS NULL / IS NOT NULL:標準 SQL 寫法,可直接用於 WHERE 條件,可讀性更佳。

基本查詢範例

-- 找出 name 為 NULL 的列
SELECT * FROM newtable WHERE name IS NULL;

-- 找出 title 不為 NULL 的列
SELECT * FROM tbas_table WHERE title IS NOT NULL;

-- 實務範例:查詢 click、describle 非空資料
SELECT `click`, `title`, `created` FROM dcfsda_table WHERE click IS NOT NULL;
SELECT `id`, `title`, `describle` FROM bnsdh_table WHERE describle IS NOT NULL;

索引效能深度解析:IS NOT NULL 能用上索引嗎?

網路上常流傳「IS NULL / IS NOT NULL 無法使用索引」的說法,這是片面的。實際上:

  • MySQL 可以 為 IS NULL 使用索引(特別是唯一索引或主鍵)。
  • IS NOT NULL 是否使用索引,取決於資料分布與優化器成本評估:若非 NULL 值佔大多數(如 100 萬筆中僅 1 筆 NULL),全表掃描可能比索引掃描+回表更快;反之,若 NULL 值佔多數,優化器傾向走索引。

實測對比:改寫前後的執行計畫

-- 原寫法
SELECT click FROM bsga_table WHERE click IS NOT NULL;

-- 嘗試改寫(若 click 為正整數)
SELECT click FROM bsga_table WHERE click > 0 AND click < 100001;

結論:不要盲目改寫。請用 EXPLAIN 觀察實際執行計畫,依據資料特性決定。優化器的目標是「最低成本」,而非死板規則。

關鍵觀念補充:NULL 比較陷阱

-- 錯誤:NULL = NULL 結果為 UNKNOWN(非 TRUE),查不到任何資料
SELECT * FROM tbl WHERE col = NULL;

-- 正確:必須用 IS NULL
SELECT * FROM tbl WHERE col IS NULL;

記住:NULL 代表「未知」,任何與 NULL 的比較運算(=、!=、>、< 等)結果皆為 UNKNOWN,唯有 IS NULL / IS NOT NULL 或 ISNULL()、COALESCE()、IFNULL() 等函數能正確判斷。

最佳實務建議

  1. 優先使用標準 SQL 的 IS NULL / IS NOT NULL,跨資料庫可攜性最好。
  2. 需將 NULL 替換為預設值時,用 COALESCE(col, 'default') 或 IFNULL(col, 'default')(MySQL 專用)。
  3. 針對大表的 NULL 判斷查詢,務必 EXPLAIN 驗證索引使用情況,必要時建立部分索引(MySQL 8.0+ 支援)或調整查詢條件。
copyright © 萬盛學電腦網 all rights reserved