MongoDB не так быстрее, чем MySQL? - PullRequest
       3

MongoDB не так быстрее, чем MySQL?

8 голосов
/ 21 сентября 2011

Я обнаружил mongodb несколько месяцев назад, и после прочтения этого поста я подумал, что mongodb действительно быстрее, чем mysql, поэтому я решил собрать свой собственный стенд, проблема в том, что у меня нет такого результат, чем автор предыдущего поста, особенно для запросов к базе данных: mongodb, кажется, медленнее, чем таблицы MyISAM. Не могли бы вы взглянуть на мой код на Python, возможно, в этом что-то не так:

from datetime import datetime
import random
import MySQLdb
import pymongo

mysql_db=MySQLdb.connect(user="me",passwd="mypasswd",db="test_kv")
c=mysql_db.cursor()

connection = pymongo.Connection()
mongo_db = connection.test
kvtab = mongo_db.kvtab

nb=1000000
thelist=[]
for i in xrange(nb):
    thelist.append((str(random.random()),str(random.random())))
t1=datetime.now()

for k,v in thelist:
    c.execute("INSERT INTO key_val_tab (k,v) VALUES ('" + k + "','" + v + "')")

dt=datetime.now() - t1
print 'MySQL insert elapse :',dt

t1=datetime.now()
for i in xrange(nb):
    c.execute("select * FROM key_val_tab WHERE k='" + random.choice(thelist)[0] + "'")
    result=c.fetchone()

dt=datetime.now() - t1
print 'MySQL select elapse :',dt


t1=datetime.now()

for k,v in thelist:
    kvtab.insert({"key":k,"value":v})

dt=datetime.now() - t1
print 'Mongodb insert elapse :',dt
kvtab.ensure_index('key')
t1=datetime.now()
for i in xrange(nb):
    result=kvtab.find_one({"key":random.choice(thelist)[0]})

dt=datetime.now() - t1
print 'Mongodb select elapse :',dt

Примечания:

  • MySQL и mongodb находятся на locahost.
  • MySQL и mongodb имеют индексированный столбец 'key'

MySQL Table:

CREATE TABLE IF NOT EXISTS `key_val_tab` (
  `k` varchar(24) NOT NULL,
  `v` varchar(24) NOT NULL,
  KEY `kindex` (`k`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Версии:

  • MySQL: 5.1.41
  • mongodb: 1.8.3
  • питон: 2.6.5
  • Пимонго: 2.0.1
  • Linux: Ubuntu 2.6.32 32 бит с PAE
  • Аппаратное обеспечение: Desktop Core i7 2,93 ГГц

Результаты (для 1 миллиона вставок / выборок):

MySQL insert elapse : 0:02:52.143803
MySQL select elapse : 0:04:43.675914
Mongodb insert elapse : 0:00:49.038416  -> mongodb much faster for insert
Mongodb select elapse : 0:05:10.409025  -> ...but slower for quering (thought was the opposite)

Ответы [ 3 ]

28 голосов
/ 21 сентября 2011

Вздох.Такого рода тесты, и в данном случае я использую термин «свободно», как правило, ломаются с самого начала.MySQL не является «более медленной» базой данных, чем MongoDB.Одна - это реляционная база данных, другая - хранилище документов NoSQL.Они будут / должны быть быстрее в тех функциональных областях, для которых они предназначены.В случае MySQL (или любой СУБД) и MongoDB это перекрытие не так велико, как полагают многие.Это то же самое сравнение битых яблок и апельсинов, которое вы получаете в обсуждениях Redis и MongoDB.

Существует так много переменных (функциональные требования приложения, аппаратные ресурсы, параллелизм, конфигурация, масштабируемость и т. Д.), Которые следует учитывать, чтолюбой тест или статья, которая заканчивается на «MongoDB быстрее MySQL» или наоборот, обобщает результаты до степени бесполезности.

Если вы хотите сделать тест, сначала определите строгий набор функциональных требований и бизнес-правил изатем примените их как можно эффективнее к обоим постоянным решениям.Результатом будет то, что один будет быстрее другого, и почти во всех случаях более быстрый подход имеет некоторые существенные недостатки, которые могут все же сделать более медленное решение более жизнеспособным в зависимости от требований.

Все это игнорирует приведенный выше тестне моделирует сценарии реального мира.Не будет много приложений, выполняющих вставки с максимальной пропускной способностью без какого-либо многопоточности / параллелизма (что существенно влияет на производительность большинства решений хранения).

Наконец, сравнение таких вставок также немного нарушено.MongoDB может достигать невероятной пропускной способности вставки с огнем и забывать массовые вставки или может быть на порядки медленнее с fsynced, реплицированными записями.Дело в том, что MongoDB предлагает вам выбор, а MySQL нет (или меньше).Так что здесь сравнение имеет смысл только с учетом того, что бизнес-требования позволяют запускать и забывать типизированные записи (которые сводятся к «Я надеюсь, что это работает, но не так сложно, если бы не»)делать простые тесты пропускной способности.Они почти всегда бесполезны.

7 голосов
/ 21 сентября 2011
MySQL insert elapse : 0:02:52.143803
Mongodb insert elapse : 0:00:49.038416  -> mongodb much faster for insert

Mongodb вставляет намного быстрее, потому что mongodb вставляет все данные в оперативную память, а затем периодически сбрасывает данные на диск.

MySQL select elapse : 0:04:43.675914
Mongodb select elapse : 0:05:10.409025  -> ...but slower for quering (thought was

Вы можете достичь максимальной производительности с помощью mongodb, когда будете встраивать / денормализовать свои данные. Во многих ситуациях mongodb позволяет нам избегать объединений из-за встраивания / денормализации.

И когда вы просто вставляете данные в одну коллекцию / таблицу и считываете по индексу mongodb, который не должен быть быстрее, скорость чтения должна быть примерно такой же, если сравнивать с базой данных sql.

Кстати: в mongodb 2.0 индексы 25% быстрее, поэтому я думаю, 2.0 будет работать быстрее, чем mysql.

2 голосов
/ 21 сентября 2011

Неправильно смотреть на время выполнения Python и оценивать качество базы данных.Каждый запрос состоит как минимум из 3 частей:

  • подготовка запроса (на стороне клиента),
  • выполнение запроса (на сервере),
  • подготовка ответа (на стороне клиента)

По моему опыту преобразование данных для MongoDB => python занимает гораздо больше времени, чем для MySQL => python.

Также вам следует использовать индексы в обеих базах данных.MongoDB работает хорошо, только если у вас есть индексы для полей, которые вы используете для запросов.Говоря о MySQL, я думаю, что лучше тестировать производительность на innoDB, MyISAM не поддерживает транзакции, внешние ключи, триггеры и, на мой взгляд, немного устарела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...