2011-09-21 18 views
7

私は数ヶ月前にmongodbを発見しました。このpostを読んだ後、私はmongodbがmysqlよりも本当に速いと思ったので、私は自分のベンチを作ることにしました。問題は私が上記投稿者と同じ結果を持っていない、 mongodbはMyISAMテーブルよりも遅いようです。MongoDBはMySQLより速くはありませんか?

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上にある、あなたが私のPythonコードに見てもらえ、その中に何か問題があるかもしれません。
  • MySQLとMongoDBの両方が 'キー' 列には、

MySQLの表を索引付けた:

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
  • python:2.6.5
  • pymongo:2.0.1
  • のLinux:デスクトップコアI7(100万挿入/選択のため)2.93 GHzの

結果:

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) 
PAE
  • ハードウェアとのUbuntu 2.6.32 32ビット
  • +3

    MongoDBは、64ビットアーキテクチャが好きです。私は、ベンチマークの対象となるシステムの1つに熟練していない人が、ベンチマークを実行しても、多くの株式を置くことはしません。 – ceejayoz

    +0

    だから私はいくつかの助けを頼んだ! – Eric

    +9

    @ceejayozあなたがそれを速くするために非常に経験する必要があるなら、それはほとんどのユーザーのために遅くなります。私は経験の浅いユーザーによって作成されたベンチマークが有用であるかもしれないと言っています... –

    答えて

    6
    MySQL insert elapse : 0:02:52.143803 
    Mongodb insert elapse : 0:00:49.038416 -> mongodb much faster for insert 
    

    mongodbはすべてのデータをRAMに挿入してから、データをディスクに定期的にフラッシュするため、はるかに高速に挿入できます。

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

    データを埋め込み/非正規化するときにmongodbを使用すると、最高のパフォーマンスが得られます。多くの状況では、mongodbは埋め込み/非正規化のために結合を避けることができます。

    1つのコレクション/テーブルにデータを挿入するだけで、索引mongodbで読み込み速度が速くないと読んだ場合、sqlデータベースと比較すると読み込み速度は同じにする必要があります。

    BTW:mongodb 2.0 indexes 25%高速ですので、2.0より速くmysqlを動作させると思います。

    +6

    の挿入は、MySQLが行うことを行わないためより高速です。 safe = trueインサートは少し遅く(一般的にMySQLよりも少しビットが速い)、複製された書き込みまたはfsync書き込みはまだ遅いです。ポイントは、これらのような比較は疑わしいです。彼らは激しく異なることをする。 –

    +0

    私はあなたに同意するが、私は比較していない、私はちょうど彼のベンチマークmongodb速い理由を言った。デフォルトではsafe = falseであり、1分あたりの平均回数を意味します。 –

    27

    Sigh。この種のベンチマークでは、この場合はゆるやかにこの用語を使用しますが、通常は最初から崩壊します。 MySQLはMongoDBよりも「遅い」データベースではありません。 1つはリレーショナルデータベースであり、もう1つはNoSQLドキュメントストアです。それらは、カバーするように設計された機能領域においてより速くなるはずである。 MySQL(または任意のRDBMS)とMongoDBの場合、このオーバーラップは多くの人が想定しているほど大きくはありません。これはRedisとMongoDBの議論で得られた同じ種類の壊れたリンゴとオレンジの比較です。

    「MongoDBはMySQLより高速です」またはその逆のベンチマークまたは記事が結果を一般化していると考えるほど多くの変数(アプリケーション機能要件、ハードウェアリソース、並行性、構成、スケーラビリティなど)があります。無駄な点。

    ベンチマークを実行する場合は、最初に、機能要件とビジネスルールの厳密なセットを定義し、両方の永続ソリューションでそれらをできるだけ効率的に実装します。その結果、一方が他方よりも速くなり、ほぼすべての場合において、より速いアプローチには、依然として要件に応じてより遅いソリューションをより実行可能にするいくつかの関連する短所があります。

    上記のベンチマークは実際のシナリオをシミュレートしていないことをすべて無視しています。スレッド処理や並行処理(大部分のストレージソリューションのパフォーマンスに著しく影響する)なしで、最大スループットの挿入を行うアプリはたくさんありません。

    最後に、このような挿入物を比較することはやや壊れています。 MongoDBは、火災で驚くほどのインサートスループットを達成し、バルクインサートを忘れるか、またはfsyncedでレプリケートされた書き込みでは、さらに遅くなります。ここでのことは、MongoDBはMySQLがどこに(ないしはそれほど)ないかを選択できることです。だからここで比較は、ビジネス要件が火災を許可し、タイプ書き込みを忘れていることを意味するだけです(「うまくいけばいいけど、うまくいけば大丈夫」)

    TL;スループットのベンチマーク。彼らはほとんどいつも役に立たない。

    +2

    +1すばらしい答えですが、私は、MySQLが膨大なストレージエンジンを提供していることを追加したかっただけです。その1つは、優れた挿入速度を実現するためにフラクタルツリーを使用するTokuDBです。 –

    +1

    完全な開示のために、私は巨大なMongoDBファンだとここで付け加えたいと思います。しかし、それはすべてのための魔法のデータベースの弾丸ではなく、10genもそうであると主張していません。 –

    +1

    私はあなたに完全に同意しますが、通常、特定のソフトウェアの人気を決定するのは知識の欠如です。 MongoDBは[MongoDBと完全に機能的に無関係なものを挿入する]よりも[QPSの数を挿入する]と、実際の仕事経験のない人がベンチマークした "XはYより優れている"適切な職場のための適切なツールは、プログラマーの志望者でなければなりません。 –

    2

    Pythonの実行時間を見てデータベースの品質を評価するのは間違いです。各要求は、少なくとも3つの部分で構成されています:準備

    • 準備要求(クライアント側)、
    • リクエストの実行(サーバー)、
    • レスポンス(クライアント側)

    を私の経験データにより、 convert for MongoDB => pythonはMySQL => pythonよりもはるかに時間がかかります。

    また、両方のデータベースでインデックスを使用する必要があります。 MongoDBは、クエリに使用するフィールドにインデックスがある場合にのみ有効です。 MySQLについて言えば、innoDBのパフォーマンスをテストするほうが良いと思います.MyISAMはトランザクション、外部キー、トリガーをサポートしていません。私にとっては少し古くなっています。

    +2

    私はPythonを使いたいので、私はdatabase + pythonを気にします。データベースではありません。 – Eric

    関連する問題