প্রসঙ্গ
এই প্রশ্নটি এসকিউএল এবং নোএসকিউএল উভয় ডাটাবেস সিস্টেমে সূচকের নিম্ন-স্তরের প্রয়োগের বিশদ সম্পর্কিত। সূচকের আসল কাঠামো (বি + ট্রি, হ্যাশ, এসএসটিবেল, ইত্যাদি) অপ্রাসঙ্গিক কারণ প্রশ্নটি বিশেষত সেইগুলির বাস্তবায়নের কোনও একক নোডের ভিতরে সংরক্ষণ করা কীগুলির সাথে সম্পর্কিত ।
পটভূমি
এসকিউএল (যেমন মাইএসকিউএল) এবং নোএসকিউএল (কাউচডিবি, মঙ্গোডিবি, ইত্যাদি) ডাটাবেসগুলিতে, আপনি যখন কোনও কলাম বা জাসন নথির ক্ষেত্রের ডেটাতে একটি সূচক তৈরি করেন, আপনি আসলে ডেটাবেসকে যে কারণে করছেন তা হ'ল মূলত একটি সাজানো তালিকা তৈরি করা হয় একটি ফাইলের সাথে সেই মানগুলি প্রধান ডেটা ফাইলে অফসেট হয় যেখানে সেই মান সম্পর্কিত রেকর্ডটি থাকে।
(সরলতার জন্য, আমি নির্দিষ্ট ইমপ্লের অন্যান্য গুপ্ত বিবরণটি হাতছাড়া করবো)
সাধারণ ক্লাসিক এসকিউএল উদাহরণ
একটি স্ট্যান্ডার্ড এসকিউএল টেবিলটি বিবেচনা করুন যেখানে একটি সাধারণ 32-বিট ইন্ট প্রাথমিক কী রয়েছে যা আমরা একটি সূচক তৈরি করি, আমরা ডেটা ফাইলে যেখানে 64-বিট অফসেটের সাথে বাছাই করা এবং 64-বিটের অফসেটের সাথে সংযুক্ত ইন্টিজার কীগুলির অনডিক দিয়ে শেষ করব where রেকর্ড জীবন, যেমন:
id | offset
--------------
1 | 1375
2 | 1413
3 | 1786
সূচীতে কীগুলির অন ডিস্ক উপস্থাপনাটি দেখতে এরকম কিছু দেখাচ্ছে:
[4-bytes][8-bytes] --> 12 bytes for each indexed value
ফাইল সিস্টেম এবং ডাটাবেস সিস্টেমের সাথে ডিস্ক আই / ওকে অনুকূলকরণ সম্পর্কে থাম্বের মানক নিয়মগুলিকে আঁকড়ে ধরে ধরা যাক আপনি ডিস্কের 4KB ব্লকে কী সংরক্ষণ করেন যার অর্থ:
4096 bytes / 12 bytes per key = 341 keys per block
সূচকের সামগ্রিক কাঠামো (বি + ট্রি, হ্যাশ, সাজানো তালিকা ইত্যাদি) উপেক্ষা করে আমরা একবারে মেমরিতে 341 কীগুলির ব্লক পড়ি এবং লিখি এবং প্রয়োজনে ডিস্কে ফিরে আসি।
উদাহরণ কোয়েরি
পূর্ববর্তী বিভাগের তথ্য ব্যবহার করে, আসুন আমরা বলি যে "আইডি = 2" এর জন্য একটি কোয়েরি এসেছে, ক্লাসিক ডিবি সূচী অনুসন্ধানটি নীচে চলেছে:
- সূচকের মূলটি পড়ুন (এই ক্ষেত্রে, 1 টি ব্লক)
- কী খুঁজে পেতে বাছাই করা ব্লকটি বাইনারি-অনুসন্ধান করুন
- মান থেকে ডেটা ফাইল অফসেট পান
- অফসেটটি ব্যবহার করে ডেটা ফাইলে রেকর্ডটি সন্ধান করুন
- কলারের কাছে ডেটা ফিরিয়ে দিন
প্রশ্ন সেটআপ ...
ঠিক আছে, এখানেই প্রশ্নটি একসাথে আসে ...
ধাপ # 2 সবচেয়ে গুরুত্বপূর্ণ অংশ যে এই প্রশ্নের মধ্যে O (logn) সময় চালানো করার অনুমতি দেয় ... তথ্য অনুসারে বাছাই করা হবে করেনি, কিন্তু আপনি একটি দ্রুত-বাছাই পদ্ধতিতে তালিকা ঢোঁড়ন করতে সক্ষম হতে হবে ... আরও বিশেষত, আপনাকে সেই অবস্থানের সূচক কীতে পড়তে ভাল-সংজ্ঞায়িত অফসেটগুলিতে ঝাঁপিয়ে পড়তে সক্ষম হতে হবে।
ব্লকে পড়ার পরে, আপনাকে তাত্ক্ষণিকভাবে 170 তম অবস্থানে যেতে হবে, মূল মানটি পড়তে হবে এবং আপনি যা খুঁজছেন তা জিটি বা এলটি সেই অবস্থানটি (এবং এই জাতীয় আরও কিছু) ...
আপনি ব্লকের ডাটাগুলির চারপাশে ঝাঁপিয়ে পড়তে সক্ষম হবেন এমন একমাত্র উপায় হ'ল যদি মূল মানগুলির মাপগুলি সমস্ত উপরে সুস্পষ্টভাবে সংজ্ঞায়িত করা হয় যেমন আমাদের উপরের উদাহরণের (4-বাইটগুলি প্রতি কী প্রতি 8-বাইট)।
প্রশ্ন
ঠিক আছে, সুতরাং এখানে আমি দক্ষ সূচক ডিজাইন নিয়ে আটকে যাচ্ছি ... এসকিউএল ডাটাবেসে বা আরও নির্দিষ্টভাবে বর্ণা কলামগুলির জন্য, কাউচডিবি বা নোএসকিউএল এর মতো নথি ডাটাবেসে সম্পূর্ণ ফর্ম-ফর্ম ক্ষেত্র, যেখানে আপনি যে ক্ষেত্রকে সূচক করতে চান তা যে কোনও হতে পারে দৈর্ঘ্য আপনি সূচক কাঠামোর ব্লকগুলির মধ্যে থাকা মূল মানগুলি কীভাবে বাস্তবায়ন করবেন যা আপনি আপনার সূচকগুলি বাইরে রেখেছেন?
উদাহরণস্বরূপ, ধরা যাক আপনি কাউচডিবিতে একটি আইডির জন্য অনুক্রমিক কাউন্টার ব্যবহার করেছেন এবং আপনি টুইটগুলি সূচী করছেন ... কয়েক মাস পরে আপনার মানগুলি "1" থেকে "100,000,000,000" এ চলে যাবে।
ধরা যাক আপনি 1 তারিখে ডাটাবেসে সূচকটি তৈরি করেন, যখন ডাটাবেসে কেবল 4 টি টুইট থাকে, কাউচডিবি সূচী ব্লকের অভ্যন্তরীণ মূল মানগুলির জন্য নিম্নলিখিত নির্মাণটি ব্যবহার করতে প্ররোচিত হতে পারে:
[1-byte][8-bytes] <-- 9 bytes
4096 / 9 = 455 keys per block
এক পর্যায়ে এটি বিরতি দেয় এবং সূচীতে আপনার মূল মানটি সংরক্ষণ করতে আপনার একটি পরিবর্তনশীল সংখ্যক বাইটের প্রয়োজন।
আপনি যদি একটি "টুইট_মেসেজ" বা কোনও কিছুর মতো সত্যিকারের পরিবর্তনশীল-দৈর্ঘ্যের ক্ষেত্রটি সূচীকরণের সিদ্ধান্ত নেন তবে বিষয়টি আরও সুস্পষ্ট।
কীগুলির নিজস্ব পুরো পরিবর্তনশীল দৈর্ঘ্য হওয়ার সাথে সাথে এবং সূচীটি তৈরি করা এবং আপডেট করা হলে ডাটাবেসগুলিতে কিছু "সর্বোচ্চ কী আকার" বুদ্ধিমানভাবে অনুমান করার উপায় নেই, কীগুলি আসলে কীভাবে রয়েছে এই ডাটাবেস সূচকের অংশ প্রতিনিধিত্বমূলক ব্লক ভিতরে সঞ্চিত ?
স্পষ্টতই যদি আপনার কীগুলি পরিবর্তনশীল আকারের হয় এবং আপনি কীগুলির একটি ব্লকে পড়ে থাকেন, তবে কেবলমাত্র কীগুলি আসলে কী তা আপনার কোনও ধারণা নেই যে ব্লকটিতে আপনি জানেন না, তবে বাইনারি করার জন্য তালিকার মাঝখানে কীভাবে ঝাঁপিয়ে তাদের অনুসন্ধান করুন।
এখানেই আমি সমস্ত বিভক্ত হয়ে যাচ্ছি।
ক্লাসিক এসকিউএল ডাটাবেসগুলিতে স্ট্যাটিক-টাইপযুক্ত ক্ষেত্রগুলির সাথে (যেমন বুল, ইনট, চর ইত্যাদি understand) সূচকগুলি মূল দৈর্ঘ্যটিকে প্রাক-সংজ্ঞায়িত করতে এবং এটিতে আটকে থাকতে পারি বুঝতে পারি ... তবে নথির ডেটা স্টোরের এই বিশ্বে আমি তারা কীভাবে ডিস্কে এই ডেটাটি দক্ষতার সাথে মডেলিং করছে তা দেখে হতবাক হয়ে গেল যে এটি এখনও ও (লগইন) সময়ে স্ক্যান করা যেতে পারে এবং এখানে যে কোনও স্পষ্টকরণের প্রশংসা করতে পারে।
কোন স্পেসিফিকেশন প্রয়োজন হয় দয়া করে আমাকে জানান!
আপডেট (গ্রেগের উত্তর)
গ্রেগের উত্তরের সাথে আমার মন্তব্যগুলি সংযুক্ত দেখুন। আরও এক সপ্তাহের গবেষণার পরে আমি মনে করি যে তিনি যে মূল্যবান বিষয়গুলির মূল্যায়ন করবেন না তার মূল মূল্যবোধের deserialization এড়ানোর ক্ষেত্রে কার্যকরভাবে কার্যকর করা কার্যকর এবং কার্যকরভাবে কার্যকর করা কার্যকর যে কার্যকরভাবে কার্যকর করা কার্যকর এবং কার্যকর ব্যবহারের পরামর্শটি পেয়েছিলেন think
আমি তিনটি পৃথক ডিবিএমএস বাস্তবায়ন (কাউচডিবি, কিভালু এবং ইনোডিবি) খতিয়ে দেখেছি এবং তাদের সকলেই তাদের কার্যনির্বাহী পরিবেশের (মানক / সি) মানগুলি অনুসন্ধান করার আগে পুরো ব্লকটিকে অভ্যন্তরীণ ডেটা কাঠামোতে ਡੀেসরিয়াল করে এই সমস্যাটি পরিচালনা করি।
গ্রেগের এই পরামর্শটি নিয়ে আমি এটাই উজ্জ্বল বলে মনে করি; 2048 এর একটি সাধারণ ব্লকের আকারে সাধারণত 50 বা তার চেয়ে কম অফসেট থাকে, যার ফলে খুব কম সংখ্যক ব্লক পড়তে হয়।
আপডেট (গ্রেগের পরামর্শে সম্ভাব্য ডাউনসাইড)
নিজের সাথে এই কথোপকথনটি সর্বোত্তমভাবে চালিয়ে যেতে, আমি বুঝতে পেরেছি যে এটির নিম্নোক্ত দিকগুলি ...
যদি প্রতিটি "ব্লক" অফসেট ডেটা নিয়ে আসে তবে আপনি ব্লকের আকারটি পরে রাস্তায় কনফিগারেশনে সামঞ্জস্য করতে পারবেন না কারণ আপনি এমন ডেটা পড়া শেষ করতে পারেন যা সঠিকভাবে শিরোনাম দিয়ে শুরু হয়নি বা কোনও ব্লক যা একাধিক শিরোনাম রয়েছে।
যদি আপনি বিশাল কী মানগুলি সূচকে দেখছেন (বলুন যে কেউ চরের কলাম (8192) বা ব্লব (8192) সূচী করার চেষ্টা করছে) এটি সম্ভব যে কীগুলি একক ব্লকের সাথে মানানসই নয় এবং পাশাপাশি দুটি ব্লকের পাশাপাশি উপচে পড়া দরকার । এর অর্থ আপনার প্রথম ব্লকের একটি অফসেট শিরোলেখ থাকবে এবং দ্বিতীয় ব্লকের সাথে সাথে কী ডেটা শুরু হবে।
এই সমস্তগুলির সমাধানের একটি স্থির ডাটাবেস ব্লক আকার রয়েছে যা নয় নিয়মিত এবং এটি প্রায় হেডার ব্লক ডাটা স্ট্রাকচার তৈরির ... উদাহরণস্বরূপ, আপনি 4 KB সব ব্লকের মাপ (সাধারণত সবচেয়ে অনুকূল যাহাই হউক না কেন) সমাধান এবং একটি খুব ছোট লেখা শুরুতে "ব্লক ধরণ" অন্তর্ভুক্ত ব্লক শিরোনাম। যদি এটি একটি সাধারণ ব্লক হয় তবে অবিলম্বে ব্লক শিরোনামটি অফসেট শিরোনাম হওয়া উচিত। যদি এটি একটি "ওভারফ্লো" প্রকারের হয় তবে অবিলম্বে ব্লক শিরোনামটি কাঁচা কী ডেটা।
আপডেট (সম্ভাব্য ভয়ঙ্কর আপ-সাইড)
ব্লকটি বাইটস এবং অফসেটগুলি ডিকোডের একটি সিরিজ হিসাবে পাঠ করার পরে; প্রযুক্তিগতভাবে আপনি যে কীটি সন্ধান করছেন তা কেবল কাঁচা বাইটে এনকোড করতে পারেন এবং তারপরে বাইট স্ট্রিমের সাথে সরাসরি তুলনা করতে পারেন।
একবার আপনি যে কীটি সন্ধান করছেন তা পাওয়া গেলে, পয়েন্টারটি ডিকোড করে অনুসরণ করা যায়।
গ্রেগের ধারণার আর একটি দুর্দান্ত প্রভাব! এখানে সিপিইউ সময়ের অপ্টিমাইজেশনের সম্ভাবনা যথেষ্ট বড় যে একটি নির্দিষ্ট ব্লকের আকার নির্ধারণ করা কেবলমাত্র এগুলি অর্জনের জন্য উপযুক্ত।