首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL B-Tree 與 Hash 索引深度對比與選型指南

     編輯:MySQL 資料庫相關知識

引言

索引是數據庫效能的靈魂。MySQL 預設採用 B-Tree 索引(時間複雜度 O(log n)),但在特定場景下,Hash 索引(O(1))能帶來數量級的提升。本文基於 MySQL 官方文檔,深度解析兩者特性、適用場景與限制,助你做出正確選型。

一、 B-Tree 索引特性詳解

1. 支援的操作符

B-Tree 可用於 =、>、>=、<、<=、BETWEEN、LIKE(非通配符開頭)等比較操作。

2. LIKE 查詢的索引生效規則

SQL 範例是否走索引原因
WHERE key_col LIKE 'Patrick%'✅ 是常量前綴,可利用索引範圍掃描
WHERE key_col LIKE 'Pat%_ck%'✅ 是首字符為常量,同理可用
WHERE key_col LIKE '%Patrick%'❌ 否以通配符開頭,導致全表掃描
WHERE key_col LIKE other_col❌ 否非常量比較,無法預判範圍

3. 特殊優化機制

  • Turbo Boyer-Moore 算法:當 LIKE '%string%' 且 string > 3 字符時啟用,加速模糊匹配。
  • IS NULL 可使用索引。
  • 最左前綴原則:複合索引僅當 WHERE 條件覆蓋索引最左列時生效。

4. 優化器不走索引的情況

  • 預估索引掃描行數超過全表 30% 時,優化器傾向全表掃描。
  • 加上 LIMIT 限制返回行數時,會重新考慮使用索引。

二、 Hash 索引特性與限制

特性說明
適用操作符僅支援 = 和 <=>(等值比較)
不支援功能範圍查詢(<, >)、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 索引是「手術刀」,極致快但場景受限。理解兩者底層機制,結合業務查詢模式與存儲引擎,才能發揮最大效能。

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