我正在为我们的一个项目比较不同的数据库。 我们需要10亿次插入/天和数十亿次读取(每个select语句应该读取50行)。
每个记录都有很少的字段,主要是id列和平均500字节的blob。
我正在尝试在我的机器中进行模拟。 我可以在文件系统中达到50,000次插入/秒(这不好,因为每个记录浪费了大量空间)。
我可以在mongodb中达到30,000次插入/秒(但我读到它在复制/分区节点中表现不佳)。
我可以在mysql中达到20,000次/秒,meh。
但是Cassandra,考虑得太慢了:每秒只有1,500次插入! 起初我认为问题在于我正在使用的驱动程序,然后我尝试了不同的驱动程序,没有那么不同。我试图通过多个进程插入,但仍然比其他进程慢。
所有基准都说Cassandra最快,但结果不佳。我错过了什么?
我们需要的正常模式如下(* _uid是20字节的二进制数据,保证按升序和唯一):
create table records
(
record_uid blob PRIMARY KEY,
user_uid blob,
product_uid blob,
data blob
);
此外,是否有更好的建议能够以更低的成本满足我们的需求?
P.S。这是我用来测试的代码:
$cluster = Cassandra::cluster()->build();
$keyspace = 'benchmark';
$session = $cluster->connect($keyspace);
$prepare = $session->prepare("INSERT INTO records (record_uid, user_uid, product_uid, data) VALUES (?, ?, ?, ?)");
$start = microtime(true);
for($i = 0; $i < 100000; $i++)
{
$values = [
'message_uid' => new Cassandra\Blob(uuid()),
'user_uid' => new Cassandra\Blob(uuid()),
'room_uid' => new Cassandra\Blob(uuid()),
'message' => new Cassandra\Blob('This is a test!!!!!!!!!!!!')
];
$options = ['arguments' => $values];
$session->execute($prepare, $options);
}
$time = microtime(true) - $start;
$insert_per_second = $time / $i;
echo "execution time: $time seconds\r\n"; // ~100 seconds
echo "insert per second: $insert_per_seconds\r\n"; // ~1500 records / sec