程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MYSQL奧秘的HANDLER敕令與完成辦法

MYSQL奧秘的HANDLER敕令與完成辦法

編輯:MySQL綜合教程

MYSQL奧秘的HANDLER敕令與完成辦法。本站提示廣大學習愛好者:(MYSQL奧秘的HANDLER敕令與完成辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是MYSQL奧秘的HANDLER敕令與完成辦法正文


MySQL“自古以來”都有一個奧秘的HANDLER敕令,而此敕令非SQL尺度語法,可以下降優化器關於SQL語句的解析與優化開支,從而晉升查詢機能。看到這裡,能夠有小同伴不淡定了,這麼好的器械為啥沒普遍應用呢?這不是與幾年前很夯的handlersocket插件相似嗎?

那末,我們先來看看Handler語法解釋:

HANDLER tbl_name OPEN [ [AS] alias]
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,…) [ WHERE where_condition ] [LIMIT … ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST } [ WHERE where_condition ] [LIMIT … ]
HANDLER tbl_name READ { FIRST | NEXT } [ WHERE where_condition ] [LIMIT … ]
HANDLER tbl_name CLOSE

起首從語法上看,HANDLER可以經由過程指定的索引去拜訪數據。但此語法其實不支撐DML操作。另外,因為削減了SQL解析,Handler敕令的機能真的異常不錯,依據Inside君的簡略主鍵測試,Handler敕令比SQL要快40%~45%。測試劇本以下:

SET @id=FLOOR(RAND()*1000000);
HANDLER sbtest.sbtest1 OPEN AS c;
HANDLER C READ `PRIMARY` = (@id);
HANDLER C CLOSE;

在Inside君的24C的測試辦事器上,64線程主鍵查詢跑到了近37W QPS,照樣異常使人印象深入的。比較SQL的SELECT查詢,全體測試成果以下圖所示:

敕令HANDLER的重要完成在源碼sql_handler.h、sql_handler.cc,設個斷點就可以不雅察到詳細的流程。MySQL下層及InnoDB存儲引擎層重要完成函數進口為:

Sql_cmd_handler_open::execute
Sql_cmd_handler_read::execute
Sql_cmd_handler_close::execute
ha_innobase::init_table_handle_for_HANDLER
ha_partition::init_table_handle_for_HANDLER()(7版本支撐HANDLER操作分區表)

既然機能不錯,為何在臨盆情況中其實不見到敕令HANDLER的應用呢?重要是由於HANDLER敕令存在以下幾個重要成績:

非分歧性讀取???
前往集合索引中的一切列(即便是二級索引拜訪),而不克不及前往某個詳細列
二級索引不應用LIMIT症結字,只能前往1行記載
曉得敕令HANDLER的同窗,能夠會以為HANDLER讀取存在髒讀成績。由於MySQL官方文檔關於HANDLER讀取的解釋就是這麼說的:

The handler interface does not have to provide a consistent look of the data (for example, dirty reads are permitted), so the storage engine can use optimizations that SELECT does not normally permit.
但是須要特殊留意的是,MySQL文檔中精確的說法是可以許可供給紛歧致的讀取。但InnoDB存儲引擎的HANDLER完成是支撐分歧性讀取的,Inside君親測切實其實不存在髒讀成績。固然,源碼解釋一切,可以發明在函數init_table_handle_for_HANDLER會對READVIEW停止分派,而正文也解釋了這點:

/* We let HANDLER always to do the reads as consistent reads, even
if the trx isolation level would have been specified as SERIALIZABLE */
m_prebuilt->select_lock_type = LOCK_NONE;
m_prebuilt->stored_select_lock_type = LOCK_NONE;

貌似用HANDLER敕令來做主鍵的查詢是不錯的,削減了SQL解析器的開支,機能晉升槓槓的。但為此,運用要支付偉大的修改,而SQL最年夜的優勢就在於尺度化。信任這也是今朝NoSQL數據庫碰到的最年夜的一個成績。好比MongoDB,Inside君每次寫查詢時都要翻開官方的敕令對比表……

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved