memcachedのベンチマーク

MySQLから取得するのと、memcachedから取得するのとどっちが速くなるのかベンチマークしてみた。

Create Table: CREATE TABLE `data` (
  `id` int(10) unsigned NOT NULL,
  `user_id` int(10) unsigned NOT NULL,
  `post_date` int(10) unsigned NOT NULL,
  `content` varchar(100) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `i1` (`user_id`,`post_date`),
  KEY `i2` (`post_date`)
) ENGINE=InnoDB DEFAULT CHARSET=cp932
use Cache::Memcached;

my $expires = 3600; # 1 hour
my $memcached = Cache::Memcached->new({
    servers => ["127.0.0.1:11211"],
    compress_threshold => 10_000
});

timethese(10000, {
        rdbms     => 'from_rdbms(rand_id());',
        memcached => 'from_memcached(rand_id());',
});

sub rand_id {
    my $val = int(rand 300000) + 10001;
    return $val;
}

sub from_memcached {
    my $id = shift;
    my $content= $memcached->get("content.$id");
    return $content;
}

sub from_rdbms {
    my $id = shift;
    my $dbh_d = get_handle();
    my $sth = $dbh_d->prepare(<<'SQL');
        select content
        from data where id = ?
SQL
    $sth->execute($id);
    my ($content) = $sth->fetchrow_array();
    return $content;
}
  • 結果
Benchmark: timing 10000 iterations of memcached, rdbms...
 memcached: 11 wallclock secs ( 1.43 usr +  4.40 sys =  5.83 CPU) @ 1715.27/s (n=10000)
     rdbms: 14 wallclock secs ( 0.61 usr +  1.40 sys =  2.01 CPU) @ 4975.12/s (n=10000)


そんなに速くないなぁ。場合によってはmemcachedのほうが遅いことも。
テストデータが不適切なのか、memcachedをチューニングせずに使っているからなのか。
しばらく研究してみよう。