2009-04-12 16 views
6
साथ पेजिंग

300,000 रिकॉर्ड की तरह साथ एक विशाल mysql तालिका है और पेज करना चाहता था इस तरह से एक प्रश्न के साथ PHP में रिकॉर्ड (नहीं यहां मुद्दा यह है, हालांकि):MySQL बड़ी मेज प्रदर्शन के मुद्दों जब पीएचपी

SELECT * FROM `table` LIMIT 250000, 100 

यह रिकॉर्ड के बाद के हिस्से में काफी धीमा हो सकता है, खासकर जब तालिका के अंत के पास (LIMIT बहुत बड़ा शुरू होता है)। मेरा अनुमान है कि परिणाम को स्कूप करने से पहले MySQL को बिल्कुल 250000 तक नीचे गिनना होगा?

तो पेजिंग के लिए इस या किसी अन्य दृष्टिकोण के आसपास कैसे काम करना है जो बहुत तेज हो सकता है? धन्यवाद!

उत्तर

4

सुनिश्चित करें कि आप एक अनुक्रमणिका का उपयोग कर रहे हैं अन्यथा यह एक पूर्ण तालिका स्कैन कर रहा है। आप इसे सत्यापित करने के लिए निष्पादन योजना देख सकते हैं या ORDER BY खंड (अनुक्रमित कॉलम पर) का उपयोग कर समस्या को मजबूर कर सकते हैं। यहां more information है।

आपकी तालिका 300k पंक्तियों पर बड़ी नहीं है। हालांकि तालिका के पास होने के साथ प्रदर्शन के मुद्दे हैं। इसके लिए एकमात्र असली समाधान नकली खंड को नकली करना है। एक ऑटो वृद्धि क्षेत्र है जो पंक्तियों को 1 से 300,000 तक करता है और फिर करता है:

SELECT * 
FROM mytable 
WHERE field BETWEEN 250000 and 250100 

या इसी तरह के। यदि आप पंक्तियों को अक्सर हटा रहे हैं तो यह समस्याग्रस्त या असंभव हो सकता है लेकिन मुझे लगता है कि पुराना डेटा कम हो जाता है ताकि आप पहले 100,000 पंक्तियों के लिए LIMIT और उस से परे सरोगेट पेजिंग कॉलम का उपयोग करके कुछ हद तक इसे अनुकूलित कर सकें।

0

क्या यह वास्तव में पूरी क्वेरी है, या आपके पास क्लॉज द्वारा ऑर्डर भी है? क्योंकि इससे गंभीर रूप से प्रश्नों को धीमा कर दिया जाएगा। अगर आपको ऑर्डर करने वाले चीजों के पूर्ण सेट पर इंडेक्स मिल सकता है, तो मदद करनी चाहिए।

+0

एक टिप्पणी, नहीं एक जवाब के रूप में इस तरह के पदों सबमिट करें। यह एक जवाब नहीं है। – Will

1

आप सही हैं: MySQL को आपके इच्छित लोगों को पढ़ने से पहले 250000 बेकार पंक्तियों को स्कैन करना होगा। वास्तव में इस तरह के रूप में एक हैक कई लोगों में एक मेज बांटने या होने को बचाने के लिए इस के लिए कोई समाधान नहीं है:

SELECT * FROM table WHERE id BETWEEN 250000 AND 250000 + 100 - 1 
;or 
SELECT * FROM table WHERE id > 250000 ORDER BY id ASC LIMIT 100 

लेकिन यह अभी भी सही ढंग से जटिल प्रश्न पर LIMIT ऑपरेटर के समारोह का अनुकरण नहीं करता है। यह एक गति है: कार्यक्षमता अवसर लागत।

0

आप एक autoincrement क्षेत्र है, तो आप सिर्फ कर सकता है:

SELECT * FROM table 
WHERE ID > @LastID 
ORDER BY ID 
LIMIT 100 
+0

मान लें कि डेटा कभी नहीं हटाया गया है, यानी। – ceejayoz

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