आपके आवेदन में मेरे जैसा ही प्रतीत होता है। मैंने समस्या को कुशलता से हल करने के लिए एक MySQL कस्टम स्टोरेज इंजन लिखा था। यह वर्णन किया गया है here
कल्पना कीजिए अपने डेटा 2M निश्चित लंबाई प्रविष्टियों (इकाई प्रति एक) से युक्त 3650 पंक्तियों 20 बाइट्स की (प्रतिदिन एक) (प्रतिदिन एक इकाई के लिए पंक्ति) की एक सरणी के रूप में डिस्क पर खर्च की गई थी ।
आपका पढ़ा पैटर्न एक इकाई को पढ़ता है। यह डिस्क पर संगत है इसलिए इसमें 1 खोज (लगभग 8mllisecs) लगता है और 3650x20 = लगभग 100 एमबी/सेकेंड पर 80 के बारे में पढ़ता है ... तो यह एक सेकंड के एक अंश में किया जाता है, आसानी से आपके 1-क्वेरी-प्रति-सेकेंड को पढ़ता है पैटर्न।
अद्यतन डिस्क पर 2 एम विभिन्न स्थानों में 20 बाइट्स लिखना है। सबसे सरल मामले में इसमें 2 एम लगेंगे, जिनमें से प्रत्येक में लगभग 8 मिलीलीक्स लगते हैं, इसलिए इसमें 2 एम * 8ms = 4.5 घंटे लगेंगे। यदि आप डेटा को 4 "RAID0" डिस्क में फैलाते हैं तो इसमें 1.125 घंटे लग सकते हैं।
हालांकि स्थान केवल 80K अलग हैं। जिसका मतलब है कि 16 एमबी ब्लॉक (सामान्य डिस्क कैश आकार) के भीतर 200 ऐसे स्थान हैं, इसलिए यह 200 गुना तेज गति से संचालित हो सकता है। (1 मिनट) वास्तविकता दोनों के बीच कहीं है।
मेरा स्टोरेज इंजन उस तरह के दर्शन पर काम करता है, हालांकि यह एक निश्चित लंबाई सरणी से थोड़ा अधिक सामान्य उद्देश्य है।
आप जो भी वर्णन किया है उसे ठीक से कोड कर सकते हैं। एक MySQL प्लगेबल भंडारण इंजन में कोड डालने का मतलब है कि आप विभिन्न रिपोर्ट जनरेटर आदि
वैसे साथ डेटा क्वेरी करने के लिए MySQL का उपयोग करें, आप संग्रहीत पंक्ति से तारीख और इकाई आईडी को समाप्त कर सकता कर सकते हैं (क्योंकि वे कर रहे हैं सरणी अनुक्रमणिका) और अद्वितीय आईडी हो सकती है - यदि आपको वास्तव में इसकी आवश्यकता नहीं है क्योंकि (इकाई आईडी, दिनांक) अद्वितीय है, और 2 मानों को 3-बाइट int के रूप में संग्रहीत करें। फिर आपकी संग्रहीत पंक्ति 6 बाइट्स है, और आपके पास 16 एम प्रति 700 अपडेट हैं और इसलिए एक तेज़ आवेषण और एक छोटी फ़ाइल है।
संपादित फ्लैट फ़ाइलें
से तुलना करें मुझे लगता है कि टिप्पणी सामान्य पक्ष फ्लैट फ़ाइलें नोटिस। यह न भूलें कि निर्देशिका केवल फाइल सिस्टम द्वारा लागू इंडेक्स हैं और इन्हें आमतौर पर अपेक्षाकृत बड़ी वस्तुओं की अपेक्षाकृत छोटी संख्या के लिए अनुकूलित किया जाता है। फ़ाइलों तक पहुंच आम तौर पर अनुकूलित होती है ताकि उम्मीद की जा सके कि अपेक्षाकृत छोटी संख्या में फाइलें खुली होंगी, और खुले और बंद होने के लिए अपेक्षाकृत उच्च ओवरहेड है, और प्रत्येक फ़ाइल जो खुली है। उन सभी "अपेक्षाकृत" डेटाबेस के सामान्य उपयोग के सापेक्ष हैं।
फ़ाइल सिस्टम नामों का उपयोग किसी इकाई-आईडी के लिए इंडेक्स के रूप में करना जो मैं एक गैर-स्पैस पूर्णांक 1 से 2 मिलियन होने के लिए काउंटर-अंतर्ज्ञानी हूं। एक प्रोग्रामिंग में आप एक सरणी का उपयोग करेंगे, न कि हैश-टेबल, उदाहरण के लिए, और आप अनिवार्य रूप से एक महंगी पहुंच पथ के लिए ओवरहेड का एक बड़ा सौदा करने जा रहे हैं जो कि केवल एक सरणी ऑपरेशन हो सकता है।
इसलिए यदि आप फ्लैट फाइलों का उपयोग करते हैं, तो क्यों न केवल एक फ्लैट फ़ाइल का उपयोग न करें और इसे अनुक्रमित करें? प्रदर्शन पर
संपादित
इस आवेदन के प्रदर्शन डिस्क से प्रभावित बार की तलाश जा रहा है। मैंने जो गणना की है, वह सर्वोत्तम है जो आप कर सकते हैं (हालांकि आप चयन को धीमा करके INSERT को तेज कर सकते हैं - आप उन्हें दोनों बेहतर नहीं बना सकते हैं)। इससे कोई फर्क नहीं पड़ता कि आप को छोड़कर डेटाबेस, फ्लैट-फाइल्स, या एक फ्लैट-फ़ाइल, का उपयोग करते हैं, जिससे आप अधिक खोज सकते हैं कि आपको वास्तव में आवश्यकता नहीं है और इसे और धीमा कर दें। उदाहरण के लिए, इंडेक्सिंग (चाहे वह फाइल सिस्टम इंडेक्स या डेटाबेस इंडेक्स) "एरे लुकअप" की तुलना में अतिरिक्त I/Os का कारण बनती है, और ये आपको धीमा कर देगी।
संपादित बेंचमार्क माप
पर मैं एक मेज है कि बहुत ज्यादा तुम्हारा (या लगभग ठीक आपके विभाजन में से एक की तरह) की तरह लग रहा है। यह 64K इकाइयां 2 एम (आपके 1/32 का) नहीं था, और 2788 'दिन' थीं। तालिका उसी आईएनएसईआरटी आदेश में बनाई गई थी कि आपका होगा, और उसी सूचकांक (entity_id, दिन) होगा। 2788 दिनों का निरीक्षण करने के लिए एक इकाई पर एक चयन में 20.3 सेकंड लगते हैं, जो प्रति सेकंड लगभग 130 खोजों की अपेक्षा करता है (8 मिलीसेक औसत खोज समय डिस्क पर)। चयन समय दिनों की संख्या के आनुपातिक होने जा रहा है, और संस्थाओं की संख्या पर अधिक निर्भर नहीं है। (यह तेजी से तलाशने वाले समय के साथ डिस्क पर तेज़ होगा। मैं RAID0 में SATA2s की एक जोड़ी का उपयोग कर रहा हूं लेकिन यह बहुत अंतर नहीं कर रहा है)।
तो आप फिर से आदेश से (एंटिटी, DAY) तो एक ही चयन 198 millisecs (क्योंकि यह एक एकल डिस्क उपयोग में आदेश इकाई पढ़ रही है) लेता इकाई आदेश ALTER तालिका एक्स आदेश में तालिका। हालांकि अल्टर टेबल ऑपरेशन को पूरा करने के लिए 13.98 दिन (182 एम पंक्तियों के लिए) लिया गया।
कुछ अन्य चीजें हैं जो माप आपको बताती हैं 1. आपकी अनुक्रमणिका फ़ाइल आपकी डेटा फ़ाइल जितनी बड़ी होगी। यह नमूना तालिका के लिए 3 जीबी है। इसका मतलब है (मेरे सिस्टम पर) डिस्क पर सभी इंडेक्स मेमोरी की गति नहीं है।
2. आपकी INSERT दर लॉगरिदमिक रूप से गिर जाएगी। डेटा फ़ाइल में INSERT रैखिक है लेकिन सूचकांक में कुंजी डालने लॉग है। 180 एम रिकॉर्ड में मुझे प्रति सेकंड 153 आईएनएसईआरटी मिल रहा था, जो कि खोज दर के बहुत करीब है। यह दिखाता है कि MySQL लगभग हर आईएनएसईआरटी के लिए एक पत्ता सूचकांक ब्लॉक अपडेट कर रहा है (जैसा कि आप उम्मीद करेंगे क्योंकि यह इकाई पर अनुक्रमित है लेकिन दिन के क्रम में डाला गया है।)। तो आप 2 एम पंक्तियों के अपने दैनिक सम्मिलन के लिए 2 एम/153 सेकंड = 3.6hrs देख रहे हैं। (सिस्टम या डिस्क में विभाजन द्वारा आप जो भी प्रभाव प्राप्त कर सकते हैं उससे विभाजित)।
लीप वर्षों के कारण दस साल की संभावना 3650 दिनों की संभावना नहीं है। – unwind
आप इसे कैसे एक्सेस करेंगे? नेटवर्क से PHP से? स्थानीय मशीन पर सी ++ से ...? –
@unwind: अच्छा बिंदु। याद रखने के लिए सही संख्या 4 वर्षों में 1461 दिन है, जो सही होने के करीब है। यह अभी भी सटीक नहीं है, लेकिन त्रुटि तब तक कोई फर्क नहीं पड़ता जब तक कि आपको 100 साल का डेटा न मिल जाए। –