ভেরিয়েবল দৈর্ঘ্যের ক্ষেত্রগুলির জন্য কীভাবে ডাটাবেসগুলি সূচক কী মানগুলি (অন ডিস্ক) সঞ্চয় করে?


16

প্রসঙ্গ

এই প্রশ্নটি এসকিউএল এবং নোএসকিউএল উভয় ডাটাবেস সিস্টেমে সূচকের নিম্ন-স্তরের প্রয়োগের বিশদ সম্পর্কিত। সূচকের আসল কাঠামো (বি + ট্রি, হ্যাশ, এসএসটিবেল, ইত্যাদি) অপ্রাসঙ্গিক কারণ প্রশ্নটি বিশেষত সেইগুলির বাস্তবায়নের কোনও একক নোডের ভিতরে সংরক্ষণ করা কীগুলির সাথে সম্পর্কিত ।

পটভূমি

এসকিউএল (যেমন মাইএসকিউএল) এবং নোএসকিউএল (কাউচডিবি, মঙ্গোডিবি, ইত্যাদি) ডাটাবেসগুলিতে, আপনি যখন কোনও কলাম বা জাসন নথির ক্ষেত্রের ডেটাতে একটি সূচক তৈরি করেন, আপনি আসলে ডেটাবেসকে যে কারণে করছেন তা হ'ল মূলত একটি সাজানো তালিকা তৈরি করা হয় একটি ফাইলের সাথে সেই মানগুলি প্রধান ডেটা ফাইলে অফসেট হয় যেখানে সেই মান সম্পর্কিত রেকর্ডটি থাকে।

(সরলতার জন্য, আমি নির্দিষ্ট ইমপ্লের অন্যান্য গুপ্ত বিবরণটি হাতছাড়া করবো)

সাধারণ ক্লাসিক এসকিউএল উদাহরণ

একটি স্ট্যান্ডার্ড এসকিউএল টেবিলটি বিবেচনা করুন যেখানে একটি সাধারণ 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. সূচকের মূলটি পড়ুন (এই ক্ষেত্রে, 1 টি ব্লক)
  2. কী খুঁজে পেতে বাছাই করা ব্লকটি বাইনারি-অনুসন্ধান করুন
  3. মান থেকে ডেটা ফাইল অফসেট পান
  4. অফসেটটি ব্যবহার করে ডেটা ফাইলে রেকর্ডটি সন্ধান করুন
  5. কলারের কাছে ডেটা ফিরিয়ে দিন

প্রশ্ন সেটআপ ...

ঠিক আছে, এখানেই প্রশ্নটি একসাথে আসে ...

ধাপ # 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 বা তার চেয়ে কম অফসেট থাকে, যার ফলে খুব কম সংখ্যক ব্লক পড়তে হয়।

আপডেট (গ্রেগের পরামর্শে সম্ভাব্য ডাউনসাইড)

নিজের সাথে এই কথোপকথনটি সর্বোত্তমভাবে চালিয়ে যেতে, আমি বুঝতে পেরেছি যে এটির নিম্নোক্ত দিকগুলি ...

  1. যদি প্রতিটি "ব্লক" অফসেট ডেটা নিয়ে আসে তবে আপনি ব্লকের আকারটি পরে রাস্তায় কনফিগারেশনে সামঞ্জস্য করতে পারবেন না কারণ আপনি এমন ডেটা পড়া শেষ করতে পারেন যা সঠিকভাবে শিরোনাম দিয়ে শুরু হয়নি বা কোনও ব্লক যা একাধিক শিরোনাম রয়েছে।

  2. যদি আপনি বিশাল কী মানগুলি সূচকে দেখছেন (বলুন যে কেউ চরের কলাম (8192) বা ব্লব (8192) সূচী করার চেষ্টা করছে) এটি সম্ভব যে কীগুলি একক ব্লকের সাথে মানানসই নয় এবং পাশাপাশি দুটি ব্লকের পাশাপাশি উপচে পড়া দরকার । এর অর্থ আপনার প্রথম ব্লকের একটি অফসেট শিরোলেখ থাকবে এবং দ্বিতীয় ব্লকের সাথে সাথে কী ডেটা শুরু হবে।

