索引是數據庫效能的靈魂。MySQL 預設採用 B-Tree 索引(時間複雜度 O(log n)),但在特定場景下,Hash 索引(O(1))能帶來數量級的提升。本文基於 MySQL 官方文檔,深度解析兩者特性、適用場景與限制,助你做出正確選型。
B-Tree 可用於 =、>、>=、<、<=、BETWEEN、LIKE(非通配符開頭)等比較操作。
| SQL 範例 | 是否走索引 | 原因 |
|---|---|---|
WHERE key_col LIKE 'Patrick%' | ✅ 是 | 常量前綴,可利用索引範圍掃描 |
WHERE key_col LIKE 'Pat%_ck%' | ✅ 是 | 首字符為常量,同理可用 |
WHERE key_col LIKE '%Patrick%' | ❌ 否 | 以通配符開頭,導致全表掃描 |
WHERE key_col LIKE other_col | ❌ 否 | 非常量比較,無法預判範圍 |
LIKE '%string%' 且 string > 3 字符時啟用,加速模糊匹配。IS NULL 可使用索引。LIMIT 限制返回行數時,會重新考慮使用索引。| 特性 | 說明 |
|---|---|
| 適用操作符 | 僅支援 = 和 <=>(等值比較) |
| 不支援功能 | 範圍查詢(<, >)、ORDER BY 排序、LIKE 模糊查詢 |
| 統計資訊 | 無法估算兩值之間行數,影響聯表查詢優化 |
| 鍵值要求 | 必須使用完整鍵搜尋,不支援部分鍵前綴匹配 |
| 引擎支援 | 僅 MEMORY、NDB 引擎支援;InnoDB、MyISAM 不支援 |
IF 查詢模式 = 純等值點查(如用戶名查 ID)AND 引擎 = MEMORY/NDB
THEN 考慮 Hash 索引
ELSE
預設使用 B-Tree 索引(通用性最強)
END IF
腳本遷移數據時,即使表字符集設為 utf8 仍亂碼,執行 SQL 前加入:
SET NAMES utf8;
可強制客戶端、連接、結果集三端統一編碼,徹底解決亂碼。
B-Tree 是 MySQL 索引的「瑞士軍刀」,覆蓋 95% 以上場景;Hash 索引是「手術刀」,極致快但場景受限。理解兩者底層機制,結合業務查詢模式與存儲引擎,才能發揮最大效能。