एक डेटाबेस में कितनी पंक्तियाँ TOO MANY हैं?


87

मैंने 1,000,000 रिकॉर्ड के साथ एक MySQL InnoDB तालिका बनाई है। क्या यह बहुत ज्यादा है? या डेटाबेस इसे और अधिक संभाल सकते हैं? मैं पूछता हूं क्योंकि मैंने देखा कि कुछ क्वेरी (उदाहरण के लिए, एक तालिका से अंतिम पंक्ति प्राप्त करना) 100 में से एक के साथ 1 मिलीयन पंक्तियों के साथ तालिका में धीमी (सेकंड) हैं।

जवाबों:


114

मेरे पास 1000000 रजिस्टरों के साथ एक MySQL InnoDB टेबल है। क्या यह बहुत ज्यादा है?

नहीं, 1,000,000 पंक्तियाँ (AKA रिकॉर्ड) एक डेटाबेस के लिए बहुत अधिक नहीं हैं।

मैं पूछता हूं क्योंकि मैंने देखा कि कुछ प्रश्न (उदाहरण के लिए, तालिका का अंतिम रजिस्टर प्राप्त करना) 100 में से 1 मिलियन रजिस्टर के साथ तालिका में धीमी (सेकंड) हैं।

उस कथन में बहुत कुछ है। सामान्य संदिग्ध हैं:

  1. खराब लिखित प्रश्न
  2. एक प्राथमिक कुंजी का उपयोग नहीं करते हुए, यह मानते हुए कि एक भी मेज पर मौजूद है
  3. खराब रूप से डिज़ाइन किया गया डेटा मॉडल (तालिका संरचना)
  4. अनुक्रमणिका का अभाव

4
5. आउटडेटेड सर्वर चश्मा <अंतिम उपाय।
डरपोक

19
@Brimstedt: मैं भी हमेशा यही लगता संज्ञा "सूचकांकों" होना चाहिए, लेकिन मैं डेटाबेस के लिए इसे प्रयोग नहीं लगता कि मैं कभी देखा किसी को भी: विकिपीडिया से: en.wikipedia.org/w/... श्री के लिए कोडिंग डरावना: codinghorror। com / ब्लॉग / अभिलेखागार / 000638.html । इस विषय पर दिलचस्प एसओ पोस्ट है: stackoverflow.com/questions/1001366
डैनियल वेसलो

7
6. मासूम के विभिन्न कैश के लिए पर्याप्त मेमोरी आवंटित नहीं की गई
जेसन

बेहतर प्रदर्शन के लिए कि क्या मुझे PrimaryKey का उपयोग करना चाहिए? इंडेक्स, यूनीक जैसी अन्य कुंजियों का उपयोग करने के बारे में क्या? क्या मैं इनका उपयोग कर सकता हूँ? धन्यवाद
user1844933

हो सकता है कि जेसन ने कहा कि कंप्यूटर को मेमोरी से
जोड़ा जाता है

67

मेरे पास 97,000,000 से अधिक रिकॉर्ड ( 30GB डेटाफाइल ) के साथ एक डेटाबेस है , और कोई समस्या नहीं है।

बस अपने टेबल इंडेक्स को परिभाषित करने और सुधारने के लिए याद रखें ।

तो यह स्पष्ट है कि 1,000,000 MANY नहीं है! (लेकिन अगर आप इंडेक्स नहीं करते हैं, हाँ, यह बहुत है)


10
क्या एक कॉलम में "प्राथमिक कुंजी" जोड़ना (ऑटो वेतन वृद्धि का चयन करके) अनुक्रमण किया जाएगा?
नाथन

8
@ नथन, वास्तव में जब आप एक कॉलम को एक प्राथमिक कुंजी के रूप में निर्दिष्ट करते हैं, तो यह स्वचालित रूप से अनुक्रमित हो जाता है, लेकिन प्रत्येक तालिका में केवल एक प्राथमिक कुंजी हो सकती है, यदि आपको कुछ स्तंभों के लिए अनुक्रमणिका जोड़ने की आवश्यकता है, तो प्रश्नों का अनुकूलन करने के लिए इस stackoverflow.com/ का
डीएवी

मेरे पास एक ट्रिलियन के साथ तालिका है लेकिन LIFO प्रारूप डेटा में चयन धीमा है?
सौरभ चंद्र पटेल

समस्याओं को परिभाषित न करना। सबसे जटिल क्वेरी में कितना समय लगता है? हमारे पास 100 मिलियन पंक्तियों वाली एक तालिका है और एक ग्राहक 5 सेकंड में अधिकतम किए जाने वाले प्रश्नों की अपेक्षा करता है, चाहे वे किसी भी ग्रुपिंग या ऑर्डर करने वाले मापदंड का उपयोग करें। हमारे सूचकांक में सुधार किया जा सकता है, लेकिन इससे पहले कि हम सब कुछ एक सूचकांक जोड़ने की कोशिश कर रहे हैं
जो याओचोची

उत्पादन तालिकाओं के 20% (एक पुराने अध्ययन के अनुसार) में 1M से अधिक पंक्तियाँ हैं। मैंने कई अरब पंक्तियों के साथ कुछ देखा है ।
रिक जेम्स

19

अपनी क्वेरी की जांच करने के लिए 'व्याख्या' का उपयोग करें और देखें कि क्या क्वेरी योजना में कुछ गड़बड़ है।


6
हालांकि यह एक अच्छा विचार है, यह उत्तर स्वयं एक नौसिखिया को देने के लिए अच्छा नहीं है।
EXPLAIN

17
प्रश्नों की जांच करने में आपकी मदद करने के लिए कोई अन्य उपकरण नहीं है, इसलिए बेहतर सीखना शुरू करें EXPLAIN- newbies या नहीं।
ओपन स्कूल

30
अच्छा होगा यदि कोई व्यक्ति EXPLAIN EXPLAIN ;)
जो ई।


15

मुझे लगता है कि यह एक आम गलतफहमी है - डेटाबेस स्केलेबिलिटी के अनुसार आकार समीकरण का केवल एक हिस्सा है। ऐसे अन्य मुद्दे हैं जो कठिन (या कठिन) हैं:

  • काम करने का सेट कितना बड़ा है (यानी मेमोरी में कितना डेटा लोड करना है और सक्रिय रूप से काम करना है)। यदि आप केवल डेटा डालते हैं और फिर इसके साथ कुछ नहीं करते हैं, तो यह वास्तव में हल करने के लिए एक आसान समस्या है।

  • समसामयिक स्तर की क्या आवश्यकता है? क्या केवल एक उपयोगकर्ता सम्मिलित / पढ़ रहा है, या क्या हमारे पास एक साथ कई हजारों ग्राहक हैं?

  • किस स्तर के वादे / स्थायित्व और प्रदर्शन की निरंतरता की आवश्यकता है? क्या हमें यह सुनिश्चित करना होगा कि हम प्रत्येक प्रतिबद्ध का सम्मान कर सकें। क्या यह ठीक है अगर औसत लेनदेन तेज है, या क्या हम यह सुनिश्चित करना चाहते हैं कि सभी लेनदेन मज़बूती से तेज़ हों (छह सिग्मा गुणवत्ता नियंत्रण जैसे - http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization- और छह-सिग्मा / )।

  • क्या आपको तालिका स्कीमा के रूप में किसी भी परिचालन मुद्दों को करने की आवश्यकता है? InnoDB में यह संभव है, लेकिन अविश्वसनीय रूप से धीमा है क्योंकि इसे अक्सर अग्रभूमि में एक अस्थायी तालिका (सभी कनेक्शनों को अवरुद्ध) करना पड़ता है।

इसलिए मैं यह बताने जा रहा हूं कि दो सीमित मुद्दे होंगे:

  • प्रश्न लिखने / अच्छे अनुक्रमित करने में आपका अपना कौशल है।
  • ALTER TABLE कथनों पर प्रतीक्षा करने पर आप कितना दर्द सहन कर सकते हैं।

2
संपादित करें: अस्थायी तालिका बनाने के बारे में सलाह थोड़ी सी तारीख है। MySQL 5.5 में एक तेज़ इंडेक्स है, और 5.6 में अब ऑनलाइन DDL है।
मॉर्गन Tocker

3

यदि आपके पास 1 मिलियन पंक्तियों का मतलब है, तो यह इस बात पर निर्भर करता है कि आपकी अनुक्रमण कैसे किया जाता है और आपके हार्डवेयर का कॉन्फ़िगरेशन। एक मिलियन पंक्तियाँ एंटरप्राइज़ डेटाबेस, या यहां तक ​​कि सभ्य उपकरणों पर एक देव डेटाबेस के लिए एक बड़ी राशि नहीं है।

