2011-09-21 7 views
7

मैंने कुछ महीने पहले मोंगोडब की खोज की, और post पढ़ने के बाद, मैंने सोचा कि मोंगोडब mysql से वास्तव में तेज़ था, इसलिए मैंने अपनी खुद की बेंच बनाने का फैसला किया, समस्या यह है कि मेरे पास उपरोक्त पोस्ट के लेखक की तुलना में एक ही परिणाम नहीं है, विशेष रूप से डेटाबेस को quering करने के लिए: 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 पर हैं आप इसमें कुछ गलत है मेरी अजगर कोड के लिए एक नज़र मिल सकता है, हो सकता है।

    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:
    • दोनों MySQL और MongoDB 'कुंजी' कॉलम अनुक्रमित

    MySQL तालिका है 5.1.41

  • MongoDB: 1.8 .3
  • पायथन: 2.6.5
  • pymongo: 2.0.1
  • लिनक्स: उबंटू 2.6.32 32bits पीएई साथ
  • हार्डवेयर: डेस्कटॉप कोर i7 2.93 GHz

परिणाम (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

एक के लिए, मोंगोडीबी को 64 बिट आर्किटेक्चर पसंद है। मैं किसी ऐसे व्यक्ति द्वारा चलाए गए बेंचमार्क में ज्यादा स्टॉक नहीं डालूंगा जो बेंचमार्क किए जाने वाले सिस्टमों में से एक के साथ बहुत अनुभवी नहीं है। – 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 डिस्क को राम में सभी डेटा और उसके बाद समय-समय पर फ्लश डेटा सम्मिलित बहुत तेजी से MongoDB की वजह से सम्मिलित करता है।

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

आप MongoDB जब तुम embedd/अपने डेटा denormalize जाएगा के साथ सबसे अच्छा प्रदर्शन प्राप्त कर सकते हैं। कई स्थितियों में mongodb हमें एम्बेडिंग/denormalization की वजह से शामिल होने से बचने की अनुमति देता है।

और जब तुम सिर्फ एक संग्रह/तालिका में डेटा डालने और वापस सूचकांक द्वारा पढ़ने के लिए तेजी से होना चाहिए नहीं MongoDB, पढ़ने की गति ~ ही अगर एसक्यूएल डाटाबेस के साथ तुलना किया जाना चाहिए।

Btw: MongoDB 2.0 indexes 25% तेजी में, तो मैं अनुमान 2.0 तो mysql तेजी से काम करेंगे।

+6

आवेषण तेजी से हैं क्योंकि यह MySQL करता है जो नहीं करता है। सुरक्षित = सच्चे आवेषण थोड़ा धीमे होते हैं (बिट आमतौर पर अभी भी MySQL से तेज़ होते हैं) और प्रतिकृति लिखते हैं या fsync लिखते हैं धीमे हैं। प्वाइंट होने के नाते, इन तरह की तुलना संदिग्ध हैं। वे जंगली रूप से अलग चीजें करते हैं। –

+0

मैं आपसे सहमत हूं, लेकिन मैं तुलना नहीं कर रहा हूं, मैंने अभी कहा है कि क्यों उनके बेंचमार्क मोंगोडब में तेजी से। डिफ़ॉल्ट रूप से सुरक्षित = गलत के कारण और इसका मतलब प्रति मिनट फ्लश पर है। –

27

श्वास। मानक के इन प्रकार, और मैं इस मामले में शिथिल शब्द का उपयोग, आम तौर पर बहुत शुरू से ही टूट। MySQL MongoDB की तुलना में "धीमा" डेटाबेस नहीं है। एक एक रिलेशनल डेटाबेस है, दूसरा एक नोएसक्यूएल दस्तावेज़ स्टोर है। वे कार्यात्मक क्षेत्रों में तेजी से/होना चाहिए जिन्हें वे कवर करने के लिए डिजाइन किए गए थे। MySQL (या किसी भी आरडीबीएमएस) और मोंगोडीबी के मामले में यह ओवरलैप इतना बड़ा नहीं है जितना कि बहुत से लोग मानते हैं। यह रेडिस बनाम मोंगोडीबी चर्चाओं के साथ मिलते-जुलते टूटे सेब और संतरे की तुलना है।

इतने सारे चर (एप्लिकेशन कार्यात्मक जरूरतों, हार्डवेयर संसाधनों, संगामिति, विन्यास, क्षमता, आदि) पर विचार करने के हैं कि किसी भी बेंचमार्क या लेख है कि के साथ "MongoDB MySQL की तुलना में तेजी है" या ठीक इसके विपरीत परिणाम सामान्यीकरण है समाप्त होता है बेकारपन का मुद्दा।

यदि आप बेंचमार्क करना चाहते हैं तो पहले कार्यात्मक आवश्यकताओं और व्यावसायिक नियमों का एक सख्त सेट परिभाषित करें और फिर उन्हें दृढ़ता समाधान दोनों पर यथासंभव कुशलता से कार्यान्वित करें। नतीजा यह होगा कि एक दूसरे की तुलना में तेज़ है और लगभग सभी मामलों में तेजी से दृष्टिकोण में कुछ प्रासंगिक डाउनसाइड्स हैं जो धीमे समाधान को आवश्यकताओं के आधार पर और अधिक व्यवहार्य बना सकते हैं।

यह सब अनदेखा कर रहा है कि उपरोक्त बेंचमार्क किसी भी वास्तविक दुनिया परिदृश्य का अनुकरण नहीं करता है। किसी भी तरह के थ्रेडिंग/समरूपता के बिना अधिकतम थ्रूपुट आवेषण करने वाले बहुत से ऐप्स नहीं होंगे (जो अधिकतर स्टोरेज समाधानों पर प्रदर्शन को प्रभावित करते हैं)।

अंत में, इस तरह के आवेषण की तुलना करना थोड़ा टूटा हुआ है। MongoDB आग के साथ अद्भुत सम्मिलित थ्रूपुट प्राप्त कर सकते हैं और थोक आवेषण भूल सकते हैं या fsynced, प्रतिकृति लिखने के साथ धीमी गति के आदेश हो सकता है। यहां बात यह है कि मोंगोडीबी आपको एक विकल्प प्रदान करता है जहां MySQL नहीं है (या कम)। तो यहाँ तुलना केवल व्यापार की आवश्यकताओं को समझने आग के लिए अनुमति देने और भूल जाओ प्रकार लिखते हैं (जो करने के लिए नीचे उबाल, "मुझे आशा है यह काम करता है, लेकिन कोई biggy अगर उसने ऐसा नहीं किया")

टी एल; डॉ सरल कर रोक थ्रूपुट बेंचमार्क। वे लगभग हमेशा बेकार हैं।

+2

+1 एक उत्कृष्ट उत्तर के लिए, मैं सिर्फ यह जोड़ना चाहता था कि MySQL स्टोरेज इंजनों की पर्याप्तता प्रदान करता है - उनमें से एक TokuDB है जो उत्कृष्ट डालने की गति प्राप्त करने के लिए फ्रैक्टल पेड़ों का उपयोग करता है। –

+1

पूर्ण प्रकटीकरण के हित में मैं यहां जोड़ना चाहता हूं कि मैं एक विशाल मोंगोडीबी प्रशंसक हूं। लेकिन यह सबकुछ के लिए जादू डेटाबेस बुलेट नहीं है, न ही 10gen का दावा है। –

+1

मैं पूरी तरह से आपसे सहमत हूं, हालांकि यह आमतौर पर ज्ञान की कमी है जो सॉफ़्टवेयर के एक निश्चित टुकड़े की लोकप्रियता निर्धारित करता है। एक पढ़ता है कि मोंगोडीबी [क्यूपीएस की सम्मिलित संख्या] [मोंगोडीबी से पूरी तरह से कार्यात्मक रूप से असंबंधित कुछ डालने] से अधिक है और अचानक इंटरनेट के "प्रदूषित वाई" से प्रदूषित है, जो वास्तविक कार्य अनुभव के बिना लोगों द्वारा बेंचमार्क किया गया है। सही नौकरी के लिए सही उपकरण किसी प्रोग्रामर का मंत्र होना चाहिए। –

2

पायथन निष्पादन समय को देखना और डेटाबेस की गुणवत्ता का अनुमान लगाना गलत है।

  • अनुरोध की तैयारी (क्लाइंट साइड),
  • अनुरोध निष्पादन (सर्वर),
  • प्रतिक्रिया की तैयारी (क्लाइंट साइड)

मेरे अनुभव डेटा द्वारा: प्रत्येक अनुरोध कम से कम 3 भागों से मिलकर बनता है MongoDB => पायथन के लिए कनवर्टन MySQL => पायथन के मुकाबले ज्यादा समय लगता है।

इसके अलावा आपको दोनों डेटाबेस में अनुक्रमणिका का उपयोग करना चाहिए। MongoDB केवल तभी अच्छा काम करता है यदि आपके पास फ़ील्ड पर इंडेक्स हैं जो आप क्वेरी के लिए उपयोग करते हैं। MySQL के बारे में बात करते हुए, मुझे लगता है कि innoDB पर प्रदर्शन का परीक्षण करना बेहतर है, MyISAM लेनदेन, विदेशी कुंजी, ट्रिगर का समर्थन नहीं करता है और मेरे लिए यह थोड़ा पुराना है।

+2

जैसा कि मैं अजगर का उपयोग करना चाहता हूं, मुझे डेटाबेस + पायथन की परवाह है, केवल डेटाबेस नहीं। – Eric

संबंधित मुद्दे