亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 1047 | 回復(fù): 0
打印 上一主題 下一主題

MySQL HandlerSocket in Action [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-12-19 13:55 |只看該作者 |倒序?yàn)g覽

1 Overview

    最近一篇關(guān)于MySQL HandlerSocket的blog吸引了不少人的注意,甚至MySQL Performance Blog上也有關(guān)于HandlerSocket的性能評(píng)測(cè)。該blog中聲稱對(duì)于一個(gè)CPU bound而非IO bound的MySQL Server(即絕大部分的數(shù)據(jù)可以從緩存中取得,例如InnoDB Buffer Pool有接近100%的命中率),使用HandlerSocket可以將查詢性能提升7.5倍。目前HandlerSocket已經(jīng)被其作者應(yīng)用到生產(chǎn)環(huán)境,效果良好。筆者在昨天抽空安裝并試用了一下HandlerSocket Plugin。

 

2 Installation

    安裝的過(guò)程基本順利,不過(guò)可能是由于筆者是在MySQL 5.1.42+InnoDB Plugin 1.0.6上編譯安裝HandlerSocket的原因,編譯HandlerSocket的過(guò)程中報(bào)如下錯(cuò)誤:

    configure: error: MySQL source version does not match MySQL binary version

    調(diào)查一下后發(fā)現(xiàn)是configure腳本沒有能夠找到MySQL source的版本。筆者調(diào)整了configure腳本,跳過(guò)了該檢查。編譯安裝后會(huì)在MySQL的plugin目錄中生成一個(gè)so文件。然后在MySQL中安裝該plugin即可。

Sql代碼 
  1. mysql> INSTALL PLUGIN handlersocket soname 'handlersocket.so';  
  2. mysql> show plugins;  
  3. +---------------------+----------+--------------------+---------------------+---------+  
  4. Name                | Status   | Type               | Library             | License |  
  5. +---------------------+----------+--------------------+---------------------+---------+  
  6. | handlersocket       | ACTIVE   | DAEMON             | handlersocket.so    | BSD     |  
  7. 18 rows in set (0.00 sec)  

 

3 Getting Started

    首先創(chuàng)建一個(gè)測(cè)試用的表。

Sql代碼 
  1. mysql> CREATE TABLE `user` (  
  2.   `user_id` int(10) unsigned NOT NULL,  
  3.   `user_name` varchar(50) DEFAULT NULL,  
  4.   `user_email` varchar(255) DEFAULT NULL,  
  5.   `created` datetime DEFAULT NULL,  
  6.   PRIMARY KEY (`user_id`),  
  7.   KEY `INDEX_01` (`user_name`)  
  8. ) ENGINE=InnoDB  
  9.   
  10. mysql> insert into user values(1, "John""john@test.com"CURRENT_TIMESTAMP);  
  11. mysql> insert into user values(2, "Kevin""Kevin@test.com"CURRENT_TIMESTAMP);  
  12. mysql> insert into user values(3, "Dino""Dino@test.com"CURRENT_TIMESTAMP);  
   

    接下來(lái)按照blog中的例子,編寫如下perl腳本handlersocket.pl。

Perl代碼 
  1. #!/usr/bin/perl  
  2.   
  3. use strict;  
  4. use warnings;  
  5. use Net::HandlerSocket;  
  6.   
  7. #1. establishing a connection  
  8. my $args = { host => 'localhost', port => 9998 };  
  9. my $hs = new Net::HandlerSocket($args);  
  10.   
  11. #2. initializing an index so that we can use in main logics.  
  12. # MySQL tables will be opened here (if not opened)  
  13. my $res = $hs->open_index(0'test''user''INDEX_01''user_name,user_email,created');  
  14. die $hs->get_error() if $res != 0;  
  15.   
  16. #3. main logic  
  17. #fetching rows by id  
  18. #execute_single (index id, cond, cond value, max rows, offset)  
  19. $res = $hs->execute_single(0'=', [ 'kevin' ], 10);  
  20. die $hs->get_error() if $res->[0] != 0;  
  21. shift(@$res);  
  22. for (my $row = 0; $row < 1; ++$row) {  
  23.   my $user_name= $res->[$row + 0];  
  24.   my $user_email= $res->[$row + 1];  
  25.   my $created= $res->[$row + 2];  
  26.   print "$user_name\t$user_email\t$created\n";  
  27. }  
  28.   
  29. #4. closing the connection  
  30. $hs->close();  

 

    最后執(zhí)行handlersocket.pl,結(jié)果如下:

Shell代碼 
  1. perl handlersocket.pl  
  2. Kevin   Kevin@test.com  2010-11-14 22:35:22  
 

4 Philosophy of the HandlerSocket

    通常,MySQL Server可以被看成兩層架構(gòu):即SQL Layer和Storage Engine Layer,它們之間通過(guò)Handler API進(jìn)行交互。MySQL Server在接收到客戶端的Query請(qǐng)求后,通常需要在SQL layer中進(jìn)行詞法分析,語(yǔ)法分析,優(yōu)化等過(guò)程,最終生成一個(gè)樹型的查詢計(jì)劃,交由執(zhí)行引擎執(zhí)行。執(zhí)行引擎根據(jù)查詢計(jì)劃,跟相應(yīng)的存儲(chǔ)引擎通信,得到查詢結(jié)果。

 

    HandlerSocket的作者認(rèn)為,對(duì)于CPU bound的MySQL server來(lái)說(shuō),SQL layer消耗了過(guò)多的資源,以致總體性能不佳。HandlerSocket則繞過(guò)了MySQL Server的SQL layer,直接跟存儲(chǔ)引擎交互,從而帶來(lái)了大幅的性能提升。默認(rèn)情況下HandlerSocket Plugin監(jiān)聽9998和9999兩個(gè)端口,其中9998只支持讀操作,9999支持讀寫操作,但是性能跟9998端口相比稍慢。

 

    HandlerSocket的作者在其blog中列出了一系列HandlerSocket的優(yōu)點(diǎn),以下是筆者認(rèn)為其中比較重要的:

  • Can handle lots of concurrent connections
  • Extremely high performance
  • No duplicate cache
  • No data inconsistency
  • Independent from storage engines
  • Supporting lots of query patterns
  • No need to modify/rebuild MySQL
  • All operational benefits from MySQL

      其中No duplicate cache和No data inconsistency這兩條,筆者感觸頗深。關(guān)于MySQL的NoSQL擴(kuò)展,可能很多項(xiàng)目都在使用memcached,或者自己實(shí)現(xiàn)的cache等。這種獨(dú)立緩存的實(shí)現(xiàn)方式有個(gè)重要的局限,即如何保證MySQL和cache之間的數(shù)據(jù)一致性,盡管Memcached Functions for MySQL(基于Trigger和MySQL UDF)從某種程度上提供了一種解決方案。

     此外,關(guān)于Independent from storage engines和Supporting lots of query patterns。理論上通過(guò)Handler API可以和任何存儲(chǔ)引擎交互,但是目前HandlerSocket只是在InnoDB Plugin上進(jìn)行了測(cè)試。此外,HandlerSocket的作者在其blog上指出,通過(guò)HandlerSocket,不僅可以通過(guò)主鍵查詢,也可以通過(guò)普通索引,甚至不使用索引進(jìn)行查詢(包括范圍查詢),甚至還可以進(jìn)行insert/update/delete等寫操作。

    關(guān)于All operational benefits from MySQL,正如在其blog中提到的,可以比較方便地通過(guò)MySQL的既存功能對(duì)HandlerSocket進(jìn)行監(jiān)控,例如以下幾個(gè)監(jiān)控指標(biāo):

Sql代碼 
  1. mysql> show global status like 'handler_read%';  
  2. mysql> show global status like 'Com_select%';  
  3. mysql> show global status like 'InnoDB_rows_read';  
 

5 Client API

    遺憾的是到目前為止,HandlerSocket只有C和Perl的客戶端API,Java和Python等版本的客戶端API貌似在開發(fā)中。在這里簡(jiǎn)單分析一下Perl版本的客戶端API。

 

5.1 Connection

    與HandlerSocket Plugin創(chuàng)建連接的方式如下:

Perl代碼 
  1. use Net::HandlerSocket;  
  2. my $args = { host => 'localhost', port => 9998 };  
  3. my $hs = new Net::HandlerSocket($args);  

    其中Net::HandlerSocket模塊存放于HandlerSocket的分發(fā)tar包的perl-Net-HandlerSocket目錄中,編譯安裝方式如下:

Shell代碼 
  1. cd perl-Net-HandlerSocket/  
  2. perl Makefile.PL  
  3. make  
  4. make install  
 

5.2 Opening index

    在進(jìn)行操作之前,首先需要打開一個(gè)索引,如下:

Perl代碼 
  1. my $err = $hs->open_index(3'database1''table1''PRIMARY''f1,f2');  
  2. die $hs->get_error() if $res->[0] != 0;  

    其中'database1'為schema名,'table1'為表名,'PRIMARY'為索引名,'f1,f2'為查詢的列名。關(guān)于方法的open_index的第一個(gè)參數(shù)3,用來(lái)在每個(gè)Net::HandlerSocket對(duì)象中唯一標(biāo)識(shí)一個(gè)表名。

 

5.3 Query

    通過(guò)execute_single方法進(jìn)行查詢,例如:

Perl代碼 
  1. my $res = $hs->execute_single(3'=', [ 'foo' ], 10);  
  2. die $hs->get_error() if $res->[0] != 0;  
  3. shift(@$res);  

    execute_single方法的第一個(gè)參數(shù)需要跟之前open_index方法的第一個(gè)參數(shù)一致。第二個(gè)參數(shù)'='指定了檢索條件,目前支持'=', '>=', '<=', '>'和'<'。第三個(gè)參數(shù)[ 'foo' ]為一個(gè)arrayref,指定了檢索的key,其長(zhǎng)度必須小于或者等于對(duì)應(yīng)索引的列數(shù)。第四個(gè)和第五個(gè)參數(shù)指定了查詢的limit和offset。

 

    execute_single方法的返回值類型為arrayref,其第一個(gè)元素為error code:

  • 0:正常。
  • 負(fù)數(shù):I/O 錯(cuò)誤,對(duì)應(yīng)的Net::HandlerSocket對(duì)象需要被丟棄。
  • 正數(shù):其它錯(cuò)誤,但是與HandlerSocket Plugin的連接仍然正?捎,因此對(duì)應(yīng)的Net::HandlerSocket對(duì)象可以繼續(xù)使用。

    第一個(gè)元素之后的其它元素即查詢結(jié)果,如果返回的row數(shù)大于1,那么也是存放在這個(gè)一維數(shù)組中。假設(shè)查詢結(jié)果共5行,每行三列,那么對(duì)應(yīng)的代碼如下:

Perl代碼 
  1. die $hs->get_error() if $res->[0] != 0;  
  2. shift(@$res);  
  3. for (my $row = 0; $row < 5; ++$row) {  
  4.   for (my $col = 0; $col < 3; ++$col) {  
  5.     my $value = $res->[$row * 5 + $col];  
  6.     # ...  
  7.   }  
  8. }  

 

5.4 Insert records

    execute_single方法也可以用來(lái)插入記錄,例如:

Perl代碼 
  1. my $args = { host => 'localhost', port => 9999 };  
  2. my $hs = new Net::HandlerSocket($args);  
  3.   
  4. my $res = $hs->execute_single(3'+', [ 'foo''bar''baz' ]);  
  5. die $hs->get_error() if $res->[0] != 0;  
  6. my $num_inserted_rows = $res->[1];  

    需要注意的是,此時(shí)連接的是9999端口,因?yàn)?998端口只支持讀操作。

 

5.5 Update or delete records

    對(duì)于更新和刪除操作,同樣使用execute_single方法,例如:

Perl代碼 
  1. my $args = { host => 'localhost', port => 9999 };  
  2. my $hs = new Net::HandlerSocket($args);  
  3.   
  4. my $res = $hs->execute_single(3'=', [ 'bar' ], 10'U', [ 'fubar''hoge' ]);  
  5. die $hs->get_error() if $res->[0] != 0;  
  6. my $num_updated_rows = $res->[1];  
  7.   
  8. my $res = $hs->execute_single(3'=', [ 'baz' ], 10'D');  
  9. die $hs->get_error() if $res->[0] != 0;  
  10. my $num_deleted_rows = $res->[1];  

    execute_single方法的第六個(gè)參數(shù)指定的操作類型,目前支持'U'和'D'。對(duì)于'U'操作,execute_single方法的第七個(gè)參數(shù)指定了更新后的值;對(duì)于'D'操作,第七個(gè)參數(shù)被忽略。

 

5.6 Multiple operations

    可在一次調(diào)用中執(zhí)行多個(gè)操作,這樣速度更快,例如:

Perl代碼 
  1. my $rarr = $hs->execute_multi([  
  2.   [ 0'>=', [ 'foo' ], 50 ],  
  3.   [ 2'=', [ 'bar' ], 10 ],  
  4.   [ 4'<', [ 'baz' ], 105 ],  
  5. ]);  
  6. for my $res (@$rarr) {  
  7.   die $hs->get_error() if $res->[0] != 0;  
  8.   shift(@$res);  
  9.   # ...  
  10. }  
 

6 Reference

    http://yoshinorimatsunobu.blogspot.com/2010/10/using-mysql-as-nosql-story-for.html (翻)

    http://www.mysqlperformanceblog.com/2010/11/02/handlersocket-on-ssd/

您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP