2011-08-18 16 views
6

हाय मेरे पास क्वेरी गति की जांच के लिए 7 मिलीयन रिकॉर्ड डीबी तालिका है।सीमा और मिलियन रिकॉर्ड के साथ QUERY गति

SELECT * 
FROM  table 
LIMIT  20, 50; 

क्वेरी 2 - -

SELECT * 
FROM  table 
LIMIT  6000000, 6000030; 

क्वेरी कार्यकारी बार

क्वेरी 1:

मैं अपने 2 प्रश्नों जो विभिन्न सीमा parametres के साथ एक ही क्वेरी हैं अप का परीक्षण किया

  1. क्वेरी 1 - 0.006 सेकंड
  2. क्वेरी 2 - 5.500 सेकंड

इन प्रश्नों के दोनों में, मैं रिकॉर्ड की एक ही नंबर प्राप्त करने में कठिनाई रहा हूँ, लेकिन दूसरे मामले में यह और अधिक समय ले रहा है। क्या कोई इसके पीछे कारण बता सकता है?

+0

क्या आपके पास कोई अनुक्रमण है? क्या आपके पास प्राथमिक कुंजी है? यदि आपके पास कोई नहीं है तो यह मुझे समझ में आता है। –

+0

@amir अगर दोनों प्रश्नों के लिए कोई अनुक्रमण नहीं है तो वह एक ही परीक्षण नहीं होना चाहिए? या अगर मैं इंडेक्स दूसरी क्वेरी डालता हूं तो पहली क्वेरी का एक ही समय लगेगा? – sbaaaang

+0

यदि आपके पास कोई अनुक्रमणिका नहीं है तो मुझे नहीं लगता कि MySQL पहले 6000000 पंक्तियों को छोड़ सकता है। पंक्तियों को छोड़ने के लिए आपके पास कम से कम कुछ प्राथमिक अनुक्रमणिका होनी चाहिए। शायद कोई और इसकी पुष्टि कर सकता है? हम इसका परीक्षण भी कर सकते थे। –

उत्तर

8

इसे में भी बारीकी से देख के बिना, मेरी धारणा यह तब होता है कि क्योंकि पहली क्वेरी केवल 50 वीं रिकॉर्ड करने के लिए पढ़ने के लिए परिणाम लौटाने के लिए है, जबकि दूसरा क्वेरी लौटने परिणाम से पहले छह लाख को पढ़ने के लिए नहीं है। असल में, पहली क्वेरी सिर्फ तेज हो जाती है।

मुझे लगता है कि इस तालिका के मेकअप के साथ क्या करना एक अविश्वसनीय राशि है कि - फ़ील्ड प्रकार और चाबी, आदि

एक रिकार्ड (जैसे CHAR बनाम VARCHAR निश्चित लंबाई क्षेत्रों से बना है तो), तो डीबीएमएस सिर्फ गणना कर सकता है कि एनएचटी रिकॉर्ड कहां शुरू होता है और वहां कूदता है। यदि इसकी परिवर्तनीय लंबाई है, तो आपको यह निर्धारित करने के लिए रिकॉर्ड पढ़ना होगा कि nth रिकॉर्ड कहां से शुरू होता है। इसी प्रकार, मैं आगे यह मानता हूं कि उचित प्राथमिक कुंजी वाली सारणी ऐसी कुंजी के बिना उन लोगों की तुलना में क्वेरी होगी।

+0

जो मैं निश्चित रूप से सोचता हूं :(और मुझे लगता है कि उस अधिकार के लिए कोई समाधान नहीं है? बस पूछताछ कैशिंग :( – sbaaaang

+1

@user मैं अपने सिर के ऊपर से एक समाधान के बारे में नहीं सोच सकता। केवल एक चीज जिसे मैं सोच सकता हूं - और यह एक ** कुल हैक ** है - रिकॉर्ड के निर्माण को चिह्नित करने के लिए डेटाटाइम फ़ील्ड जोड़ना होगा, फिर उस फ़ील्ड पर एक इंडेक्स जोड़ें, और उसके बाद क्वेरी में उस फ़ील्ड को सॉर्ट करें। मैंने इसका परीक्षण नहीं किया है, लेकिन आप ** उस कुंजी के आधार पर सीमित करने के लिए डेटाबेस को ट्रिक करने में सक्षम हो सकते हैं, जो क्वेरी चलाने में सक्षम हो सकता है ओ (1) समय में, लेकिन मैं उस पर भरोसा नहीं करता हूं। साथ ही, यह आपके ऊपर ऊपर की कोई क्वेरी नहीं है, क्योंकि डिफ़ॉल्ट सॉर्ट ऑर्डर स्पेक द्वारा अपरिभाषित है - आप spec के बजाय एक आम सम्मेलन अनुकरण करेंगे; YMMV। – AgentConundrum

+0

हैक के लिए धन्यवाद मैं smethings कोशिश करेंगे वैसे भी मैं सिर्फ अंतर पूछ रहा था बेहतर कैसे mysql प्रक्रिया db आंकड़ों को समझने;) – sbaaaang

6

मैं मंदी सच है कि आप ऑफसेट के साथ सीमा का उपयोग कर रहे हैं और अनुक्रमण के लिए कोई अतिरिक्त संदर्भ तालिका में जानना चाहते हैं से जुड़ा हुआ है लगता है। यह संभव है कि पहला तेज हो क्योंकि यह ऑफसेट को जल्दी से प्राप्त कर सकता है।

+1

कुछ Googling जब तक यह करने के लिए ऑफसेट हो जाता है कि mysql प्रत्येक पंक्ति में गिना जाता है पता चलता है .. इसलिए अनुमान लगा यह सिर्फ समय लेता है xxxxx offest 20 वीं पंक्ति की तुलना करने के लिए मिलता है। –

+0

यह सच इंडेक्सिंग है, लेकिन गति की समस्या नहीं है, मैं केवल अंतर के बारे में पूछ रहा था;) – sbaaaang

4

यह 50 पंक्तियों और 6000030 पंक्तियों लौटने (या ~ 1million पंक्तियों के बाद आपने कहा था केवल 7million पंक्तियों वहाँ थे) के बीच अंतर है।

दो तर्क के साथ, पहले तर्क पहली पंक्ति की भरपाई वापस जाने के लिए, निर्दिष्ट करता है और दूसरा निर्दिष्ट करता पंक्तियों की अधिकतम संख्या वापस जाने के लिए। प्रारंभिक पंक्ति के ऑफसेट 0 (नहीं 1) है:

चुनें * tbl LIMIT में 5,10 से; # पंक्तियों 6-15

http://dev.mysql.com/doc/refman/5.0/en/select.html

पुन: प्राप्त करें इसके अलावा, मुझे लगता है कि आप 30 पंक्ति पृष्ठों तो आपके प्रश्नों सीमा खंड में दूसरा पैरामीटर के रूप में 30 का उपयोग करना चाहिए के लिए देख रहे हैं।

SELECT * 
FROM  table 
LIMIT  20, 30; 

SELECT * 
FROM  table 
LIMIT  6000000, 30; 
+0

2 परम एक योगदान कारक है क्योंकि क्वेरी वास्तव में कई और अधिक पंक्तियों लौटने हो सकता है .. मैं इसके उचित लगता है सब पर कहने के लिए यह एक जवाब प्रदान नहीं करता है न .. उसके जवाब है कि एक अरबपति पंक्तियों को लौटने में अधिक समय लगता है .. और शायद यह आंशिक रूप से सही है। –

+0

ठीक है ... तो उस श्रेणी में रिकॉर्ड भी पार्स किए गए हैं या छोड़ दिए गए हैं? मुझे लगता है कि उन्हें पार्स किया गया है या तो अंतर नहीं होगा, जबकि अंतर मौजूद है, है ना? – sbaaaang

+0

ऑफ़सेट पंक्ति गणना की तुलना में कम है। \t मैं downvote के लिए – dotjoe

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