আমি কেবলমাত্র একটি লগিং সিস্টেম সেট আপ করেছি যা একই লেআউট সহ একাধিক টেবিল সমন্বিত।
প্রতিটি ডাটা উত্সের জন্য একটি টেবিল রয়েছে।
লগ ভিউয়ারের জন্য, আমি চাই
- ইউনিয়ন সমস্ত লগ টেবিল ,
- অ্যাকাউন্ট দ্বারা তাদের ফিল্টার ,
- উত্স সনাক্তকরণের জন্য ছদ্ম কলাম যুক্ত করুন ,
- তাদের সময় অনুসারে বাছাই করুন ,
- এবং এগুলি পৃষ্ঠাভুক্তকরণের জন্য সীমাবদ্ধ করুন ।
সমস্ত টেবিলগুলিতে এমন একটি ক্ষেত্র রয়েছে 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
ক্যোয়ারিতে চালিয়ে যাওয়া আমাকে subqueries এখনও উভয় টেবিল অনুসন্ধান করে বলে।
EXPLAINing
সাবকোয়ারিগুলি নিজেরাই আমাকে পছন্দসই অপ্টিমাইজেশন দেখায় তবে UNIONing
তাদের একসাথে তা হয় না।
আমি কি কিছু রেখে গেলাম?
আমি জানি যে সাবকিউয়ের ORDER BY
ভিতরে থাকা ধারাগুলি UNION
একটি ছাড়া উপেক্ষা করা হয় LIMIT
, তবে একটি সীমা রয়েছে।
সম্পাদনা করুন:
আসলেaccount_id
শর্তছাড়াই সম্ভবত কোয়েরিও থাকবে।
টেবিলগুলি ইতিমধ্যে বিদ্যমান এবং ডেটা দিয়ে পূর্ণ। উত্সের উপর নির্ভর করে বিন্যাসে পরিবর্তন হতে পারে তাই আমি তাদের বিভক্ত রাখতে চাই। অতিরিক্তভাবে, লগিং ক্লায়েন্টগুলি একটি কারণে বিভিন্ন শংসাপত্র ব্যবহার করে।
আমাকে লগ পাঠক এবং প্রকৃত টেবিলগুলির মধ্যে এক ধরণের স্তর রাখতে হবে।
এখানে পুরো ক্যোয়ারী এবং প্রথম সাবকিউয়ের পাশাপাশি টেবিলের বিন্যাসের বিশদ বিশদভাবে কার্যকর করার পরিকল্পনা রয়েছে:
UNION DISTINCT
? অতিরিক্ত বা শনাক্তকরণ কলামের কারণে ফলাফলগুলি সাবকোয়ারিগুলিতে পৃথক হবে বলে সেখানে কোনও বাছাই করতে এবং আলাদা করার দরকার নেই। ব্যবহার UNION ALL
।
source
কলামটি যুক্ত করে , সমস্ত টেবিলে একই টেবিলে থাকা ভাল না ? এইভাবে আপনি UNION
গুলি এড়াতে এবং আপনার সমস্ত ডেটা জুড়ে সূচী (গুলি) ব্যবহার করতে পারেন।
UNION ALL
করে বিভিন্ন রূপায়ণ পরিকল্পনা উত্পন্ন হয় কিনা তা পরীক্ষা করে দেখুন ।
(account_id, zeitpunkt)
। আপনার কি এমন একটি সূচক আছে? দ্বিতীয় সেরাটি হবে (আমার মনে হয়) একক হবে(zeitpunkt)
- তবে যদি এটি ব্যবহার করা হয় তবে দক্ষতাটি কতটা সারি সারিaccount_id=730
প্রদর্শিত হবে তার উপর নির্ভর করে ।