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

MySQL 陷阱:InnoDB 與 MyISAM 不支援 Hash 索引,建立時卻不報錯

     編輯:DB2 教學

MySQL 陷阱:InnoDB 與 MyISAM 不支援 Hash 索引,建立時卻不報錯

MySQL 兩大主流引擎 InnoDB、MyISAM 僅支援 B-Tree 索引,**不支援 Hash 索引**。但執行 CREATE INDEX ... USING HASH 時**不會報錯**,SHOW CREATE TABLE 甚至顯示 USING HASH,實際仍建立為 B-Tree。本文實測揭露此陷阱,並介紹 InnoDB 自適應雜湊索引作為替代方案。

一、實測重現陷阱

建表

CREATE TABLE data_dict (
  data_type VARCHAR(32) NOT NULL COMMENT '資料字典類型',
  data_code TINYINT(4) NOT NULL COMMENT '資料字典代碼',
  data_name VARCHAR(64) NOT NULL COMMENT '資料字典值',
  PRIMARY KEY (data_type, data_code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='資料字典表';

嘗試建立 Hash 索引

ALTER TABLE data_dict ADD INDEX data_dict_dn USING HASH (data_name);

執行成功,SHOW CREATE TABLE 顯示:

KEY `data_dict_dn` (`data_name`) USING HASH

乍看似乎成功。

真相:SHOW INDEXES 揭露實際類型

SHOW INDEXES FROM data_dict;

結果 Index_type 欄位顯示 BTREE,而非 HASH。MySQL 默默轉換,未給任何警告。

二、各引擎索引支援對照

引擎交易鎖粒度B-TreeHashFull-text
InnoDB✓Row✓✗✓ (5.6+)
MyISAM✗Table✓✗✓
Memory✗Table✓✓✗
NDB Cluster✓Row✗✓✗
Archive✗Table✗✗✗

唯有 Memory 與 NDB 原生支援 Hash 索引。

三、InnoDB 替代方案:自適應雜湊索引

InnoDB 內建 Adaptive Hash Index (AHI):監控索引查找模式,若發現建立雜湊索引能提速,自動在緩衝池中建立記憶體雜湊索引(B-Tree 頁面 → 雜湊桶)。

查看 AHI 狀態

SHOW ENGINE INNODB STATUS;

輸出片段:

-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 2633, seg size 2635
Hash table size 348731, node heap has 2 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s

可觀察 Hash table size、hash searches/s 判斷 AHI 效益。

四、查看伺服器支援引擎

SHOW ENGINES;

確認 Support 欄位為 DEFAULT、YES、NO,InnoDB 通常為預設引擎。

五、避坑指南

  1. 永不信任 SHOW CREATE TABLE 的 USING HASH,必須用 SHOW INDEXES 驗證 Index_type。
  2. 需求點查極致效能(Key-Value 存取)時,考慮 Memory 引擎(資料可重建)或 Redis 等外部 KV 存儲。
  3. InnoDB 一般場景 B-Tree + AHI 已足夠;若確有熱點點查壓力,可嘗試 innodb_adaptive_hash_index=ON(預設開啟)並監控 AHI 命中率。
  4. NDB Cluster 確支援 Hash 索引且支援交易,但架構複雜,評估成本極高。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved