HandlerSocketでデータを取得してみる
HandlerSocketでデータを取得してみる。
データを取得してみる
testデータベースにsampleのテーブルを作成し、レコードを追加する。
$ mysql -u root mysql> use test mysql> create table sample (id int primary key, val int); mysql> insert into sample (id, val) values (10, 100); mysql> select * from sample; +----+------+ | id | val | +----+------+ | 10 | 100 | +----+------+
HandlerSocketでデータを取得するPHPを作成する。
$ vi hs.php
<?php $hs = new HandlerSocket('localhost', 9998); if (!($hs->openIndex(1, 'test', 'sample', HandlerSocket::PRIMARY, 'val'))) { echo $hs->getError(), PHP_EOL; die(); } $ret = $hs->executeSingle(1, '=', array(10), 1, 0); print_r($ret);
実行すると、下記の結果が得られる。
$ php hs.php Array ( [0] => Array ( [0] => 100 ) )
測定してみる
HandlerSocketを使った場合と使わない場合、Memcacheの場合で
参照にどれくらい違いがでるか比較してみる。
準備
まず、必要になるパッケージを入れて、memcacheを起動しておく。
$ sudo yum -y install memcached php-mysql php-pecl-memcache $ sudo service memcached start
HandlerSocketを使った場合
$ vi hs.php
<?php // 接続 $hs = new HandlerSocket('localhost', 9998); $hs->openIndex(1, 'test', 'sample', HandlerSocket::PRIMARY, 'val'); // 測定 $time_start = microtime(true); for ($i = 0; $i < 100000; $i++) { $ret = $hs->executeSingle(1, '=', array(10), 1, 0); } $time_end = microtime(true); // 表示 echo round($time_end - $time_start, 2) . " sec\n";
実行すると、約6秒かかった。
$ php hs.php 6.15 sec $ php hs.php 5.8 sec $ php hs.php 6.29 sec
HandlerSocketを使わない場合
$ vi mysql.php
<?php // 接続 $link = mysql_connect('localhost:/tmp/mysql.sock', 'root'); $db = mysql_select_db('test', $link); // 測定 $time_start = microtime(true); for ($i = 0; $i < 100000; $i++) { $result = mysql_query('select val from sample where id = ' . 10); $row = mysql_fetch_assoc($result); } $time_end = microtime(true); // 表示 echo round($time_end - $time_start, 2) . " sec\n";
実行すると、約11秒かかった。
$ php mysql.php 10.87 sec $ php mysql.php 10.84 sec $ php mysql.php 11.18 sec
Memcacheの場合
$ vi memcache.php
<?php // 接続 $m = new Memcache; $m->connect('localhost'); $m->set(10, 100); // 測定 $time_start = microtime(true); for ($i = 0; $i < 100000; $i++) { $val = $m->get(10); } $time_end = microtime(true); // 表示 echo round($time_end - $time_start, 2) . " sec\n";
実行すると、約5.5秒かかった。
$ php memcache.php 5.48 sec $ php memcache.php 5.48 sec $ php memcache.php 5.34 sec
結果
100000回参照にかかった時間 | |
---|---|
HandlerSocketを使った場合 | 約6秒 |
HandlerSocketを使わない場合 | 約11秒 |
Memcacheの場合 | 約5.5秒 |