首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

編寫高效能 MySQL/Oracle SQL 語句核心原則(一):WHERE 子句避坑指南

     編輯:關於SqlServer

SQL 效能優劣在海量資料下可達百倍差距。優化器依賴索引,但不當寫法會導致隱性轉換、函數運算、邏輯否定使索引失效,退化為全表掃描。本文針對 WHERE 子句常見失效模式逐一破解。

1. IS NULL / IS NOT NULL 導致索引失效

  • B-tree 索引不儲存全 NULL 的鍵值(複合索引任一列為 NULL 整鍵不入索引)。
  • WHERE col IS NULL 無法使用該列索引,必須全表掃描。
  • 對策:欄位預設非 NULL(DEFAULT '' 或 0),查詢改用 WHERE col = '' 或 WHERE col = 0 走索引。

2. 列運算/函數/隱性轉換 破壞索引

原則:索引列不可參與任何運算,否則優化器無法利用索引順序特性。

失效寫法優化寫法說明
WHERE last_name || first_name = 'BillClinton'WHERE last_name = 'Clinton' AND first_name = 'Bill'拆分條件,各列獨立走索引
WHERE SUBSTR(col,1,3) = 'ABC'WHERE col LIKE 'ABC%'前綴 LIKE 可用索引
WHERE TO_CHAR(date_col,'YYYYMMDD') = '20240101'WHERE date_col >= DATE '2024-01-01' AND date_col < DATE '2024-01-02'範圍查詢保留索引
WHERE col + 0 = 100 (隱性轉換)WHERE col = 100避免型別轉換

3. LIKE '%keyword%' 導致全表掃描

  • 前導萬用字元 % 使索引無法定位起始位置。
  • 後置或中間萬用字元 keyword%、key%word 可使用索引(範圍掃描)。
  • 對策:全文檢索、反轉索引、或業務層面限制「必須輸入前綴」。

4. ORDER BY 非索引列/運算式 觸發排序

  • ORDER BY col 若 col 有索引 → 無排序成本。
  • ORDER BY col1 + col2、ORDER BY UPPER(col) → 需額外排序(Filesort)。
  • 對策:建立函數索引(Oracle CREATE INDEX idx ON t(UPPER(col))、MySQL 8.0+ 支援)或調整查詢邏輯。

下篇預告

NOT/!= 否定邏輯、IN vs EXISTS 子查詢優化、複合索引最左前綴原則、統計資訊收集與執行計畫分析。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved