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をチューニングせずに使っているからなのか。
しばらく研究してみよう。