यदि आप 1 मिलियन कॉलम (निश्चित रूप से MySQL में भी संभव नहीं है) का मतलब है, तो हाँ, यह थोड़ा बड़ा लगता है और शायद समस्याओं का कारण होगा।


3

रजिस्टर करें? क्या आपका मतलब रिकॉर्ड है?

एक मिलियन रिकॉर्ड इन दिनों डेटाबेस के लिए वास्तविक बड़ी बात नहीं है। यदि आप किसी भी समस्या में भाग लेते हैं, तो यह संभवतः डेटाबेस सिस्टम ही नहीं है, बल्कि हार्डवेयर जो आप इसे चला रहे हैं। इससे पहले कि आप इसे फेंकने के लिए हार्डवेयर से बाहर चलाने से पहले आप DB के साथ एक समस्या में नहीं जा रहे हैं, सबसे अधिक संभावना है।

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

संयोग से, तालिका में "अंतिम" रिकॉर्ड जैसी कोई चीज नहीं है, तार्किक दृष्टिकोण से उनके पास कोई अंतर्निहित आदेश नहीं है।


मेरा मतलब है कि "SELECT * FROM table ORDER BY id DESC LIMIT 0" जैसा कुछ है
जुआनजो कोंटी

4
हो सकता है कि आपको SELECT LAST_INSERT_ID()उस क्वेरी के बजाय आवश्यकता हो ।
ट्रू सॉफ्ट

3

मैंने गैर-विभाजित तालिकाओं को कई बिलियन (अनुक्रमित) रिकॉर्डों के साथ देखा है, जो कि विश्लेषणात्मक कार्यों के लिए स्वयं से जुड़ गए हैं। हमने अंततः इस बात को विभाजित कर दिया लेकिन ईमानदारी से हमने इतना अंतर नहीं देखा।

उस ने कहा, वह ओरेकल में था और मैंने MySQL में डेटा की मात्रा का परीक्षण नहीं किया है। अनुक्रमित आपके मित्र हैं :)


2

मान लें कि "रिकॉर्ड्स" का अर्थ "रजिस्टर" नहीं है, तो यह बहुत ज्यादा नहीं है, MySQL वास्तव में अच्छी तरह से मापता है और आपके हार्ड डिस्क में जितनी जगह है उतने रिकॉर्ड रख सकते हैं।

जाहिर है, हालांकि खोज क्वेरी धीमी होगी। वहाँ वास्तव में कोई रास्ता नहीं है कि यह सुनिश्चित करने के अलावा कि खेतों को ठीक से अनुक्रमित किया गया है।


2
तकनीकी रूप से, तालिका का आकार आपके द्वारा उपयोग किए जा रहे फ़ाइल सिस्टम के अधिकतम फ़ाइल आकार द्वारा भी सीमित किया जा सकता है।
tster

0

तालिका जितनी बड़ी हो जाती है (उसमें अधिक पंक्तियों के रूप में), धीमी क्वेरी आमतौर पर चलेंगी यदि कोई अनुक्रमणिका नहीं है। एक बार जब आप सही इंडेक्स जोड़ लेते हैं, तो आपके क्वेरी प्रदर्शन में सुधार होना चाहिए या कम से कम इतना कम नहीं होना चाहिए जितना टेबल बढ़ता है। हालाँकि, यदि क्वेरी स्वयं अधिक पंक्तियाँ लौटाती है क्योंकि तालिका बड़ी हो जाती है, तो आप फिर से गिरावट देखना शुरू कर देंगे।

जबकि 1M पंक्तियाँ उतनी नहीं हैं, यह इस बात पर भी निर्भर करता है कि आपके पास DB सर्वर पर कितनी मेमोरी है। यदि सर्वर द्वारा मेमोरी में कैश की जाने वाली तालिका बहुत बड़ी है, तो क्वेरीज़ धीमी हो जाएंगी।


0

डेटा को सॉर्ट करने के लिए सॉर्ट मर्ज विधि का उपयोग करने के कारण प्रदान की गई क्वेरी का उपयोग असाधारण रूप से धीमा होगा।

मैं डिजाइन को पुनर्विचार करने की सलाह दूंगा ताकि आप इसे पुनः प्राप्त करने के लिए अनुक्रमित का उपयोग कर रहे हैं या सुनिश्चित करें कि यह पहले से ही उस तरीके से ऑर्डर किया गया है ताकि कोई छंटाई की आवश्यकता न हो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.