MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

mongodb 4x по-бавен от sqlite, 2x по-бавен от csv?

Клиентите на MongoDB се свързват към сървърите във фонов режим. Ако искате да сравните вмъкванията, по-точен тест би бил нещо подобно:

with pymongo.MongoClient() as client:
  client['warmup']['warmup'].insert_many(docs)
  db = client['test']
  coll = db['test']
  start = time()
  coll.insert_many(docs)
  end = time()

Имайте предвид, че insert_many извършва групово записване и има ограничения за размерите за групово записване, по-специално може да има само 1000 команди за групово записване. Ако изпращате 1 милион вмъквания, може да гледате на 2000 разделяния на групово записване, като всички те включват копия на данни. Тествайте вмъкването на 1000 документа наведнъж спрямо други размери на пакети.

Работен тест:



import csv
import sqlite3
import pymongo, random, time

N, M = 1000000, 5
docs = [{'_id':1,'b':2,'c':3,'d':4,'e':5}]*N
i=1
for i in range(len(docs)):
    docs[i]=dict(docs[i])
    docs[i]['_id'] = i
data=[tuple(doc.values())for doc in docs]

with open('test.csv', 'w', newline='') as file:
    writer = csv.writer(file, delimiter=',')
    start = time.time()
    for i in range(N):
        writer.writerow(data[i])
    end = time.time()
    print('%f' %( end-start))


con = sqlite3.connect('test.db')
con.execute('drop table if exists five')
con.execute('create table five(a, b, c, d, e)')
start = time.time()
con.executemany('insert into five(a, b, c, d, e) values (?,?,?,?,?)', data)


end = time.time()
print('%f' %( end-start))



with pymongo.MongoClient() as client:
  client['warmup']['warmup'].delete_many({})
  client['test']['test'].delete_many({})
  client['warmup']['warmup'].insert_many(docs)
  db = client['test']
  coll = db['test']
  start = time.time()
  coll.insert_many(docs)
  end = time.time()
print('%f' %( end-start))

Резултати:

risque% python3 test.py
0.001464
0.002031
0.022351

risque% python3 test.py
0.013875
0.019704
0.153323

risque% python3 test.py
0.147391
0.236540
1.631367

risque% python3 test.py
1.492073
2.063393
16.289790

MongoDB е около 8 пъти по-кратък от времето на sqlite.

Това очаквано ли е? Може би. Сравнението между sqlite и mongodb не разкрива много, освен че sqlite е значително по-бърз. Но, естествено, това се очаква, тъй като mongodb използва архитектура клиент/сървър, а sqlite е база данни в процес, което означава:

  • Клиентът трябва да сериализира данните, за да ги изпрати на сървъра
  • Сървърът трябва да десериализира тези данни
  • След това сървърът трябва да анализира заявката и да разбере какво да прави
  • Сървърът трябва да запише данните по мащабируем/едновременен начин (sqlite просто грешки с едновременни грешки при запис според това, което си спомням за него)
  • Сървърът трябва да състави отговор обратно към клиента, да сериализира този отговор, да го напише в мрежата
  • Клиентът трябва да прочете отговора, да го десериализира, да го провери за успех

В сравнение с какво - база данни в процес, която не прави нищо мрежов вход/изход?

Физическите извиквания за запис са малка част от това, което отива в съхранението на данни от модерна база данни.

Освен това нито един случай не включва милион от тях. Когато пишете във файл, записите се буферират от стандартната библиотека на python, преди дори да бъдат изпратени до ядрото - трябва да използвате flush() след всеки ред, за да създаде милион записвания. В база данни записите се извършват по подобен начин страница по страница, а не за отделни документи.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да използвате $unset и $set в комбинация в mongoDB

  2. Динамичен xml в mongoDB

  3. Пагинация на масива mongoDB

  4. Вземете данни от колекция b, която не е в колекция a в заявка за обвивка на MongoDB

  5. Геолокацията на Mongo, използваща $near и 2d индекс, не е точна