Вот тестовый скрипт для проверки скорости записи, который по мере проведения тестов будет модифицироваться:
#!/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 слил на данном типе данных =)
Ну дык а што ты хотел
ReplyDeleteСделай mysql engine = HEAP и сравни
а так ты сравниваешь разные вещи
Нене, всё верно, MemcacheDB хранит данные на диске, а не только в оперативке как Memcached, HEAP (он жн Memory) в MySQL тут как раз надо сравнивать с Memcached, вот тогда всё будет честно :)
ReplyDelete