Я сравниваю разные базы данных для одного из наших проектов.
Нам нужно 1 миллиард операций вставки в день и миллиарды операций чтения (каждая инструкция выбора должна читать 50 строк).
Каждая запись имеет несколько полей, в основном столбцы идентификаторов и в среднем 500-байтовый BLOB-объект.
Я пытаюсь смоделировать на моей машине.
Я могу достичь 50 000 вставок в секунду в файловой системе (что не очень хорошо, так как расходует много места на запись).
Я могу достичь 30 000 вставок в секунду в mongodb (но я читал, что это плохо в репликации / разделенных узлах).
Я могу достичь 20 000 вставок в секунду в mysql, ме.
Но Кассандра, слишком медленная, чтобы рассмотреть: едва 1500 вставок в секунду!
Сначала я полагал, что проблема связана с драйвером, который я использую, затем я попробовал другие драйверы, не такие разные. Я пытался вставить несколько процессов, но все же гораздо медленнее, чем другие.
Все тесты говорят, что Кассандра самая быстрая, но у меня плохие результаты. Чего мне не хватает?
Нормальная схема, которая нам нужна, похожа на приведенную ниже (* _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