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

スポンサーサイト

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

MongoDB VS. MySQL(with PyMongo or MySQL Connector)の続き

                
前回:http://elicon.blog57.fc2.com/blog-entry-406.html

 前回MongoDBとMySQLを自分の与えたコンディションで比較してみた。データの挿入はMongoDBのほうがすぐれていて、データのクエリと引き出しはMySQLのほうがすぐれているという結果だった。ここで終わってはどっち使えばいいのという疑問に一歩踏み込めていなくて引っかかるので、ケーススタディとして前回に与えたコンディションではどっちを使うのがいいかをもう少し検討してみる。ただあくまでケーススタディとしてやっているだけなので、値は概算を使ったりする。

 書き込み一件当たりの消費時間と、一件当たりのクエリと引き出しの消費時間を出してみる。
 書き込みは前回で10000件連続書き込みをやっているのでそこから算出。
MongoDB: 3.58[s]→一件あたり0.358[ms]
MySQL: 18.6[s]→一件あたり1.86[ms]
 続いてクエリと引き出し。
MongoDBでは以下のように。
t = time.time()
i = book_collection.find_one({"author":"Albert Camus"}, sort=[("rate",pymongo.ASCENDING)], skip=1000)
print("SELECT: " + str(time.time() - t))
assert(not i is None)

t = time.time()
i = book_collection.find_one({"author":"Dostoevsky"}, sort=[("publishedDate", pymongo.ASCENDING)], skip=1000)
print("SELECT: " + str(time.time() - t))
assert(not i is None)

t = time.time()
i = book_collection.find_one({"author":"Herman Hesse", "rate":3}, sort=[("publishedDate", pymongo.ASCENDING)])
print("SELECT: " + str(time.time() - t))
assert(not i is None)

t = time.time()
i = book_collection.find_one({"author":{"$in":["Thomas Man", "William Golding"]}}, sort=[("publishedDate", pymongo.ASCENDING)])
print("SELECT: " + str(time.time() - t))
assert(not i is None)

 MySQLでは以下のように。
t = time.time()
cursor.execute("SELECT * FROM books WHERE author = 'Albert Camus' ORDER BY rate LIMIT 1 OFFSET 1000")
i = cursor.fetchone()
print(time.time() - t)
assert(not i is None)

t = time.time()
cursor.execute("SELECT * FROM books WHERE author = 'Dostoevsky' ORDER BY publishedDate LIMIT 1 OFFSET 1000")
i = cursor.fetchone()
print(time.time() - t)
assert(not i is None)

t = time.time()
cursor.execute("SELECT * FROM books WHERE author = 'Herman Hesse' AND rate = 3 ORDER BY publishedDate LIMIT 1 OFFSET 0")
i = cursor.fetchone()
print(time.time() - t)
assert(not i is None)

t = time.time()
cursor.execute("SELECT * FROM books WHERE author IN ('Thomas Man', 'William Golding') ORDER BY publishedDate LIMIT 1 OFFSET 1000")
i = cursor.fetchone()
print(time.time() - t)
assert(not i is None)

 引き出しの結果は以下。
1411111652098.jpg
 平均から大きく外れそうなデータははぶく。その上で最大値と最低値の平均をデータとして使うことにする。MySQLのパフォーマンスに大きく優位性が出ている。ここらはキャッシュ未設定で行っていたので、もしかしたらどちらもまだパフォーマンスを伸ばせるかもしれない。

MongoDB: 17[ms]
MySQL: 0.45[ms]

 以上で検討に必要なデータはそろえられた。データの書き込みと読み込みの比と処理時間の関係をMongoDBとMySQLのそれぞれでグラフ化する。

 上記のグラフから、書き込み回数が読み込みの回数の10倍を超えるとMySQLの処理時間がMongoDBを上回って増えているのがわかる。一方で10倍以下ではMySQLのほうがパフォーマンスがよかった。ここらはキャッシュ未設定で行っていたので、もしかしたらどちらもパフォーマンスを伸ばせるかもしれない。



 今回はMongoDBとMySQLのパフォーマンス比較をしたかったので、それぞれのデータストアをデフォルト状態で走らせ、少し適当な条件設定をして比較を行った。その条件下では書き込みを読み込みの10倍以上の頻度で行うならMongoDBを、そうでないならMySQLを使うといいということがわかった。
 しかし実際の状況となればそれぞれのデータストアを設定なしにデフォルトで使うことはないと思うし、クエリからデータを引き出すのも一件だけでなく複数件引き出すことも多々あり、今回の状況と違う。データストアへの命令も書き込みと読み込みだけではなく、更新や削除を含め多々ある。そういうことを考えていくと、目的を最高の効率で果たしてくれるデータストアを選ぶのは複雑で難しいと痛感する。
            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

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

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