मुझे पता है कि मैं काफी पुराने सवाल को फिर से जीवित कर रहा हूं, लेकिन मैं हाल ही में इस मुद्दे पर भाग गया, लेकिन कुछ ऐसी चीजों की जरूरत थी जो बड़ी संख्या में अच्छी हो । कोई भी मौजूदा प्रदर्शन डेटा नहीं था, और चूंकि इस सवाल पर बहुत अधिक ध्यान दिया गया था, मैंने सोचा कि मुझे जो मिला है वह पोस्ट करूँगा।
वास्तव में काम करने वाले समाधान एलेक्स बैरेट की डबल उप-क्वेरी /NOT IN विधि ( बिल कारविन के समान ), और क्वासोई कीLEFT JOIN विधि थी।
दुर्भाग्य से उपरोक्त दोनों विधियाँ बहुत बड़ी मध्यवर्ती अस्थायी सारणी बनाती हैं और प्रदर्शन जल्दी नष्ट हो जाते हैं क्योंकि रिकॉर्ड की संख्या को नष्ट नहीं किया जा रहा है।
एलेक्स बैरेट की डबल उप-क्वेरी (धन्यवाद!) का उपयोग <=करने पर मैंने जो तय किया, वह इसके बजाय उपयोग करता है NOT IN:
DELETE FROM `test_sandbox`
WHERE id <= (
SELECT id
FROM (
SELECT id
FROM `test_sandbox`
ORDER BY id DESC
LIMIT 1 OFFSET 42
) foo
)
यह एन वें रिकॉर्ड OFFSETकी आईडी प्राप्त करने के लिए उपयोग करता है और उस रिकॉर्ड और पिछले सभी रिकॉर्ड को हटा देता है।
चूंकि ऑर्डर करना पहले से ही इस समस्या ( ORDER BY id DESC) की धारणा है , <=एक सही फिट है।
यह बहुत तेज है, क्योंकि उप-वर्ग द्वारा बनाई गई अस्थायी तालिका में एन रिकॉर्ड के बजाय सिर्फ एक रिकॉर्ड है।
परीक्षण का मामला
मैंने तीन कार्य विधियों और नई विधि का परीक्षण दो परीक्षण मामलों में किया।
दोनों परीक्षण मामले 10000 मौजूदा पंक्तियों का उपयोग करते हैं, जबकि पहला परीक्षण 9000 रखता है (सबसे पुराना 1000 हटाता है) और दूसरा परीक्षण 50 रखता है (सबसे पुराना 9950 हटाता है)।
+
| | 10000 TOTAL, KEEP 9000 | 10000 TOTAL, KEEP 50 |
+
| NOT IN | 3.2542 seconds | 0.1629 seconds |
| NOT IN v2 | 4.5863 seconds | 0.1650 seconds |
| <=,OFFSET | 0.0204 seconds | 0.1076 seconds |
+
मजे की बात यह है कि <=विधि पूरे बोर्ड में बेहतर प्रदर्शन देखती है, लेकिन वास्तव में आप जितना बेहतर रखते हैं, उतना खराब होने के बजाय बेहतर होता है।