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

MySQL 神秘 HANDLER 命令深度解析:繞過優化器的高性能讀取路徑

     編輯:MySQL 資料庫相關知識

HANDLER 語法

HANDLER tbl_name OPEN [AS alias];
HANDLER tbl_name READ index_name {=|<=|>=|<|>} (val1,val2...) [WHERE cond] [LIMIT ...];
HANDLER tbl_name READ index_name {FIRST|NEXT|PREV|LAST} [WHERE cond] [LIMIT ...];
HANDLER tbl_name READ {FIRST|NEXT} [WHERE cond] [LIMIT ...];
HANDLER tbl_name CLOSE;

性能優勢

  • 繞過 SQL 解析器、優化器、執行計劃生成,直達存儲引擎層。
  • 主鍵點查測試:64 線程下 QPS 近 37 萬,比 SELECT 高 40-45%。

核心實現入口

  • SQL 層:Sql_cmd_handler_open/read/close::execute
  • InnoDB 層:ha_innobase::init_table_handle_for_HANDLER、ha_partition::init_table_handle_for_HANDLER(5.7+ 支持分區表)

為什麼生產少用?四大硬傷

  1. 非標準 SQL:應用遷移成本極高,鎖定 MySQL。
  2. 只讀不寫:不支持 DML(INSERT/UPDATE/DELETE)。
  3. 列投影缺失:即使走二級索引,也返回聚簇索引所有列,無法 SELECT col1,col2。
  4. 二級索引 LIMIT 失效:二級索引讀取強制 LIMIT 1,無法批量游標讀取。

一致性讀取真相

文檔稱「允許髒讀」,但 InnoDB 實現中 init_table_handle_for_HANDLER 顯式構建 ReadView,執行一致性讀(LOCK_NONE),實測無髒讀。

總結

HANDLER 是「繞過優化器的極速讀取通道」,適合極端高併發主鍵點查場景,但缺乏標準化、寫入支持、列投影、批量游標,導致生產環境鮮見。理解其原理有助於認識 MySQL 執行路徑,技術選型時權衡利弊。

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