মডিউল পাঠ (3/4)
যৌগিক এবং আংশিক সূচক
পূর্ববর্তী পাঠে আমরা রৈখিক DBMS প্রশ্নের (WHERE country = 'Italy') জন্য সূচী ব্যবহার করে কভার করেছি। আমরা যখন দুটি সম্মিলিত ফ্রন্টে অনুসন্ধান করি তখন কী হবে?
উদাহরণস্বরূপ, একটি প্রকৃত ই-কমার্সে আমরা একটি নির্দিষ্ট গ্রাহক আইডি এবং একটি নির্দিষ্ট সময়সীমার মধ্যে পড়ে এমন অর্ডারগুলি খুঁজে পেতে চাই:
WHERE customer_id = 90 AND placed_at >= '2025-01-01'
আপনার যদি শুধুমাত্র customer_id-এ একটি বেস ইনডেক্স থাকে, পোস্টগ্রেস বাইনারি ট্রি ব্যবহার করে কোনো সময়ের মধ্যেই গ্রাহকের 50টি অর্ডার খুঁজে পাবে, কিন্তু তারপরে এটিকে ম্যানুয়ালি এবং ক্রমানুসারে, অলসভাবে চোখ দিয়ে তারিখগুলি ফিল্টার করে সমস্ত 50টির মাধ্যমে পুনরাবৃত্তি করতে হবে।
কম্পোজিট ইনডেক্স
আমরা ডিবিএমএসকে বলতে পারি "বিশ্লেষণমূলক অভিধান" ফাইলগুলিকে একটি একক কী মাত্রা বরাবর নয়, বরং বেশ কয়েকটি বরাবর।
CREATE INDEX idx_orders_customer_date ON orders(customer_id, placed_at);একটি "যৌগিক" সূচক তার পরামিতিগুলির ক্রমকে অত্যন্ত গুরুত্বপূর্ণ হিসাবে বিবেচনা করে: এখানে B-Tree নোডগুলিকে গোষ্ঠীভুক্ত করুন এবং একটি ব্লকে customer_id শ্রেণীবদ্ধ করুন (বিচ্ছেদের জন্য সবচেয়ে বৈষম্যমূলক); তাদের ভিতরে বিভিন্ন placed_at সময় মানের সাথে নিখুঁতভাবে সাজানো ক্রমে উপ-বৃক্ষের শাখা-প্রশাখা বসবাস করে।
এই কাঠামোটি একাধিক নেস্টেড পূর্বাভাস সহ WHERE ধারাগুলিকে নির্মমভাবে ধ্বংস করে।
আংশিক সূচক (ফিল্টার করা সূচক)
ব্যবহারকারী-ইনপুট স্ট্রীমগুলিতে প্রতিটি সূচকের জন্য ডিস্ক স্পেস এবং CPU খরচ হয়। যদি ই-কমার্স ক্রমাগত বাছাই এবং একটি ফিল্টার পুনরুদ্ধার প্রয়োজন, কিন্তু শুধুমাত্র রেকর্ডের সংখ্যালঘুর জন্য? (উদাহরণস্বরূপ: অপঠিত-বিজ্ঞপ্তি চেক দ্রুত পোলিং করা।) সমস্ত 10,000,000 বিজ্ঞপ্তিগুলির উপর একটি "is_read" সূচক তৈরি করা অবিশ্বাস্যভাবে ক্লান্তিকর যদি "অপঠিত" শুধুমাত্র 5টি প্রতিনিধিত্ব করে।
CREATE INDEX idx_unread_notifs ON notifications(user_id)
WHERE is_read = false; -- Questa aggiuntiva è l'"Indice Parziale"ডাটাবেসটি একটি বিদ্যুত-দ্রুত বি-ট্রি তৈরি করবে যা DB তে দ্রুত অ্যাক্সেস কী সংরক্ষণ করে কেবল যদি রেকর্ডটি অপঠিত হয়! ডিস্কটি 10 মিলিয়নের সাথে একের পরিবর্তে 5 সারি (3 বাইট) সূচকের প্রেমে পড়বে। দ্রুত নির্বাচন সম্পূর্ণরূপে উপকৃত হয়:
SELECT * FROM notifications WHERE user_id = 2 AND is_read = false;
তোমার পালা
আমরা অস্থায়ী পাসওয়ার্ড / রিসেট টোকেনগুলির সন্ধানকে অপ্টিমাইজ করতে চাই৷ আমরা প্রায়শই একটি পরিচিত শহরের সাথে মিলিত একটি নির্দিষ্ট দেশ থেকে সাইন আপ করা সমস্ত গ্রাহকদের খুঁজতে SELECT কল করি৷\n'গ্রাহকদের'-এ 'idx_cust_loc' নামে একটি যৌগিক সূচক তৈরি করুন৷ প্রথমে 'দেশ' ক্ষেত্রটি পাস করুন (যা আরও একচেটিয়া) এবং তারপর 'শহর' ক্ষেত্র।
ইঙ্গিত দেখান
সিনট্যাক্স: টেবিলে ইনডেক্স নাম তৈরি করুন (col1, col2);
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
শর্তসাপেক্ষ (আংশিক) সূচকগুলি অন্বেষণ করা হচ্ছে
একটি কেনাকাটা ব্যবহারকারীর সন্ধান অপ্টিমাইজ করুন: ব্যবহারকারীরা প্রাক-নিবন্ধন করেন কিন্তু আমাদের শুধুমাত্র তাদের কালানুক্রমিক সাইনআপ ক্রমানুসারে তালিকাভুক্ত করতে হবে ('গ্রাহকদের'-এ 'signed_up_on'-এ একটি সূচী তৈরি করুন) কিন্তু শুধুমাত্র সঠিক পূর্ণ-স্ট্রিং 'শহর' থেকে গ্রাহকদের জন্য সীমিত: 'Milano'৷
ইঙ্গিত দেখান
এটি সাধারণত লক্ষ্য সম্পত্তিতে ঘোষণা করা হয়; শেষে আপনি ম্যাজিক কীওয়ার্ড WHERE city = 'Milano' যুক্ত করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