handlersocket介紹及如何做性能測試

發表于:2012-02-23來源:csdn作者:lengzijian點擊數: 標簽:
handlersocket介紹及如何做性能測試HandlerSocket是日本人akira higuchi 寫的一個MySql的插件。通過這個插件,你可以直接跟MySQL后端的存儲引擎做key-value式的交互,省去了MySQL上層的SQL解釋、打開關閉表、創建查詢計劃等CPU開銷。按照作者給出的數據可以在

  HandlerSocket是日本人akira higuchi 寫的一個MySql的插件。通過這個插件,你可以直接跟MySQL后端的存儲引擎做key-value式的交互,省去了MySQL上層的SQL解釋、打開關閉表、創建查詢計劃等CPU開銷。按照作者給出的數據可以在數據全部在內存的情況下可以達到75W的QPS查詢。

  適用場景:

  Innodb引擎、按主鍵、unique key或索引搜索(也就是說它的SQL的where條件必須是這些);支持limit 語句、IN、INSERT/UPDATE/DELETE。

  沒有主鍵、unique key或索引搜索不行!

  表必須是Innodb引擎

  閑話少說,直接上安裝和測試結果。

  安裝:

  需要為MySQL安裝插件、PHP安裝擴展。這里就不再贅述,可以參考此篇文章http://blog.1984fox.com/read.php?30#entrymore,很詳細。

  API:

  谷歌code(http://code.google.com/p/php-handlersocket/)中提供了PHP擴展作者的API,這里我將每個方法的參數具體說明一下(也可以去https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/perl-client.en.txt參考一下perl擴展的API說明,其實實現都是一樣的,只不過是不同語言):

  實例化:

  /* * String $host:MySQL ip; * String $port:handlersocket插件的監聽端口,它有兩個端口可選:一個用于讀、一個用于寫 */ $hs = new HandlerSocket($host, $port);

  打開一個數據表:

  /* * Int $index:這個數字相當于文件操作里的句柄,HandlerSocket的所有其他方法都會依據這個數字來操作由這個 openIndex打開的表, * String $dbname:庫名 * String $table:表名 * String $key:表的“主鍵”(HandlerSocket::PRIMARY)或“索引名”作為搜索關鍵字段,這就是說表必須有主鍵或索引 * 個人理解:要被當做where條件的key字段,這樣可以認為handlersocket只有一個where條件 * String $column:'column1,column2' 所打開表的字段(以逗號隔開),就是說$table表的其他字段不會被操作 */ $hs->openIndex($index, $dbname, $table, $key, $column);

  查詢:

  /* * Int $index: openIndex()所用的$index * String $operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=', '>=', '<=', '>',and '<';可以理解為where條件 * Array $value * Int $number(默認是1):獲取結果的最大條數;相當于SQL中limit的第二個參數 * Int $skip(默認是0):跳過去幾條;相當于SQL中limit的第一個參數 */ $retval = $hs->executeSingle($index, $operation, $value, $number, $skip);

  插入(注意:此處的openIndex要用$port_wr,即讀寫端口):

  /* * Int $index: openIndex()所用的$index * Array $arr:數字元素數與openIndex的$column相同 */ $retval = $hs->executeInsert($index, $arr);

  刪除(注意:此處的openIndex要用$port_wr,即讀寫端口):

  /* * Int $index: openIndex()所用的$index * String $operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=', '>=', '<=', '>',and '<';可以理解為where條件 * Array $value * Int $number(默認是1):獲取結果的最大條數;相當于SQL中limit的第二個參數 * Int $skip(默認是0):跳過去幾條;相當于SQL中limit的第一個參數 */ $retval = $hs->executeDelete($index, $operation, $value, $number, $skip);

  更新(注意:此處的openIndex要用$port_wr,即讀寫端口):

  /* * Int $index: openIndex()所用的$index * String $operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=', '>=', '<=', '>',and '<';可以理解為where條件 * Array $value * Int $number(默認是1):獲取結果的最大條數;相當于SQL中limit的第二個參數 * Int $skip(默認是0):跳過去幾條;相當于SQL中limit的第一個參數 */ $retval = $hs->executeUpdate($index, $operation, $value, $number, $skip);

  測試:

  新建一個1000w條數據的用戶表,id為主鍵,包括uname、email、add_time字段,使用兩臺不同的機器做ab壓力測試

  1.handlersocket原理

  很久以前做的測試了,今天只是為了留個存底的地方,所以拿上來,有很多不嚴謹的地方望大家多多包涵,也可以留言更正我的錯誤,謝謝!

  都說handlersocket速度不是一般的快,公司也想在這方面研究一番,順便我也學習下mysql的原理,就做了這個測試:

  在介紹handlersocket之前首先來看一下mysql的原理:

  前端應用(php python...)通過用戶名和密碼連接到mysql服務器,在通過mysql的“中間層”進行語法分析和優化等,最后交給存儲引擎(myisma和innodb等)。

  那么我所理解的handlersocket是怎樣的?

  我是根據什么猜測(在沒有看源代碼之前,只能猜測),handlersocket在連接mysql時,不用輸入用戶名和密碼,一定是跳過了驗證階段;handlersocket在執行“sql”語句時,也別具一格,為什么這么說,因為在handlersocket嚴厲,根本沒有所謂的sql語句,他所執行的單純的是調用函數,例如:

  [python] view plaincopyprint?hs.get('huati', 't_topic', ["f_tid", "f_tname"],'13')

  在huati數據庫,t_topic表查找主鍵等于13的f_tid和f_tname字段,有這句話可以看出來,完全是函數式的調用,這也省去了mysql的語法解析,也許是他快的主要原因吧!

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97