索引是資料庫效能調校的關鍵,本文系統整理索引原理、分類、建立策略、資料結構與 MySQL 具體操作,幫助開發者建立正確的索引觀念。
索引好比書的目錄,讓資料庫快速定位資料,避免全表掃描。例如查詢 SELECT * FROM table1 WHERE id=44,有索引時直接在索引結構中找到 44 對應的行位置,無索引則需遍歷整張表。
| 類型 | 特性 | 適用場景 |
|---|---|---|
| 叢集索引 | 資料按物理順序儲存,表資料即索引葉節點 | 範圍查詢、排序、多行檢索 |
| 非叢集索引 | 索引與資料分離,葉節點存主鍵值回表查詢 | 單行精確查詢、覆蓋索引 |
MySQL InnoDB 採用 B+ Tree 實現索引:
CREATE INDEX idx_name ON mytable(username(10));
ALTER TABLE mytable ADD INDEX idx_name (username(10));
CREATE TABLE mytable (id INT, username VARCHAR(16), INDEX idx_name (username(10)));
CREATE UNIQUE INDEX uk_email ON mytable(email);
ALTER TABLE mytable ADD UNIQUE uk_email (email);
CREATE TABLE mytable (id INT PRIMARY KEY, username VARCHAR(16));
ALTER TABLE mytable ADD PRIMARY KEY (id);
ALTER TABLE mytable ADD INDEX idx_name_city_age (name(10), city, age);
最左前綴原則: 組合索引 (a,b,c) 實際等同於 (a), (a,b), (a,b,c) 三個索引。查詢必須從最左欄位開始匹配才能用到索引。
=, >, <, >=, <=, BETWEEN, INLIKE 'prefix%' 可用索引,LIKE '%suffix' 無法使用WHERE YEAR(date)<2007 導致全表掃描,改為 WHERE date < '2007-01-01'ANALYZE TABLE 更新統計資訊、減少碎片pt-duplicate-key-checker 檢測重複/冗餘索引