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

SQL 索引設計全攻略:叢集與非叢集索引、建立原則與語法

     編輯:DB2 教學

SQL 索引設計全攻略:叢集與非叢集索引、建立原則與語法

索引是關聯式資料庫提升查詢效能的核心機制。本文系統整理叢集/非叢集索引特性、適用場景判斷表、十大建立原則、建立與刪除語法,並說明複合索引欄位順序的關鍵影響。

一、叢集 vs 非叢集索引核心差異

二、何時使用叢集/非叢集索引:場景判斷表

特性叢集索引非叢集索引
資料物理儲存順序與索引鍵值順序完全一致(連續)邏輯順序連續,物理順序不連續
每張表上限1 個(資料本身即索引)多個(SQL Server 最多 999)
葉層結構資料頁本身索引鍵值 + 書籤(RID 或叢集鍵)
查詢回表無需回表可能需回表(書籤查閱)
場景叢集索引非叢集索引
外鍵欄位✓✓
主鍵欄位✓✓
常用於 ORDER BY/GROUP BY 排序分組✓✓
範圍查詢(BETWEEN, >, < 等)✓✗
低基數(少數不同值,如性別、狀態)✓✗
高基數(大量不同值,如身分證、流水號)✗✓
頻繁 UPDATE 的欄位✗✓
頻繁修改索引鍵值✗✓
極低基數(1 或極少不同值)✗✗

註:主鍵預設建立叢集索引,但可依查詢模式調整(如主鍵為 UUID 時,改用代理鍵做叢集索引)。

三、索引建立十大原則

  1. 主鍵欄位必建索引(通常為叢集索引)。
  2. 外鍵欄位必建索引,加速連結與刪除檢查。
  3. 高頻查詢欄位(WHERE/JOIN 條件)優先建索引。
  4. 範圍查詢欄位宜建叢集或前導欄位為範圍欄位的複合索引。
  5. WHERE 子句高頻欄位建立單欄或複合索引。
  6. ORDER BY/GROUP BY/DISTINCT 後欄位建索引;複合索引欄位順序必須與查詢順序一致,否則索引失效。
  7. 低選擇性(重複值多)欄位、極少查詢欄位勿建索引。
  8. TEXT/IMAGE/BIT 型別欄位勿建索引(全文檢索另用全文索引)。
  9. 高頻異動欄位避免建索引(維護成本 > 查詢收益)。
  10. 控制索引數量:大量 UPDATE 表索引 ≤ 3,上限 ≤ 5;索引過多嚴重拖慢寫入。
  11. 複合索引欄位排序依查詢頻率:最高頻放最前,符合「最左前綴」原則,最大化索引命中率。

四、索引 DDL 語法

建立索引

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX index_name
ON {table_name | view_name} (column [ASC | DESC] [, ...n])
[WITH (index_property [, ...n])]
  • UNIQUE:唯一性約束。
  • CLUSTERED:叢集索引(每表僅一)。
  • NONCLUSTERED:非叢集索引(預設)。
  • index_property:FILLFACTOR、PAD_INDEX、IGNORE_DUP_KEY 等。

UNIQUE 索引可為叢集或非叢集,未指定時預設非叢集。

刪除索引

DROP INDEX table_name.index_name [, table_name.index_name ...]

查看索引資訊

EXEC sp_helpindex 'table_name';

五、複合索引欄位順序實戰範例

查詢模式:WHERE dept_id = ? AND hire_date BETWEEN ? AND ? ORDER BY salary DESC

CREATE NONCLUSTERED INDEX idx_emp_dept_hire_sal
ON employee (dept_id ASC, hire_date ASC, salary DESC);

順序原則:等值比較欄位 → 範圍欄位 → 排序欄位。若順序改為 (hire_date, dept_id, salary),等值條件 dept_id 不在最左,索引將無法有效求值。

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