এই সমস্তগুলির সমাধানের একটি স্থির ডাটাবেস ব্লক আকার রয়েছে যা নয় নিয়মিত এবং এটি প্রায় হেডার ব্লক ডাটা স্ট্রাকচার তৈরির ... উদাহরণস্বরূপ, আপনি 4 KB সব ব্লকের মাপ (সাধারণত সবচেয়ে অনুকূল যাহাই হউক না কেন) সমাধান এবং একটি খুব ছোট লেখা শুরুতে "ব্লক ধরণ" অন্তর্ভুক্ত ব্লক শিরোনাম। যদি এটি একটি সাধারণ ব্লক হয় তবে অবিলম্বে ব্লক শিরোনামটি অফসেট শিরোনাম হওয়া উচিত। যদি এটি একটি "ওভারফ্লো" প্রকারের হয় তবে অবিলম্বে ব্লক শিরোনামটি কাঁচা কী ডেটা।

আপডেট (সম্ভাব্য ভয়ঙ্কর আপ-সাইড)

ব্লকটি বাইটস এবং অফসেটগুলি ডিকোডের একটি সিরিজ হিসাবে পাঠ করার পরে; প্রযুক্তিগতভাবে আপনি যে কীটি সন্ধান করছেন তা কেবল কাঁচা বাইটে এনকোড করতে পারেন এবং তারপরে বাইট স্ট্রিমের সাথে সরাসরি তুলনা করতে পারেন।

একবার আপনি যে কীটি সন্ধান করছেন তা পাওয়া গেলে, পয়েন্টারটি ডিকোড করে অনুসরণ করা যায়।

গ্রেগের ধারণার আর একটি দুর্দান্ত প্রভাব! এখানে সিপিইউ সময়ের অপ্টিমাইজেশনের সম্ভাবনা যথেষ্ট বড় যে একটি নির্দিষ্ট ব্লকের আকার নির্ধারণ করা কেবলমাত্র এগুলি অর্জনের জন্য উপযুক্ত।


এই বিষয়টিতে আগ্রহী অন্য যে কোনও ব্যক্তির জন্য, রেডিসের জন্য অকার্যকর "ডিস্ক স্টোর" উপাদানটি প্রয়োগ করার চেষ্টা করার সময় রেডিসের সীসা দেব এই সঠিক সমস্যাটিতে চলেছিল। তিনি মূলত 32-বাইটের "বিগ যথেষ্ট" স্থিতিশীল কী মাপের জন্য বেছে নিয়েছিলেন তবে সমস্যার সম্ভাবনা বুঝতে পেরে তার পরিবর্তে কীগুলির হ্যাশ (শ 1 বা এমডি 5) সংরক্ষণ করার চেষ্টা করেছেন কেবল সামঞ্জস্যপূর্ণ আকারের জন্য। এটি রেঞ্জযুক্ত ক্যোয়ারীগুলি করার ক্ষমতা হারাতে পারে তবে এটি গাছকে সুন্দরভাবে FWIW এর ভারসাম্য দেয়। বিশদ এখানে redis.hackyhack.net/2011-01-12.html
রিয়াদ কল্লা

আমি আরও কিছু তথ্য পেয়েছি। দেখে মনে হচ্ছে এসকিউএলাইটের কী কী বড় পাবে তার একটি ক্যাপ রয়েছে বা এটি কিছুটা উপরের বাউন্ডে মূল মানটি কেটে দেয় এবং বাকীটিকে ডিস্কের "ওভারফ্লো পৃষ্ঠা" তে রাখে। এটি র্যান্ডম আই / ও ডাবল হিসাবে বিশাল কীগুলির জন্য অনুসন্ধানকে ভয়ঙ্কর করে তুলতে পারে। এখানে "বি-ট্রি পাতা" বিভাগে স্ক্রোল করুন sqlite.org/fileformat2.html
রিয়াদ কল্লা

উত্তর:


7

আপনি আপনার মূল তথ্য সম্বলিত ব্লকে স্থির আকারের অফসেটের তালিকা হিসাবে আপনার সূচকটি সংরক্ষণ করতে পারেন। উদাহরণ স্বরূপ:

