2012-03-30 9 views
8

में इनोडब और माईसाम के बीच प्रदर्शन अंतर मेरे पास 30 मिलियन से अधिक रिकॉर्ड वाले एक MySQL तालिका है जिसे मूल रूप से मायिसम के साथ संग्रहीत किया जा रहा था।माईस्क्ल

describe_table

मैं इस तालिका के खिलाफ निम्न क्वेरी जो आम तौर पर पूरा करने के लिए लगभग 30 सेकंड ले जाएगा चल पाएंगे: यहाँ तालिका का वर्णन है। डेटाबेस या डिस्क कैशिंग से बचने के लिए मैं प्रत्येक बार @Eid बदल दूंगा।

select count(fact_data.id) 
    from fact_data 
    where [email protected] 
     and fact_data.metric_id=1 

मैं तो किसी अन्य परिवर्तन और बाद में एक ही क्वेरी अब एक दूसरे हर बार मैं क्वेरी चलाने के नीचे में देता किए बिना InnoDB के लिए इस तालिका में बदल दिया। यहां तक ​​कि जब मैं यादृच्छिक रूप से कैशिंग से बचने के लिए @eid सेट करता हूं, तो क्वेरी एक सेकंड के भीतर आती है।

मैं दो स्टोरेज प्रकारों के बीच मतभेदों का शोध कर रहा हूं ताकि प्रदर्शन में नाटकीय सुधार की व्याख्या करने की कोशिश की जा सके लेकिन कुछ भी नहीं आ सकी। असल में, मैंने जो कुछ पढ़ा है, वह इंगित करता है कि माईसाम तेजी से होना चाहिए।

मेरे द्वारा चलाए जा रहे प्रश्न स्थानीय डेटाबेस के खिलाफ हैं, परीक्षण के समय डेटाबेस को मारने वाली कोई अन्य प्रक्रिया नहीं है।

उत्तर

15

यह आश्चर्यजनक रूप से बड़ा प्रदर्शन अंतर है, लेकिन मैं कुछ चीजों के बारे में सोच सकता हूं जो योगदान दे सकते हैं।

मायिसैम ऐतिहासिक रूप से इनो डीबी की तुलना में तेज़ी से देखा गया है, लेकिन इनो डीबी के हाल के संस्करणों के लिए, यह बहुत से मामलों के उपयोग के लिए बहुत सही है। MyISAM आमतौर पर केवल पढ़ने योग्य तालिकाओं के तालिका स्कैन के लिए तेज़ है। अधिकांश अन्य उपयोग मामलों में, मैं आमतौर पर इनो डीबी को तेज़ी से ढूंढता हूं। अक्सर कई बार तेजी से। MySQL के अधिकांश उपयोग में टेबल लॉक माईसाम के लिए मौत की घंटी है।

MyISAM उसके प्रमुख बफर में अनुक्रमित संचित करता है। शायद आपने अपनी कुछ बड़ी तालिका के लिए इंडेक्स को कैश करने के लिए कुंजी बफर को बहुत छोटा सेट किया है।

MyISAM ओएस डिस्क कैश में .MYD फ़ाइलों से तालिका डेटा कैश करने के लिए ओएस पर निर्भर करता है। यदि ओएस मेमोरी पर कम चल रहा है, तो यह डिस्क कैश डंप करना शुरू कर देगा। यह डिस्क से पढ़ने को रखने के लिए मजबूर कर सकता है।

InnoDB इंडेक्स और डेटा दोनों को अपने मेमोरी बफर में कैश करता है। यदि आप innodb_flush_method को O_DIRECT पर सेट करते हैं, तो आप ओएस को अपने डिस्क कैश का उपयोग न करने के लिए कह सकते हैं, हालांकि यह ओएस एक्स पर समर्थित नहीं है।

InnoDB आमतौर पर 16kb पृष्ठों में डेटा और अनुक्रमणिका को बफर करता है। प्रश्नों के बीच @Eid के मान को कैसे बदल रहे हैं, इस पर निर्भर करता है कि पिछली क्वेरी से डिस्क पढ़ने के कारण यह पहले से ही एक क्वेरी के लिए डेटा कैश कर चुका है।

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

आप MySQL की एक अपेक्षाकृत आधुनिक संस्करण का उपयोग कर रहे हैं, तो क्वेरी चलाने से पहले निम्नलिखित कमांड चलाएँ:

सेट रूपरेखा = 1;

इससे आपके सत्र के लिए क्वेरी प्रोफाइलिंग चालू हो जाएगी। क्वेरी चलाने के बाद,

प्रोफ़ाइल दिखाएं;

इससे आपको उन प्रश्नों की सूची दिखाई देगी, जिनके लिए प्रोफ़ाइल उपलब्ध हैं। मुझे लगता है कि यह डिफ़ॉल्ट रूप से अंतिम 20 रखता है। मान लें कि आपकी क्वेरी पहली थी, रन:

क्वेरी 1 के लिए प्रोफ़ाइल दिखाएं;

फिर आप अपनी क्वेरी चलाने में प्रत्येक चरण की अवधि देखेंगे। यह निर्धारित करने के लिए बेहद उपयोगी है कि (उदाहरण के लिए, टेबल लॉक, सॉर्टिंग, टेम्पलेट टेबल इत्यादि बनाना) एक क्वेरी को धीमा कर रहा है।

6

मेरा पहला संदेह यह होगा कि मूल माईसाम तालिका और/या इंडेक्स समय के साथ खंडित हो गए जिसके परिणामस्वरूप प्रदर्शन धीरे-धीरे घट रहा था। InnoDB तालिका में एक ही समस्या नहीं होगी क्योंकि आपने इसे पहले से मौजूद सभी डेटा के साथ बनाया है (इसलिए यह सभी डिस्क पर अनुक्रमिक रूप से संग्रहीत किया जाएगा)।

आप MyISAM तालिका का पुनर्निर्माण करके इस सिद्धांत का परीक्षण कर सकते हैं।

ALTER TABLE mytable ENGINE = MyISAM; 

तो अगर यह बेहतर है यह देखने के लिए प्रदर्शन की जांच: यह करने के लिए सबसे आसान तरीका है एक "नल" का उपयोग टेबल बयान बदलने के लिए किया जाएगा।

एक और संभावना यह होगी कि डेटाबेस खुद ही माईसैम के बजाय इनो डीबी प्रदर्शन के लिए ट्यून किया गया हो। उदाहरण के लिए, InnoDB innodb_buffer_pool_size parameter का उपयोग करता है पता करने के लिए कितनी स्मृति स्मृति में संग्रहित डेटा और सूचियों को संग्रहीत करने के लिए आवंटित किया जाना चाहिए। लेकिन MyISAM key_buffer पैरामीटर का उपयोग करता है। यदि आपके डेटाबेस में एक बड़ा innodb बफर पूल और एक छोटा कुंजी बफर है, तो InnoDB प्रदर्शन MyISAM प्रदर्शन से बेहतर होगा, खासकर बड़ी टेबल के लिए।

+0

एक नई माईसैम तालिका बनाने और उस तालिका के विरुद्ध क्वेरी का समय देने का एक उचित-सरल परीक्षण इस अनुमान की पुष्टि कर सकता है। –

1

आपकी अनुक्रमणिका परिभाषाएं क्या हैं, ऐसे तरीके हैं जिनमें आप माईसाम के लिए इंडेक्स बना सकते हैं जिसमें आपके सूचकांक फ़ील्ड का उपयोग नहीं किया जाएगा जब आप सोचेंगे कि वे करेंगे।