2010-01-08 16 views
6

मेरे कुछ यूनिट परीक्षणों में टेबल बनाने के लिए केवल mysql के लिए 10-15 सेकंड लगते हैं। यह अनावश्यक रूप से लंबा लगता है। इसे लगभग 50 टेबल बनाना है, लेकिन यह प्रति सेकंड केवल 3 टेबल है। यूनिट परीक्षणों को ओवर-एंड-ओवर चलाने पर यह एक बड़ी परेशानी है।Django में MySQL तालिका निर्माण के लिए गति बढ़ाएं?

एक कामकाज के रूप में, मैं sqlite3 में अपने यूनिट परीक्षण चला रहा हूं। यह तेजी से चमक रहा है, लेकिन मैं अपने परीक्षणों को MySQL पर चलाने के लिए पसंद करूंगा क्योंकि यह मेरे लाइव सर्वर चलाता है।

गति अंतर को चित्रित करने के लिए, एक नई परियोजना बनाएं। फिर mysql का उपयोग कर सिंकडब चलाएं। फिर sqlite3 का उपयोग करके इसे आज़माएं।

[~/testproject] ./manage.py syncdb 
Creating table auth_permission 
Creating table auth_group 
Creating table auth_user 
Creating table auth_message 
Creating table django_content_type 
Creating table django_session 
Creating table django_site 

मेरे लिए, MySQL में उपरोक्त तालिकाओं को बनाने में लगभग 2 सेकंड लगते हैं। Sqlite3 लगभग तुरंत है।

मैं अपनी विकास मशीन पर mysql चला रहा हूं। यहां मेरा my.cnf है।

कृपया सुझाव दें कि आप किसी भी सुझाव या tweaks के बारे में सोच सकते हैं जो MySQL के तालिका निर्माण समय को तेज करने में मदद कर सकता है।

+0

क्या आपकी MySQL तालिका स्थानीय या दूरस्थ है? – Martin

+0

यह मेरे मैक पर स्थानीय है। यदि आप चाहें तो मेरा my.cnf देखें: http://pastebin.com/m69af8ba3 – Gattster

+1

"मैं अपने परीक्षणों को MySQL पर चलाने के लिए पसंद करूंगा" क्यों? आप Django ओआरएम परत पर भरोसा नहीं करते? –

उत्तर

1

मैंने पाया कि एक स्थानापन्न के रूप SQLite का उपयोग कर मेरी इकाई परीक्षण करता है बहुत तेजी से है। मैं दक्षिण डीडी को भी हटा रहा हूं, क्योंकि इससे टेबल निर्माण भी धीमा हो जाता है।

if len(sys.argv) > 1 and sys.argv[1] == 'test': 
    DATABASES = { 
     'default': { 
      'ENGINE': 'django.db.backends.sqlite3', 
      'NAME': ':memory', 
      'USER': '', 
      'PASSWORD': '', 
      'HOST': '', 
      'PORT': '', 
     } 
    } 
    INSTALLED_APPS = tuple([x for x in INSTALLED_APPS if x != 'south']) 
+0

यह एक हैक की तरह है, और उन्नत डेटाबेस सामग्री करते समय अप्रत्याशित परिणाम उत्पन्न कर सकता है (दूसरे शब्दों में, आपका परीक्षण एसक्लाइट के तहत गुजर सकता है जब यह mysql के अंतर्गत विफल होगा)। यही बात है, जब आप अपने उत्पादन सर्वर के लिए mysql की आवश्यकता होती है तो परीक्षण परीक्षण पर जाने के लिए यह एक अच्छा समाधान है। –

3

आप रैम-डिस्क बना सकते हैं और बस यूनिट परीक्षण के लिए डीबी को स्थानांतरित कर सकते हैं। यदि आप इसके लिए स्क्रिप्ट लिखते हैं तो यह स्वचालित और बहुत सुविधाजनक है।

इसके अलावा, अन्य प्रयोजनों के लिए मैंने कस्टम टेस्ट रनर लिखा है जो एसबीएल डंप से इसे बनाने और फिर टेबल बनाने के बजाय डीबी लोड करता है।

आप चुनते हैं।

+0

मैंने कभी भी राम डिस्क पर mysql नहीं चला है, लेकिन मुझे लगता है कि यह एक अलग बंदरगाह पर एक नया mysql डिमन स्थापित करने के रूप में सरल है, और अपने डेटा डीआईआर को रैम पर इंगित करता है डिस्क। सुझावों के लिए धन्यवाद। – Gattster

+0

हां, आप अपने मौजूदा mysql इंस्टेंस के लिए कॉन्फ़िगरेशन (रैम डिस्क पर इशारा करते हुए डीबी पथ के साथ) को भी स्विच कर सकते हैं और फिर इसे पुनरारंभ कर सकते हैं - जो भी आपके लिए बेहतर काम करता है। –

+0

क्या आपने वास्तव में एक राम डिस्क पर mysql चलाया है और एक गति सुधार देखा है? ऐसा लगता है जैसे यह मदद करेगा लेकिन जब तक आप इसका परीक्षण नहीं करेंगे तब तक आप वास्तव में नहीं जानते। – Gattster

0

मुझे धीमी INNODB तालिका निर्माण गति (13 छोटी टेबल बनाने के लिए लगभग 25 सेकंड) का सामना करना पड़ रहा है।

मैंने my.cnf फ़ाइल के [mysqld] अनुभाग में विकल्पों के साथ प्रयोग किया।

जोड़ना:

innodb_flush_method=fdatasync 

उत्पादित सबसे अच्छा परिणाम (लगभग 1.5 सेकंड में ही 13 छोटे टेबल बनाने के लिए)।

0

पर मैक OSX केवल, के लिए निम्न जोड़ने के अपने ~/.my.cnf:

[mysqld] 
skip-sync-frm=ON 

मेरे लिए, यह स्टार्टअप 7s को 1m30s से MySQL पर मेरे Django टेस्ट स्वीट के समय में सुधार! यहाँ

विवरण: http://www.stereoplex.com/blog/speeding-up-django-unit-test-runs-with-mysql

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