Saat ini saya sedang menguji TokuDB dan saya sangat terkesan. Saat ini penyisipan per detik telah mencapai puncaknya hingga lebih dari 50.000 per detik dengan dua pekerjaan simultan berjalan. Tingkat penyisipan rata-rata adalah antara 38.000 dan 42.000 penyisipan per detik.
Saya ingin melangkah lebih tinggi lagi, 100.000 penyisipan per detik, karena saya perlu memasukkan 1,2 miliar baris terhitung untuk saat ini dan sekitar 6 miliar baris lainnya dalam waktu dekat. Saya ingin saran tentang cara mencapai ini :-)
Pengaturan saya saat ini:
- Perangkat keras: VPS dengan RAM 4 GB, SSD 150 GB, 2 inti: CPU Intel Westmere E56xx/L56xx/X56xx (Nehalem-C) 2,59GHz
- Opsi pemasangan disk: default, noatime
- Sistem Operasi: CentOS 6.8 64bit
- Basis Data: Server Percona 5.7.14-8
Pengaturan my.cnf:
# TokuDB #
tokudb_cache_size = 2G
tokudb_commit_sync = 0
tokudb_fsync_log_period = 1000
Tata letak tabel TokuDB:
CREATE TABLE `t1` (
`id` int(15) NOT NULL AUTO_INCREMENT,
`m_id` int(11) NOT NULL,
`c1` decimal(6,2) DEFAULT NULL,
`c2` decimal(6,2) DEFAULT NULL,
`c3` decimal(6,2) DEFAULT NULL,
`c4` decimal(6,2) DEFAULT NULL,
`c5` decimal(6,2) DEFAULT NULL,
`c6` decimal(6,2) DEFAULT NULL,
`c7` decimal(6,2) DEFAULT NULL,
`factor` decimal(4,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=TokuDB DEFAULT CHARSET=latin1
CREATE TABLE `t2` (
`id` int(15) NOT NULL AUTO_INCREMENT,
`v_id` int(15) NOT NULL,
`pid` int(11) DEFAULT NULL,
`amount` decimal(6,2) DEFAULT NULL,
`unit` int(1) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=TokuDB DEFAULT CHARSET=latin1
Saya menyadari fakta bahwa saya tidak menggunakan indeks apa pun selain indeks kunci utama. Hal ini disebabkan oleh dampak negatif waktu terhadap penyisipan kunci. Kunci cluster untuk setiap tabel akan dibuat di akhir pekerjaan penyisipan.
Opsi baris perintah MySQL tambahan:
SET unique_checks=OFF;
Entah bagaimana saya tidak bisa mendapatkan ini di my.cnf.. Jika seseorang tahu caranya maka ini akan sangat dihargai (saat ini Unique_checks = off akan memblokir MySQL agar tidak dimulai karena variabel yang tidak dikenal di my.cnf) .
Pernyataan SQL dikelompokkan dalam kumpulan 15.000. Skrip PHP menghasilkan pernyataan SQL dan mengirimkan kueri melalui mysqli_multiquery ke server MySQL:
<?PHP
foreach (generateCombinations($Arr) as $c) {
$QueryBatch[] = "insert into t1 values (NULL"
. ", " . $record->id
. ", " . rand(1, 35)
. ", " . rand(1, 140)
. ", " . rand(1, 20)
. ", NULL"
. ", " . rand(1, 14)
. ", " . rand(1, 300)
. ", " . rand(1, 4)
. ", NULL );";
$QueryBatch[] = "SET @t1id = LAST_INSERT_ID();";
$cntBatch++;
$pquery = array();
foreach ( $c as $key => $pid){
if ( is_null($pid) )
continue;
$pquery[] = "(NULL, @t1id, " . $pid . ", " . rand(1, 800) . ", 0)";
$cntBatch++;
}
$QueryBatch[] = "insert into t2 values " . implode(',', $pquery) . ";";
if ($cntBatch > 15000) {
$query = implode($QueryBatch);
if ( $mysqli->multi_query($query) ){
while ($mysqli->next_result()) {;}
} else {
printf("Errormessage: %s\n", $mysqli->error);
echo $query . "\n";
}
$cntBatch = 0;
unset($QueryBatch);
}
}
?>
Contoh pernyataan penyisipan SQL:
insert into t1 values (NULL, 1 , 30, 100, 15, NULL, 10, 250, 2, NULL );
SET @t1id = LAST_INSERT_ID();
insert into t2 values (NULL, @t1id, 1, 750, 0),(NULL, @t1id, 1, 600, 0),(NULL, @t1id, 1, 500, 0),(NULL, @t1id, 1, 400, 0),(NULL, @t1id, 1, 300, 0),(NULL, @t1id, 1, 200, 0),(NULL, @t1id, 1, 100, 0);
insert into t1 values (NULL, 2 , 25, 95, 14, NULL, 11, 200, 3, NULL );
SET @t1id = LAST_INSERT_ID();
insert into t2 values (NULL, @t1id, 1, 600, 0),(NULL, @t1id, 1, 100, 0),(NULL, @t1id, 1, 300, 0),(NULL, @t1id, 1, 443, 0),(NULL, @t1id, 1, 521, 0),(NULL, @t1id, 1, 213, 0),(NULL, @t1id, 1, 433, 0);
[.. At least 14982 more..]