FastNetMon

Sunday 15 March 2009

MySQL vs MemcacheDB

MemcacheDB мы протестировали ранее и получили результаты 14 000 / 18 000 записей в секунду соотвественно для записи / чтения.

Вот тестовый скрипт для проверки скорости записи, который по мере проведения тестов будет модифицироваться:

#!/usr/bin/perl

use strict;
use warnings;

use DBI;

my $dsn = "DBI:mysql:database=test_hashed;host=localhost";
my $dbh = DBI->connect($dsn, 'root', '') or die "Cannot connect to db";

open my $fl, '<', 'lists/test.txt' or die "suxx"; $dbh->do("DELETE FROM test_table");

while(<$fl>) {
chomp $_;
$dbh->do("INSERT INTO test_table VALUES (?, ?)", undef, $_, "$_ value");
}



Для проверки скорости чтения будет следующий скрипт:

#!/usr/bin/perl

use strict;
use warnings;

use Data::Dumper;
use DBI;

my $dsn = "DBI:mysql:database=test_hashed;host=localhost";
my $dbh = DBI->connect($dsn, 'root', '') or die "Cannot connect to db";

open my $fl, '<', 'lists/test.txt' or die "suxx"; #$dbh->do("DELETE FROM test_table");

while(<$fl>) {
chomp $_;
#$dbh->do("INSERT INTO test_table VALUES (?, ?)", undef, $), "$_ value");
my $sth = $dbh->prepare("SELECT value_ FROM test_table WHERE key_=?");
$sth->execute($_);
my $result = $sth->fetchrow_hashref();

#print Dumper($result);
}



Тест1.
Таблица имеет следующий вид: CREATE TABLE test_table (key_ varchar(255), value_ varchar(255)) ENGINE = MYISAM;

При записи имеем:
time ./work_db_mysql.pl
real 2m4.629s
user 0m6.640s
sys 0m5.608s

Т.е. около 16 000 записей / секунду.

При чтении имеем:
.... жду уже 10 минут, а скрипт даже не добрался до цифры "1" в файле (там данные упорядочены по алфавиту -- 01234567890abcd...z), что говорит о том, что ещё ждать десятки минут. Что же, MySQL просто ужасен, если не использовать индексы.


Тест2.
Таблица имеет следующий вид: CREATE TABLE test_table (key_ varchar(255), value_ varchar(255), index(key_)) ENGINE = MYISAM; (предварительно убиваем старую таблицу -- drop table test_table;)

Тест на скорость записи данных:
real 3m3.763s
user 0m10.985s
sys 0m9.669s

Т.е. ~10 500 записей / секунду

Тест на чтение данных:
time ./work_db_mysql_read.pl

real 6m17.771s
user 0m19.949s
sys 0m8.509s

Т.е. около 3 000 чтений / секунду, что подтверждает явное преимущество MemcacheDB.

Тест 3.
Таблица имеет следующий вид: CREATE TABLE test_table (key_ char(255), value_ char(255), index(key_)) ENGINE = MYISAM; (т.е. fixed length char вместо varchar)

Запись:
real 3m15.876s
user 0m6.944s
sys 0m5.820s

~ 10 000 записей в секунду

Чтение:

real 6m11.984s
user 0m20.137s
sys 0m8.385s

Т.е. около ~3200 записей / секунду.

Ну выводы... MySQL слил на данном типе данных =)

2 comments :

  1. Ну дык а што ты хотел
    Сделай mysql engine = HEAP и сравни

    а так ты сравниваешь разные вещи

    ReplyDelete
  2. Нене, всё верно, MemcacheDB хранит данные на диске, а не только в оперативке как Memcached, HEAP (он жн Memory) в MySQL тут как раз надо сравнивать с Memcached, вот тогда всё будет честно :)

    ReplyDelete

Note: only a member of this blog may post a comment.