与 MariaDB 相比,CockroachDB 的插入速度较慢?
CockroachDB slow inserts compared to MariaDB?
我正在做一些测试,看看我是否可以将 CockroachDB 用于我的一个小项目。我在同一个 DC 中创建了两个相同的 VPS,并在其中一个上安装了 CockroachDB,在另一个上安装了 MariaDB,然后创建了两个测试数据库来存储数据。以 5K 的批次一次执行 1M 插入。
我在 VPS/db 服务器上都没有做任何更改,它们只是 运行 安装后的样子。
CockroachDB 模式:
root@:26257/test> show create table customers;
+-----------+------------------------------------------------------------------+
| Table | CreateTable
|
+-----------+------------------------------------------------------------------+
| customers | CREATE TABLE customers (
|
| | id INT NOT NULL DEFAULT unique_rowid(),
|
| | first_name STRING NULL,
|
| | last_name STRING NULL,
|
| | age INT NULL,
|
| | CONSTRAINT "primary" PRIMARY KEY (id ASC),
|
| | FAMILY "primary" (id, first_name, last_name, age) |
| | )
|
+-----------+------------------------------------------------------------------+
MariaDB:
MariaDB [test]> show create table customers \G;
*************************** 1. row ***************************
Table: customers
Create Table: CREATE TABLE `customers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(250) DEFAULT NULL,
`last_name` varchar(250) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7000001 DEFAULT CHARSET=latin1
插入脚本非常愚蠢,只是快速组合起来将一堆数据插入数据库,使用 golang(对于 CockroachDB 和 MariaDB 都是一样的,只有很小的区别,即:连接字符串):
package main
import "database/sql"
import _ "github.com/lib/pq"
import "fmt"
import "strings"
import "math/rand"
import "time"
func init() {
rand.Seed(time.Now().UnixNano())
}
var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
func RandStringRunes(n int) string {
b := make([]rune, n)
for i := range b {
b[i] = letterRunes[rand.Intn(len(letterRunes))]
}
return string(b)
}
func main() {
db, err := sql.Open("postgres", "postgresql://root@localhost:26257/test?sslmode=disable")
if err != nil {
panic(err)
}
sqlStr := "INSERT INTO customers(first_name, last_name, age) VALUES"
insert := ""
for i := 0; i < 1000000; i++ {
fname := RandStringRunes(30)
lname := RandStringRunes(39)
age := rand.Intn(100)
insert += fmt.Sprintf("('%s', '%s', %d),", fname, lname, age)
if i%5000 == 0 {
sql := sqlStr + strings.Trim(insert, ",")
insert = ""
_, err := db.Exec(sql)
if err != nil {
panic(err)
}
}
}
if len(insert) > 0 {
sql := sqlStr + strings.Trim(insert, ",")
insert = ""
_, err := db.Exec(sql)
if err != nil {
panic(err)
}
}
}
结果:
MariaDB:
[root@mariadb ~]# time ./insert
real 0m40.650s
user 0m33.784s
sys 0m0.112s
[root@mariadb ~]#
蟑螂数据库:
[root@cockroachdb ~]# time ./insert
real 3m42.909s
user 0m35.620s
sys 0m0.144s
我正在使用 MariaDB:
[root@mariadb ~]# mysql --version
mysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1
和 CockroachDB:
[root@cockroachdb ~]# cockroach version
Build Tag: v1.0.1
Build Time: 2017/05/25 15:17:49
Distribution: CCL
Platform: linux amd64
Go Version: go1.8.1
C Compiler: gcc 6.3.0
Build SHA-1: 50fd18dcf8da75a0f4980344a885fe6105d0cf23
Build Type: release
[root@cockroachdb ~]#
我知道使用随机数据可能会影响数字,但我几乎总是得到这些数字,所以有足够的一致性。
这些数字对于 CockroachDB 是否正确,在上述版本中插入速度是否较慢?
此外,计算 table 中的所有记录也很慢(select count(*) from customers
),不确定到底慢了多少,因为我没有在结果集中得到计时器,因为我从MariaDB 服务器,但 MariaDB 服务器 returns 结果不到 5 秒,而 CockroachDB 从我的计算中花费了 10 多秒。
我喜欢更改 table 以添加新列,例如,使用 CockroachDB 是即时的,而使用 MariDB 在具有 5M 记录的 table 上花费了将近 30 秒。
非常感谢任何想法。
谢谢。
CockroachDB 1.0.1(和 1.0)有一个 debug assertion 剩余,导致批量操作大幅减速。此断言将在 1.0.2 中删除(计划在几周内发布)。为了比较,这是我在 运行 对 1.0.1:
时看到的
$ time ./insert
real 2m3.125s
user 0m35.942s
sys 0m6.659s
这是(未发布的)1.0.2:
$ time ./insert
real 0m48.145s
user 0m36.638s
sys 0m6.692s
尽管有所改进,但我预计性能仍会低于 MariaDB。部分原因是 CockroachDB 的架构。即使 运行 单个节点,它也会经历分布式执行所需的大量代码路径。部分原因是成熟。 MariaDB 已经优化多年,而我们只是处于 CockroachDB 工作的早期阶段。
我正在做一些测试,看看我是否可以将 CockroachDB 用于我的一个小项目。我在同一个 DC 中创建了两个相同的 VPS,并在其中一个上安装了 CockroachDB,在另一个上安装了 MariaDB,然后创建了两个测试数据库来存储数据。以 5K 的批次一次执行 1M 插入。 我在 VPS/db 服务器上都没有做任何更改,它们只是 运行 安装后的样子。
CockroachDB 模式:
root@:26257/test> show create table customers;
+-----------+------------------------------------------------------------------+
| Table | CreateTable
|
+-----------+------------------------------------------------------------------+
| customers | CREATE TABLE customers (
|
| | id INT NOT NULL DEFAULT unique_rowid(),
|
| | first_name STRING NULL,
|
| | last_name STRING NULL,
|
| | age INT NULL,
|
| | CONSTRAINT "primary" PRIMARY KEY (id ASC),
|
| | FAMILY "primary" (id, first_name, last_name, age) |
| | )
|
+-----------+------------------------------------------------------------------+
MariaDB:
MariaDB [test]> show create table customers \G;
*************************** 1. row ***************************
Table: customers
Create Table: CREATE TABLE `customers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`first_name` varchar(250) DEFAULT NULL,
`last_name` varchar(250) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7000001 DEFAULT CHARSET=latin1
插入脚本非常愚蠢,只是快速组合起来将一堆数据插入数据库,使用 golang(对于 CockroachDB 和 MariaDB 都是一样的,只有很小的区别,即:连接字符串):
package main
import "database/sql"
import _ "github.com/lib/pq"
import "fmt"
import "strings"
import "math/rand"
import "time"
func init() {
rand.Seed(time.Now().UnixNano())
}
var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
func RandStringRunes(n int) string {
b := make([]rune, n)
for i := range b {
b[i] = letterRunes[rand.Intn(len(letterRunes))]
}
return string(b)
}
func main() {
db, err := sql.Open("postgres", "postgresql://root@localhost:26257/test?sslmode=disable")
if err != nil {
panic(err)
}
sqlStr := "INSERT INTO customers(first_name, last_name, age) VALUES"
insert := ""
for i := 0; i < 1000000; i++ {
fname := RandStringRunes(30)
lname := RandStringRunes(39)
age := rand.Intn(100)
insert += fmt.Sprintf("('%s', '%s', %d),", fname, lname, age)
if i%5000 == 0 {
sql := sqlStr + strings.Trim(insert, ",")
insert = ""
_, err := db.Exec(sql)
if err != nil {
panic(err)
}
}
}
if len(insert) > 0 {
sql := sqlStr + strings.Trim(insert, ",")
insert = ""
_, err := db.Exec(sql)
if err != nil {
panic(err)
}
}
}
结果:
MariaDB:
[root@mariadb ~]# time ./insert
real 0m40.650s
user 0m33.784s
sys 0m0.112s
[root@mariadb ~]#
蟑螂数据库:
[root@cockroachdb ~]# time ./insert
real 3m42.909s
user 0m35.620s
sys 0m0.144s
我正在使用 MariaDB:
[root@mariadb ~]# mysql --version
mysql Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1
和 CockroachDB:
[root@cockroachdb ~]# cockroach version
Build Tag: v1.0.1
Build Time: 2017/05/25 15:17:49
Distribution: CCL
Platform: linux amd64
Go Version: go1.8.1
C Compiler: gcc 6.3.0
Build SHA-1: 50fd18dcf8da75a0f4980344a885fe6105d0cf23
Build Type: release
[root@cockroachdb ~]#
我知道使用随机数据可能会影响数字,但我几乎总是得到这些数字,所以有足够的一致性。
这些数字对于 CockroachDB 是否正确,在上述版本中插入速度是否较慢?
此外,计算 table 中的所有记录也很慢(select count(*) from customers
),不确定到底慢了多少,因为我没有在结果集中得到计时器,因为我从MariaDB 服务器,但 MariaDB 服务器 returns 结果不到 5 秒,而 CockroachDB 从我的计算中花费了 10 多秒。
我喜欢更改 table 以添加新列,例如,使用 CockroachDB 是即时的,而使用 MariDB 在具有 5M 记录的 table 上花费了将近 30 秒。
非常感谢任何想法。
谢谢。
CockroachDB 1.0.1(和 1.0)有一个 debug assertion 剩余,导致批量操作大幅减速。此断言将在 1.0.2 中删除(计划在几周内发布)。为了比较,这是我在 运行 对 1.0.1:
时看到的$ time ./insert
real 2m3.125s
user 0m35.942s
sys 0m6.659s
这是(未发布的)1.0.2:
$ time ./insert
real 0m48.145s
user 0m36.638s
sys 0m6.692s
尽管有所改进,但我预计性能仍会低于 MariaDB。部分原因是 CockroachDB 的架构。即使 运行 单个节点,它也会经历分布式执行所需的大量代码路径。部分原因是成熟。 MariaDB 已经优化多年,而我们只是处于 CockroachDB 工作的早期阶段。