新聞中心
HandlerSocket是日本人akira higuchi 寫的一個(gè)MySql的插件。通過(guò)這個(gè)插件,你可以直接跟MySQL后端的存儲(chǔ)引擎做key-value式的交互,省去了MySQL上層的SQL解釋、打開(kāi)關(guān)閉表、創(chuàng)建查詢計(jì)劃等CPU開(kāi)銷。按照作者給出的數(shù)據(jù)可以在數(shù)據(jù)全部在內(nèi)存的情況下可以達(dá)到75W的QPS查詢。

創(chuàng)新互聯(lián)是專業(yè)的大邑縣網(wǎng)站建設(shè)公司,大邑縣接單;提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行大邑縣網(wǎng)站開(kāi)發(fā)網(wǎng)頁(yè)制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛(ài)的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來(lái)合作!
適用場(chǎng)景:
Innodb引擎、按主鍵、unique key或索引搜索(也就是說(shuō)它的SQL的where條件必須是這些);支持limit 語(yǔ)句、IN、INSERT/UPDATE/DELETE。
- 沒(méi)有主鍵、unique key或索引搜索不行!
- 表必須是Innodb引擎
閑話少說(shuō),直接上安裝和測(cè)試結(jié)果。
安裝:
需要為MySQL安裝插件、PHP安裝擴(kuò)展。這里就不再贅述,可以參考此篇文章http://blog.1984fox.com/read.php?30#entrymore,很詳細(xì)。
API:
谷歌code(http://code.google.com/p/php-handlersocket/)中提供了PHP擴(kuò)展作者的API,這里我將每個(gè)方法的參數(shù)具體說(shuō)明一下(也可以去https://github.com/ahiguti/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/perl-client.en.txt參考一下perl擴(kuò)展的API說(shuō)明,其實(shí)實(shí)現(xiàn)都是一樣的,只不過(guò)是不同語(yǔ)言):
實(shí)例化:
- /*
- * String $host:MySQL ip;
- * String $port:handlersocket插件的監(jiān)聽(tīng)端口,它有兩個(gè)端口可選:一個(gè)用于讀、一個(gè)用于寫
- */
- $hs = new HandlerSocket($host, $port);
打開(kāi)一個(gè)數(shù)據(jù)表:
- /*
- * Int $index:這個(gè)數(shù)字相當(dāng)于文件操作里的句柄,HandlerSocket的所有其他方法都會(huì)依據(jù)這個(gè)數(shù)字來(lái)操作由這個(gè) openIndex打開(kāi)的表,
- * String $dbname:庫(kù)名
- * String $table:表名
- * String $key:表的“主鍵”(HandlerSocket::PRIMARY)或“索引名”作為搜索關(guān)鍵字段,這就是說(shuō)表必須有主鍵或索引
- * 個(gè)人理解:要被當(dāng)做where條件的key字段,這樣可以認(rèn)為handlersocket只有一個(gè)where條件
- * String $column:'column1,column2' 所打開(kāi)表的字段(以逗號(hào)隔開(kāi)),就是說(shuō)$table表的其他字段不會(huì)被操作
- */
- $hs->openIndex($index, $dbname, $table, $key, $column);
查詢:
- /*
- * Int $index: openIndex()所用的$index
- * String $operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=', '>=', '<=', '>',and '<';可以理解為where條件
- * Array $value
- * Int $number(默認(rèn)是1):獲取結(jié)果的***條數(shù);相當(dāng)于SQL中l(wèi)imit的第二個(gè)參數(shù)
- * Int $skip(默認(rèn)是0):跳過(guò)去幾條;相當(dāng)于SQL中l(wèi)imit的***個(gè)參數(shù)
- */
- $retval = $hs->executeSingle($index, $operation, $value, $number, $skip);
插入(注意:此處的openIndex要用$port_wr,即讀寫端口):
- /*
- * Int $index: openIndex()所用的$index
- * Array $arr:數(shù)字元素?cái)?shù)與openIndex的$column相同
- */
- $retval = $hs->executeInsert($index, $arr);
刪除(注意:此處的openIndex要用$port_wr,即讀寫端口):
- /*
- * Int $index: openIndex()所用的$index
- * String $operation:openIndex方法中指定的$key字段所用的操作符,目前支持'=', '>=', '<=', '>',and '<';可以理解為where條件
- * Array $value
- * Int $number(默認(rèn)是1):獲取結(jié)果的***條數(shù);相當(dāng)于SQL中l(wèi)imit的第二個(gè)參數(shù)
- * Int $skip(默認(rèn)是0):跳過(guò)去幾條;相當(dāng)于SQL中l(wèi)imit的***個(gè)參數(shù)
- */
- $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(默認(rèn)是1):獲取結(jié)果的***條數(shù);相當(dāng)于SQL中l(wèi)imit的第二個(gè)參數(shù)
- * Int $skip(默認(rèn)是0):跳過(guò)去幾條;相當(dāng)于SQL中l(wèi)imit的***個(gè)參數(shù)
- */
- $retval = $hs->executeUpdate($index, $operation, $value, $number, $skip);
測(cè)試:
新建一個(gè)1000w條數(shù)據(jù)的用戶表,id為主鍵,包括uname、email、add_time字段,使用兩臺(tái)不同的機(jī)器做ab壓力測(cè)試:
讀測(cè)試:
并發(fā)50,5000次壓力測(cè)試:
MySQL: min: 0.504740953445 max:13.1727859974 average: 1.05 CPU:0.7%us, 0.3%sy use:111s
HandlerSocket:min: 0.302443981171 max:9.37712621689 average:0.736 CPU:0.4%us, 0.3%sy use:77s
并發(fā)70,5000次壓力測(cè)試:
MySQL: min: 0.504750013351 max:10.4482009411 average: 1.094 CPU:0.9%us, 0.4%sy use:85s
HandlerSocket:min: 0.302488803864 max:10.3345310688 average: 0.788 CPU:0.5%us, 0.4%sy use:62s
并發(fā)110,5000次壓力測(cè)試:
MySQL: min:0.505280017853 max:21.3242678642 average:1.095 CPU:1.5%us, 0.7%sy use:55s
HandlerSocket:min: 0.30281996727 max:10.6022770405 average:0.786 CPU:1.1%us, 0.7%sy use:39s
并發(fā)150,5000次壓力測(cè)試:
MySQL: min: 0.505041122437 max:28.8087069988 average:1.073 CPU:1.8%us, 0.9%sy use:61s
HandlerSocket:min: 0.302739143372 max:12.878344059 average:0.774 CPU:1.0%us, 0.9%sy use:30s
總結(jié):
共同點(diǎn):并發(fā)越高,性能越好
hs系統(tǒng)占用和執(zhí)行時(shí)間都少于MySQL 性能約好30%~40%
寫測(cè)試:
并發(fā)50,5000次壓力測(cè)試:
MySQL: min: 0.507106781006 max: 4.95259904861 average: 0.594 CPU:0.76%us, 0.49%sy use:62s
HandlerSocket:min: 0.303457021713 max: 7.0854101181 average: 0.383 CPU:0.4%us, 0.2%sy use:43s
并發(fā)70,5000次壓力測(cè)試:
MySQL: min: 0.508066892624 max: 12.8451189995 average: 0.659 CPU:1.0%us, 0.6%sy use:51s
HandlerSocket:min: 0.30427312851 max: 12.4244120121 average: 0.417 CPU:0.53%us, 0.29%sy use:32s
并發(fā)90,5000次壓力測(cè)試:
MySQL: min: 0.507676839828 max: 12.8466610909 average: 0.689 CPU:1.3%us, 0.72%sy use:45s
HandlerSocket:min: 0.304312229156 max: 12.4680581093 average: 0.465 CPU:0.66%us, 0.38%sy use:29s
并發(fā)110,5000次壓力測(cè)試:
MySQL: min: 0.507092952728 max: 11.7785778046 average: 0.775 CPU:1.34%us, 0.82%sy use:45s (13條未寫入)
HandlerSocket:min: 0.219769954681 max: 12.6269509792 average: 0.556 CPU:0.63%us, 0.37%sy use:32s (15條未寫入)
并發(fā)150,5000次壓力測(cè)試:
MySQL: min: 0.507570981979 max: 13.4538660049 average: 0.75 CPU:1.9%us, 1.1%sy use:29s (寫多1條)
HandlerSocket:min: 0.304651975632 max: 16.3402500153 average: 0.555 CPU:0.7%us, 0.43%sy use:26s (8條未寫入)
總結(jié):
共同點(diǎn):并發(fā)越高,性能越好
hs系統(tǒng)占用和執(zhí)行時(shí)間都少于MySQL 性能約好50%~60%
測(cè)試結(jié)果確實(shí)比較明顯,HandlerSocket可以在高并發(fā)、簡(jiǎn)單表操作的環(huán)境下替代MySQL。
原文鏈接:http://www.cnblogs.com/yangligogogo/articles/1969823.html
【編輯推薦】
- 數(shù)據(jù)庫(kù)日常維護(hù)常用的腳本部分收錄
- SQL與NoSQL——MySQL與NoSQL的融合
- MySQL中的NoSQL插件
- 甲骨文發(fā)布***BI軟件 添加對(duì)iPad支持
- 微軟WP7本地?cái)?shù)據(jù)庫(kù)之Sterling編程技巧
新聞標(biāo)題:HandlerSocket是神馬
瀏覽地址:http://www.dlmjj.cn/article/djgpjhs.html


咨詢
建站咨詢
