मैं बस एक लॉगिंग सिस्टम सेट करता हूं जिसमें एक ही लेआउट के साथ कई टेबल होते हैं।
प्रत्येक डेटा स्रोत के लिए एक तालिका है।
लॉग दर्शक के लिए, मैं चाहता हूं
- सभी लॉग टेबल को यूनिअन करें ,
- उन्हें खाते से फ़िल्टर करें ,
- स्रोत की पहचान के लिए एक छद्म कॉलम जोड़ें ,
- उन्हें समय के अनुसार क्रमबद्ध करें ,
- और पेजिंग के लिए उन्हें सीमित करें ।
सभी तालिकाओं में एक फ़ील्ड होती है, जिसे zeitpunkt
अनुक्रमित दिनांक / समय स्तंभ कहा जाता है।
मेरा पहला प्रयास था:
(SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt AS zeit,
'hp' AS source FROM is_log AS l WHERE l.account_id = 730)
UNION
(SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt,
'ig' AS source FROM ig_is_log AS l WHERE l.account_id = 730)
ORDER BY zeit DESC LIMIT 10;
आशावादी यहाँ अनुक्रमणिकाओं का उपयोग नहीं कर सकता है क्योंकि दोनों तालिकाओं की सभी पंक्तियाँ उपश्रेणियों द्वारा लौटा दी जाती हैं और बाद में छांटी जाती हैं UNION
।
मेरा समाधान निम्नलिखित था:
(SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt AS zeit,
'hp' AS source FROM is_log AS l WHERE l.account_id = 730
ORDER BY l.zeitpunkt DESC LIMIT 10)
UNION
(SELECT l.id, l.account_id, l.vnum, l.count, l.preis, l.zeitpunkt,
'ig' AS source FROM ig_is_log AS l WHERE l.account_id = 730
ORDER BY l.zeitpunkt DESC LIMIT 10)
ORDER BY zeit DESC LIMIT 10;
मैं उम्मीद कर रहा था कि क्वेरी इंजन यहाँ अनुक्रमणिका का उपयोग करेगा क्योंकि दोनों उपश्रेणियों को क्रमबद्ध और पहले से ही सीमित किया जाना चाहिए UNION
, जो तब विलय और पंक्तियों को क्रमबद्ध करता है।
मैंने वास्तव में सोचा था कि यह होगा, लेकिन EXPLAIN
क्वेरी पर चलने से मुझे पता चलता है कि उपश्रेणी अभी भी दोनों तालिकाओं को खोजती है।
EXPLAINing
उपश्रेणियाँ स्वयं मुझे वांछित अनुकूलन दिखाती हैं, लेकिन UNIONing
साथ में ऐसा नहीं करती हैं।
क्या मैं कुछ भुल गया?
मुझे पता है कि ORDER BY
उप- UNION
श्रेणियों के अंदर खंडों को एक के बिना अनदेखा किया जाता है LIMIT
, लेकिन एक सीमा है।
संपादित करें:
वास्तव में,account_id
स्थिति केबिना भी प्रश्न होंगे।
तालिकाओं में पहले से मौजूद हैं और डेटा से भरे हुए हैं। स्रोत के आधार पर लेआउट में परिवर्तन हो सकते हैं इसलिए मैं उन्हें विभाजित रखना चाहता हूं। इसके अतिरिक्त, लॉगिंग क्लाइंट एक कारण के लिए विभिन्न क्रेडेंशियल्स का उपयोग करते हैं।
मुझे लॉग रीडर और वास्तविक तालिकाओं के बीच एक तरह की परत रखनी होगी।
संपूर्ण क्वेरी और प्रथम उप-तालिका के साथ-साथ तालिका लेआउट के लिए निष्पादन योजनाएं विस्तार से हैं:
UNION DISTINCT
? अतिरिक्त और पहचान कॉलम के कारण, सभी प्रकारों को अलग-अलग करने की आवश्यकता नहीं है, क्योंकि परिणाम सबक्वेरी में अलग-अलग होंगे। का उपयोग करें UNION ALL
।
source
कॉलम के अतिरिक्त के साथ ? इस तरह से आप UNION
अपने सभी डेटा में s और इंडेक्स का उपयोग कर सकते हैं ।
UNION ALL
अलग-अलग निष्पादन योजना से पैदावार में बदल रहा है ।
(account_id, zeitpunkt)
। क्या आपके पास ऐसा कोई इंडेक्स है? दूसरा सबसे अच्छा (मुझे लगता है) एकल होगा(zeitpunkt)
- लेकिन अगर इसका इस्तेमाल किया जाता है तो दक्षता इस बात पर निर्भर करती है कि पंक्तियां कितनी बारaccount_id=730
दिखाई देती हैं।