影響性能的五大核心策略:鎖策略、緩存策略、索引策略、存儲策略、執行計劃優化策略。索引策略決定數據定位效率,存儲策略決定持久化效率。
NULLWHERE col IS NULL 無法利用索引,觸發全表掃描原理:B+Tree 建樹過程需比較鍵值,NULL 參與運算結果多為 NULL,無法建立有序關係,故不入葉子節點。
對策:業務上能用 NOT NULL DEFAULT '' 或 0 替代 NULL;必須查 NULL 時考慮位圖索引或分區裁剪。
案例:type 列只有 5 個值,1 萬行數據,WHERE type=1 需訪問 2000 行 + 索引塊 > 200 塊;全表掃描 10 行/塊僅 1000 塊,優化器會選擇全表掃描。
經驗值:選擇性 Count(DISTINCT col)/Count(*) < 0.2 時通常不走索引。
例外:覆蓋索引、排序需求、外鍵關聯仍可能用到。
LIKE '%abc'、LIKE '%abc%':全索引/全表掃描LIKE 'abc%':可用索引範圍掃描,遇到非 'a' 開頭即停止原理:B+Tree 按字典序存儲,前導通配符破壞前綴有序性。
替代方案:全文索引、反轉列存儲、搜索引擎。
| 特性 | B-Tree 索引 | Hash 索引 |
|---|---|---|
| 查找複雜度 | O(log N) | O(1) |
| 範圍查詢 | 支援 | 不支援 |
| 前綴查詢 | 支援 | 不支援 |
| 排序 | 天然有序 | 無序 |
| 適用場景 | 範圍、排序、前綴、低選擇性 | 高選擇性純等值查詢(=、IN) |
| 特性 | MyISAM | InnoDB |
|---|---|---|
| 索引類型 | 非聚簇 | 聚簇 |
| 數據文件 | .MYD 獨立 | 葉子節點即數據頁 |
| 主鍵查找 | 索引 → 行指針 → 數據 | 直接定位葉子頁 |
| 二級索引 | 存儲行指針 | 存儲主鍵值(回表查主鍵) |
| 空間佔用 | 較小 | 較大(主鍵重複存儲) |
SELECT a,b FROM t WHERE c=1 建立 idx(c,a,b) 避免回表(a,b,c) 支援 a/a,b/a,b,c,不支援 b/c/b,cWHERE a=1 AND b LIKE 'xy%' 在存儲引擎層過濾 b,減少回表ANALYZE TABLE 更新統計信息,防止優化器誤判