首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CockroachDB慢插入与MariaDB相比?

CockroachDB慢插入与MariaDB相比?
EN

Stack Overflow用户
提问于 2017-05-31 13:50:58
回答 1查看 1.3K关注 0票数 1

我正在做一些测试,看看我是否可以在我的一个小项目中使用CockroachDB。我在同一个DC中创建了两个相同的VPS‘’es,并在其中一个上安装了CockroachDB,在另一个上安装了MariaDB,然后创建了两个测试数据库来存储数据。一次执行1M插入,分批插入5K。我在两个VPS/db服务器上都没有做任何更改,它们只是在安装后运行。

CockroachDB模式:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

insert脚本非常愚蠢,只需使用golang将一堆数据快速组合到数据库中(对于CockroachDB和MariaDB都是一样的,但差别很小,即连接字符串):

代码语言:javascript
复制
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:

代码语言:javascript
复制
[root@mariadb ~]# time ./insert

real    0m40.650s
user    0m33.784s
sys 0m0.112s
[root@mariadb ~]# 

CockroachDB:

代码语言:javascript
复制
[root@cockroachdb ~]# time ./insert

real    3m42.909s
user    0m35.620s
sys 0m0.144s

我正在使用MariaDB:

代码语言:javascript
复制
[root@mariadb ~]# mysql --version
mysql  Ver 15.1 Distrib 5.5.52-MariaDB, for Linux (x86_64) using readline 5.1

和CockroachDB:

代码语言:javascript
复制
[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是正确的吗?在上面的版本中插入是否比较慢?

而且,表中所有记录的计数也很慢(select count(*) from customers),因为我从MariaDB服务器获得的结果集中没有计时器,所以不能准确地确定它的数量,但是MariaDB服务器在5秒内返回结果,而CockroachDB从计数中花费的时间远远超过10秒。

我喜欢修改表以添加一个新列,例如,对于CockroachDB来说,这是即时的,而使用MariDB,在一个记录为5M的表上花费了将近30秒的时间。

任何想法都是非常感谢的。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-31 15:16:40

CockroachDB 1.0.1 (和1.0)留下了一个调试断言,这会导致批量操作的大幅度放缓。这个断言将在1.0.2中删除(计划在几周后发布)。作为比较,下面是我在1.0.1下运行时所看到的情况:

代码语言:javascript
复制
$ time ./insert

real    2m3.125s
user    0m35.942s
sys     0m6.659s

以下是(未发布的) 1.0.2:

代码语言:javascript
复制
$ time ./insert

real    0m48.145s
user    0m36.638s
sys     0m6.692s

尽管有了改进,但我预计性能仍将低于MariaDB。造成这种情况的部分原因是CockroachDB的架构。即使在运行单个节点时,它也要经过许多分布式执行所需的代码路径。部分原因是成熟。MariaDB已经被优化了多年,而我们只是处于CockroachDB工作的早期阶段。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44286626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档