HandlerSocketでデータを取得してみる

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秒