Почему postgres быстрее, чем LMDB? - PullRequest
0 голосов
/ 16 января 2020

Я сравнил Postgres и LMDB, вставив по 1 миллиону записей в каждую, которые имеют сочетание уникальных идентификаторов и некоторых значений типа массива. В Postgres я использовал jsonb для хранения массива, а в LMDB - в качестве атрибутов и многозначных атрибутов.

Я запускал этот тест на виртуальной машине Debian с 6 ГБ ОЗУ.

Postgres было МНОГО быстрее, чем LMDB. Даже когда я сделал поиск по значениям типа массива, проверив, существует ли значение в массиве. Где столбец json не был проиндексирован, и я искал, существует ли значение в массиве json.

На основании того, что я прочитал, они оба использовали B-Tree.

Поэтому не должна быть LMDB, которая отображена в памяти, быть быстрее, чем Postgres, по крайней мере, в некоторых случаях.

Вот сценарии, которые я использовал для вставки данных в Postgres и MDB.

Postgres:

import psycopg2
import random
import string
import json
import time

connection = psycopg2.connect("dbname='name' user='user' host='localhost' password='test'")

cursor = connection.cursor()

count = 698595

ports = [80, 143, 3389, 22, 21, 8080, 443, 289, 636]

def get_random_ports():
    l_ports = list(ports)
    num_service = random.randrange(len(ports))
    result = []
    for i in range(num_port):
        l_i = random.randrange(len(l_ports))
        result.append(l_ports[l_i])
        l_services.pop(l_i)
    return result

def get_random_string():
    stringLength = random.randrange(5, 15)
    letters = string.ascii_lowercase
    return ''.join(random.choice(letters) for _ in range(stringLength))

def show_progress(n):

    print "|" + ("".join("." for _ in range(n))) + ("".join(" " for _ in range(99 - n))) + "|", "\r" if n < 100 else "\n",


start_time = time.time()
postgres_insert_query = """ INSERT INTO test (port, name) VALUES (%s::jsonb, %s)"""
current_count = 0.0
while current_count < count:

    record_to_insert = (
        json.dumps({"services": get_random_services()}),
        get_random_name()
    )

    try:
        cursor.execute(postgres_insert_query, record_to_insert)
        connection.commit()
        current_count = current_count + 1
        show_progress(int((current_count / count) * 100))
    except Exception as err:
        print(err)
        connection.rollback()

connection.close()

print(str(time.time() - start_time))

MDB:

import uuid
import random
import string
import json
import time
import ldap
from ldap import modlist

connection = ldap.initialize('ldapi:///')
connection.simple_bind_s('cn=admin,dc=local', 'doc')

count = 1

ports = [80, 143, 3389, 22, 21, 8080, 443, 289, 636]

def get_random_ports():
    l_ports = list(ports)
    num_service = random.randrange(len(ports))
    result = []
    for i in range(num_port):
        l_i = random.randrange(len(l_ports))
        result.append(l_ports[l_i])
        l_services.pop(l_i)
    return result

def get_random_name():
    stringLength = random.randrange(5, 15)
    letters = string.ascii_lowercase
    return ''.join(random.choice(letters) for _ in range(stringLength))

start_time = time.time()
session_id = bytes(str(uuid.uuid4()), 'utf-8')
while count > 0:

    try:

        name = bytes(get_random_hostname(), 'utf-8')

        entry = ldap.modlist.addModlist(
            {
                "name": name,
                "port": get_random_services(),
                "objectClass": bytes('tmp', 'utf-8')
            }
        )

        connection.add_s('name=' + name + ",dc=local", entry)

        count = count - 1

    except Exception as err:
        pass

print(str(time.time() - start_time))

После вставки 1М записей каждая. Я попробовал поиск по имени и портам. Не нужно было запускать несколько поисков, так как openldap не вернулся через 1 с. Если есть какая-то другая информация, необходимая. пожалуйста, дайте мне знать.

1 Ответ

1 голос
/ 19 января 2020

В течение нескольких лет я тестировал go на правильно настроенном / настроенном экземпляре OpenLDAP с базой данных 5 миллионов записей, производительность для back-mdb составляла примерно 61 000 операций чтения в секунду. И, безусловно, возможно получить гораздо более высокую производительность, чем эта, я пытался go для чего-то, что было бы особенно исчерпывающим.

https://mishikal.wordpress.com/2013/05/16/openldap-a-comparison-of-back-mdb-and-back-hdb-performance/

В общем, Похоже, вы взяли часть программного обеспечения, которую вы не знаете, как правильно использовать, и пришли к выводу. Лучшим подходом было бы узнать больше об основном программном обеспечении, которое вы интересуетесь тестированием, чтобы иметь возможность сделать точные выводы.

...