Медленные вставки CockroachDB по сравнению с MariaDB?

Я делаю несколько тестов, чтобы увидеть, могу ли я использовать CockroachDB для моего небольшого проекта. Я создал два идентичных VPS в одном DC и установил CockroachDB на одном из них и MariaDB на другом, а затем создал две тестовые базы данных для хранения данных. Делать 1М вставки за раз в партиях по 5К. Я не изменил ни один из серверов 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 ~]# 

CockroachDB:

[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, вставки медленнее в вышеуказанной версии?

Кроме того, подсчет всех записей в таблице тоже медленный (select count(*) from customers), точно не знаю, сколько именно, поскольку я не получаю таймер в наборе результатов, который получаю с сервера MariaDB, но сервер MariaDB возвращает результат менее чем за 5 секунд, в то время как CockroachDB отнимает у меня более 10 секунд.

Мне нравится, что изменение таблицы для добавления нового столбца, например, происходит мгновенно с CockroachDB, в то время как с MariDB заняло почти 30 секунд для таблицы с 5M записями.

Любые мысли высоко ценятся.
Благодарю.

1 ответ

Решение

В CockroachDB 1.0.1 (и 1.0) осталось отладочное утверждение, которое вызывает значительное замедление массовых операций. Это утверждение будет удалено в 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.

Другие вопросы по тегам