+--------------+
| 3            | number of entries
+--------------+
| 16           | offset of first key data
+--------------+
| 24           | offset of second key data
+--------------+
| 39           | offset of third key data
+--------------+
| key one |
+----------------+
| key number two |
+-----------------------+
| this is the third key |
+-----------------------+

(ভাল, মূল তথ্যটি একটি বাস্তব উদাহরণে সাজানো হবে তবে আপনি ধারণাটি পাবেন)।

মনে রাখবেন, এই অগত্যা প্রতিফলিত নাও কীভাবে সূচক ব্লক করছে আসলে কোনো ডাটাবেসের মধ্যে নির্মিত। এটি কীভাবে আপনি কীভাবে সূচক তথ্যগুলির একটি ব্লক সংগঠিত করতে পারেন যেখানে কী ডেটা পরিবর্তনশীল দৈর্ঘ্যের।


গ্রেগ, আমি এখনও আপনার উত্তরটি ডিফাক্টো উত্তর হিসাবে বেছে নিইনি কারণ আমি আরও কিছু প্রতিক্রিয়ার আশা করছি পাশাপাশি অন্যান্য ডিবিএমএসগুলিতে আরও গবেষণা করার চেষ্টা করছি (আমি আমার মন্তব্যগুলি মূল প্রশ্নটিতে যুক্ত করছি)। এখন পর্যন্ত সর্বাধিক প্রচলিত পদ্ধতির কাছে একটি উপরের বাউন্ডের ক্যাপ এবং তারপরে একটি ওভারফ্লো টেবিলের বাকি কীটি কেবল পুরো কীটি প্রয়োজন হলে তা পরীক্ষা করা হয়। মার্জিত নয়। আপনার সমাধানটিতে আমার পছন্দ মতো কিছু কমনীয়তা রয়েছে তবে কিনারা ক্ষেত্রে যেখানে কীগুলি আপনার পৃষ্ঠার আকার বয়ে দেয়, আপনার পথটিতে এখনও একটি ওভারফ্লো টেবিল লাগবে বা কেবল এটির অনুমতি দেবে না।
রিয়াদ কল্লা

আমি জায়গার বাইরে চলে গেলাম ... সংক্ষেপে যদি ডিবি ডিজাইনার কী আকারের কিছু শক্ত সীমাবদ্ধতা নিয়ে বেঁচে থাকতে পারে তবে আমার ধারণা আপনার পদ্ধতির সর্বাধিক দক্ষ এবং নমনীয়। স্পেস এবং সিপিইউ দক্ষতার দুর্দান্ত কম্বো। ওভারফ্লো টেবিলগুলি আরও নমনীয়, তবে ক্রমাগত উপচে পড়া কীগুলির জন্য অনুসন্ধানগুলিতে এলোমেলো i / o যোগ করার জন্য চমকপ্রদ হতে পারে। এই ইনপুট জন্য ধন্যবাদ!
রিয়াদ কল্লা

গ্রেগ, আমি এই সম্পর্কে আরও বেশি করে ভাবছি, বিকল্প সমাধানগুলি খুঁজছি এবং আমি মনে করি আপনি এটি অফসেট শিরোনাম ধারণার দ্বারা পেরেক দিয়েছিলেন। আপনি যদি নিজের ব্লকগুলি ছোট রাখেন তবে আপনি 8-বিট (1-বাইট) অফসেটের সাথে দূরে সরে যেতে পারেন, বড় ব্লক সহ 16-বিট 128KB বা 256KB অবধি যুক্তিসঙ্গত হওয়া উচিত (4 বা 8 বাইট কীগুলি ধরে নেওয়া হবে) পর্যন্ত নিরাপদ। বড় জয়টি হ'ল অফসেট ডেটাতে আপনি কতটা সস্তা এবং দ্রুত পড়তে পারেন এবং ফলস্বরূপ আপনি কতটা ডিসিসেরালাইজেশন সঞ্চয় করেন। দুর্দান্ত পরামর্শ, আবার আপনাকে ধন্যবাদ।
রিয়াদ কল্লা

আপস্কেলডিবিতেও এটি ব্যবহার করা হয়েছে: upscaledb.com/about.html#varleth
ম্যাথিউ রডিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.