समान स्कीमा / क्वेरी के लिए MySQL और PostgreSQL के बीच प्रदर्शन अंतर [बंद]


20

मैं एक नौसिखिया डीबीए हूं, और मुझे Microsoft SQL सर्वर में अनुभव है लेकिन मैं FLOSS पर कूदना चाहता हूं।

मैं एक कंपनी शुरू कर रहा हूं, और हम एक पोस्टग्रैड बैकएंड के साथ एक ऐप (PHP) विकसित करते हैं, और हमने कुछ परीक्षण MySQL के साथ भी किए। हम मानते हैं कि MySQL PostgreSQL से दोगुना तेज़ है।

मैंने एक ठोस प्रदर्शन परीक्षण किया:

  • समतुल्य स्तंभ डेटाटाइप्स के साथ तालिका में समान कॉलम।
  • पंक्तियों की एक ही संख्या।
  • दोनों में समान अनुक्रमित (प्राथमिक कुंजी शामिल)।
  • सीपीयू लोड बेकार है और पोस्टग्रेज मशीन काफी बेहतर है।
  • और वही क्वेरी (स्पष्ट रूप से)।

मैं क्या गलत कर रहा हूं?

पुनश्च: मैंने डेटाबेस इंजनों के प्रदर्शन ट्यूनिंग पर कई "हाउट्सोस" पढ़े।
PS (2): हम MySQL डेटाबेस पर InnoDB (प्रति तालिका एक फ़ाइल) का उपयोग कर रहे हैं।


हाय मैट!

मैंने तीन सामान्य चयन (और सबसे कठिन) प्रश्न किए।

डिस्क के बारे में सवाल, निश्चित रूप से यह समान नहीं है; पोस्टग्रैज में यह एक एसएसडी (लगभग तीन बार सबसे तेज) है।

MySQL कैश डेटा:

+------------------------------+----------------------+
| Variable_name                | Value                |
+------------------------------+----------------------+
| binlog_cache_size            | 32768                |
| have_query_cache             | YES                  |
| key_cache_age_threshold      | 300                  |
| key_cache_block_size         | 1024                 |
| key_cache_division_limit     | 100                  |
| max_binlog_cache_size        | 18446744073709547520 |
| query_cache_limit            | 1048576              |
| query_cache_min_res_unit     | 4096                 |
| query_cache_size             | 16777216             |
| query_cache_type             | ON                   |
| query_cache_wlock_invalidate | OFF                  |
| table_definition_cache       | 256                  |
| table_open_cache             | 64                   |
| thread_cache_size            | 8                    |
+------------------------------+----------------------+

मुझे नहीं पता कि PostgreSQL में इसे कैसे देखना है।

अग्रिम में धन्यवाद।


मेरी अंग्रेजी के लिए क्षमा करें
जेवियर वालेंसिया

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

1
क्या आप क्वेरी और पोस्टग्रेज निष्पादन योजना का उपयोग करके पोस्ट कर सकते हैं explain analyze। यह पढ़ने में आसान बनाने के लिए, आप करने के लिए योजना अपलोड कर सकते explain.depesz.com
a_horse_with_no_name

1
यदि Postgres एक SSD पर चल रहा है, तो आपको लगभग निश्चित रूप से ट्यून करना होगाpostgresql.conf
a_horse_with_no_name

1
@JavierValencia: यदि आप समस्या को ठीक करने में सक्षम थे, तो कृपया एक वर्णन जोड़ें कि आपने क्या किया ताकि दूसरों को इससे सीख मिल सके। इस प्रश्न को हल करने के लिए आप अपना स्वयं का उत्तर भी स्वीकार कर सकते हैं
a_horse_with_no_name

जवाबों:


41

MySQL और PostgreSQL काफी भिन्न प्रदर्शन-वार हैं। InnoDB और PostgreSQL टेबल विभिन्न प्रकार के प्रश्नों के लिए अनुकूलित हैं। इन अंतरों को समझना यह समझना महत्वपूर्ण है कि दोनों में से अच्छा प्रदर्शन कैसे प्राप्त करें।

एक उदाहरण के रूप में, आइए सबसे स्पष्ट अंतर देखें।

PostgreSQL बनाम MySQL / InnoDB टेबल संरचना और प्रदर्शन के लिए इसका क्या अर्थ है

सामान्य तौर पर, जटिल काम-भार पर, PostgreSQL तेजी से होगा, लेकिन सरल प्राथमिक कुंजी लुकअप पर MySQL InnoDB के साथ तेजी से होगा।

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

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

InnoDB एक अलग दृष्टिकोण का उपयोग करता है। InnoDB के साथ, तालिका एक बी-ट्री इंडेक्स है जिसमें वास्तविक डेटा इंडेक्स पेलोड है। इसका मतलब यह है कि एक प्राथमिक कुंजी लुकअप पहले से ही पत्ता पृष्ठ से डेटा खींचने के लिए हो जाता है, और इसके लिए कम यादृच्छिक डिस्क I / O आवश्यक है। एक ही समय में, एक इंडेक्स स्कैन के लिए एक के बजाय दो इंडेक्स का पता लगाने की आवश्यकता होती है, जिसका अर्थ है कि प्राथमिक कुंजी के अलावा किसी भी इंडेक्स का उपयोग धीमा होना और अनुक्रमिक स्कैन अभी भी धीमा है।

PostgreSQL में निदान प्राप्त करना

मुझे लगता है कि आप कुछ का उपयोग करना चाहते हैं:

 EXPLAIN (analyse, buffers, verbose)
 [query];

यह आपको क्वेरी प्लान, प्रारंभिक अनुमान, वास्तविक समय, बफर उपयोग, और बहुत कुछ देगा।



@ क्रिसट्रावर्स एक महान जवाब के लिए धन्यवाद! आपने कहा: "... (InnoDB के) अनुक्रमिक स्कैन धीमे हैं"। क्या आप pls बता सकते हैं कि इस संदर्भ में अनुक्रमिक स्कैन से आपका क्या मतलब है?
वीबी_

धन्यवाद। मैं जवाब को संशोधित करूंगा। InnoDB में "अनुक्रमिक" स्कैन इंडेक्स-लॉजिकल ऑर्डर में हैं इसलिए आपके पास अधिक यादृच्छिक I / O है और रीड-फॉरवर्ड कोचिंग से कोई मदद नहीं मिलती है।
क्रिस ट्रैवर्स

अच्छे उत्तर के लिए धन्यवाद। पोस्टग्रेज के आंतरिक के बारे में उत्सुक किसी के लिए, मैं इस पोस्ट की सलाह देता हूं: interdb.jp/pg/pgsql01.html बताएं कि कैसे पोस्टग्रास डेटा को हीप टेबल के रूप में संग्रहीत करता है।
22
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.