主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

MongoDB VS. MySQL(with PyMongo or MySQL Connector)

                
 MongoDBのパフォーマンスとやらがアピール通りに優れているのか気になったので、MongoDBとMySQLのパフォーマンス比較をそれぞれの公式Pythonドライバを通じてやってみた。条件としてはVMに入れたLinux Mintで、MongoDBもMySQLもインストール直後のデフォルト状態で走らせた。
VirtualBox, CPU 1core, Memory 2GB
Linux Mint MATE Debian(64bit)
MongoDB 2.6.5, PyMongo 2.7.2
MySQL 5.5.33-1, MySQL Connector 2.0.2
Python 3.4.2

 レコードを1件ずつ10000回の書き込みと、そこからクエリによる100件のレコード取得を4パターンで行う。Pythonのfor文にて繰り返しを処理しているので、結果はそのあたりの経過時間も含まれたものになっている。
 レコードは本を想定した。タイトル、著者名、ISBN13を想定した長さ13のランダム文字列、発刊日(datetime)、評価(intで0-5)をカラムとして持つ。

 MongoDBへの書き込みは以下のように。
for book in books:
book_collection.insert(book)

 MySQLへは以下。なおテーブルはInnoDBで作成してある。
add_book = ("INSERT INTO books "
"(title, author, isbn_dummy, publishedDate, rate) "
"VALUES (%(title)s, %(author)s, %(isbn_dummy)s, %(publishedDate)s, %(rate)s)")
for book in books:
cursor.execute(add_book, book)
cnx.commit()


 MongoDBへのクエリとデータ取得。
c = book_collection.find({"author":"Albert Camus"}).sort("rate").skip(1000).limit(100)
camus = [x for x in c]
c = book_collection.find({"author":"Dostoevsky"}).sort("publishedDate").skip(1000).limit(100)
dostoevsky = [x for x in c]
c = book_collection.find({"author":"Herman Hesse", "rate":3}).sort("publishedDate").skip(0).limit(100)
hesse = [x for x in c]
c = book_collection.find({"author":{"$in":["Thomas Man", "William Golding"]}}).sort("publishedDate").skip(0).limit(100)
man_and_w = [x for x in c]

 MySQLへのクエリとデータ取得。
q = "SELECT * FROM books WHERE author = 'Albert Camus' ORDER BY rate LIMIT 100 OFFSET 1000"
cursor.execute(q)
camus = [x for x in cursor]
q = "SELECT * FROM books WHERE author = 'Dostoevsky' ORDER BY publishedDate LIMIT 100 OFFSET 1000"
cursor.execute(q)
dostoevsky = [x for x in cursor]
q = "SELECT * FROM books WHERE author = 'Herman Hesse' AND rate = 3 ORDER BY publishedDate LIMIT 100 OFFSET 0"
cursor.execute(q)
hesse = [x for x in cursor]
q = "SELECT * FROM books WHERE author IN ('Thomas Man', 'William Golding') ORDER BY publishedDate LIMIT 100 Ocursor.execute(q)
man_and_w = [x for x in cursor]


結果
1411091928136.jpg
 データの書き込みではMongoDBが5倍強ほど速かった。一方でクエリによるデータ取得ではMySQLのほうがすぐれていたが、1.3倍程度といったところか。
 ちょっと適当にやった試験なので真面目に結果を捉えるのもアレだが考えてみる。データ書き込みが取得に比べて極端に少ないケースなら、今回の結果からMySQLを使ったほうがいいだろう。一方でそこそこ書き込みが多いケースではMongoDBを使ったほうがよさそう。データストア選定のためにデータの書き込み命令と取得命令の比率と消費時間の関係(insert / select -- cost)を図にしたいが、クエリが適当だったのであまり意味をなさなそう。

 もうちょい環境が整えられればMongoDBをスケールさせたときの効果も試してみたい。使用したコードは改良してのちのち使うかもしれないのでzip化してまとめた。
to use
> python compare.py

PyMongo: http://api.mongodb.org/python/current/index.html
MySQL Connector: http://dev.mysql.com/doc/connector-python/en/index.html
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。