এসকিউএল আইএনডেক্স - এটি কীভাবে কাজ করে?


19

ডাটাবেস এবং এসকিউএল সম্পর্কে আমার জ্ঞান বেশিরভাগ বিশ্ববিদ্যালয়ের ক্লাসে ভিত্তিক। যাইহোক, আমি একটি সংস্থায় কয়েকটি সন্ন্যাসী (প্রায় এক বছর) কাটিয়েছি, যেখানে আমি ডাটাবেস নিয়ে কাজ করছিলাম।

আমি কয়েকটি বই পড়া আছে এবং আমি যেমন ডাটাবেস সম্পর্কে কিছু প্রশিক্ষণ অংশগ্রহণ নিয়েছি MySQL, PostgreSQL, SQLite, Oracleএবং কয়েক nonSQL dbগুলি যেমন আমাদের MongoDB, Redis, ElasticSearchইত্যাদি

পাশাপাশি আমি বলেছিলাম, আমি প্রচুর জ্ঞানহীনতার সাথে ভিক্ষুক, কিন্তু আজ কেউ একজন কিছু বলেছিল, যা আমার ভিক্ষুকের জ্ঞানের সম্পূর্ণ বিরোধী।

আমাকে ব্যাখ্যা করতে দাও. আসুন এসকিউএল ডাটাবেস গ্রহণ করি এবং Personভিতরে কয়েকটি রেকর্ড সহ সহজ টেবিল তৈরি করি :

id | name   | age
-----------------
1  | Alex   | 24
2  | Brad   | 34
3  | Chris  | 29
4  | David  | 28
5  | Eric   | 18
6  | Fred   | 42
7  | Greg   | 65
8  | Hubert | 53
9  | Irvin  | 17
10 | John   | 19
11 | Karl   | 23

এখন, এটি অংশ, আমি ফোকাস করতে চাই - idহয় INDEX

এখনও অবধি, আমি ভেবেছিলাম এটি এটি এইভাবে কাজ করে: যখন একটি সারণী তৈরি করা INDEXহয় তখন খালি থাকে। আমি যখন আমার টেবিলে নতুন রেকর্ড যুক্ত করছি তখন INDEXকিছু আলগোরিদিদের উপর ভিত্তি করে পুনরায় গণনা করা হচ্ছে। উদাহরণ স্বরূপ:

একে একে দলবদ্ধ করা:

1    ... N
N+1  ... 2N
     ...
XN+1 ... (X+1)N

সুতরাং, আমার উদাহরণটির সাথে size = 11 elementsএবং N = 3এটি এর মতো হবে:

id | name   | age
-----------------
1  | Alex   | 24     // group0
2  | Brad   | 34     // group0
3  | Chris  | 29     // group0
4  | David  | 28     // group1
5  | Eric   | 18     // group1
6  | Fred   | 42     // group1
7  | Greg   | 65     // group2
8  | Hubert | 53     // group2
9  | Irvin  | 17     // group2
10 | John   | 19     // group3
11 | Karl   | 23     // group3

সুতরাং, যখন আমি কোয়েরিটি ব্যবহার করছি SELECT * FROM Person WHERE id = 8এটি কিছু সাধারণ গণনা করবে 8 / 3 = 2, সুতরাং আমাদের এই বস্তুর সন্ধান group2করতে হবে এবং তারপরে এই সারিটি ফিরে আসবে:

8  | Hubert | 53

এখানে চিত্র বর্ণনা লিখুন

এই পদ্ধতির সময় O(k)যেখানে কাজ করে k << size। অবশ্যই, গ্রুপগুলিতে সারিগুলি সংগঠিত করার জন্য একটি অ্যালগরিটম নিশ্চিতভাবেই অনেক বেশি জটিল তবে আমি মনে করি যে এই সাধারণ উদাহরণটি আমার দৃষ্টিভঙ্গি দেখায়।

সুতরাং এখন, আমি আরেকটি পদ্ধতির উপস্থাপন করতে চাই, যা আমাকে আজ দেখানো হয়েছে।

আবার এই টেবিলটি নেওয়া যাক:

id | name   | age
-----------------
1  | Alex   | 24
2  | Brad   | 34
3  | Chris  | 29
4  | David  | 28
5  | Eric   | 18
6  | Fred   | 42
7  | Greg   | 65
8  | Hubert | 53
9  | Irvin  | 17
10 | John   | 19
11 | Karl   | 23

এখন, আমরা অনুরূপ কিছু তৈরি করছি Hashmap(প্রকৃতপক্ষে, এটি একটি হ্যাশ মানচিত্র) যা এই আইডি দিয়ে সারি মানচিত্র idকরে address। চল বলি:

id | addr 
---------
1  | @0001
2  | @0010
3  | @0011
4  | @0100
5  | @0101
6  | @0110
7  | @0111
8  | @1000
9  | @1001
10 | @1010
11 | @1011

সুতরাং এখন, আমি যখন আমার জিজ্ঞাসা চালাচ্ছি: SELECT * FROM Person WHERE id = 8

এটি id = 8মেমরিতে ঠিকানায় সরাসরি ম্যাপ করবে এবং সারিটি ফিরে আসবে। অবশ্যই এটির জটিলতা O(1)

সুতরাং এখন, আমি কিছু প্রশ্ন পেয়েছি।

1. উভয় সমাধানের অ্যাডভেঞ্জেস এবং বিযুক্তি কী?

২. বর্তমান ডাটাবেস বাস্তবায়নে কোনটি বেশি জনপ্রিয়? বিভিন্ন ডিবিএস বিভিন্ন পন্থা ব্যবহার করতে পারে?

৩. এটি কি ননএসকিউএল ডিবিএসে বিদ্যমান?

তুমাকে অগ্রিম ধন্যবাদ


তুলনা

               |      B-tree     |   Hash Table
----------------------------------------------------
----------------   one element   -------------------
----------------------------------------------------
SEARCHING      |  O(log(N))      | O(1) -> O(N)  
DELETING       |  O(log(N))      | O(1) -> O(N)
INSERTING      |  O(log(N))      | O(1) -> O(N)
SPACE          |  O(N)           | O(N)
----------------------------------------------------
----------------    k elements   -------------------
----------------------------------------------------
SEARCHING      |  k + O(log(N))  | k * O(1) -> k * O(N)
DELETING       |  k + O(log(N))  | k * O(1) -> k * O(N)
INSERTING      |  k + O(log(N))  | k * O(1) -> k * O(N)
SPACE          |  O(N)           | O(N)

এন - রেকর্ড সংখ্যা

আমি কি সঠিক? প্রতিটি সন্নিবেশ / মুছার পরে বি-গাছ এবং হ্যাশ টেবিলটি পুনর্নির্মাণের ব্যয় সম্পর্কে কী বলা যায় ? বি-ট্রি ক্ষেত্রে আমাদের কিছু পয়েন্টার পরিবর্তন করতে হবে তবে ভারসাম্যপূর্ণ বি-ট্রি ক্ষেত্রে এর জন্য আরও বেশি প্রচেষ্টা প্রয়োজন। এছাড়াও হ্যাশ টেবিলের ক্ষেত্রে আমাদের কয়েকটি অপারেশন করতে হবে, বিশেষত, যদি আমাদের অপারেশন দ্বন্দ্ব সৃষ্টি করে


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

3
বিটি ট্রিস: এন.এম.উইকিপিডিয়া.আর / উইকি / বি- ট্রি অবাক করে দিয়েছিল যে আপনার বিশ্ববিদ্যালয়ে কোনও অ্যালগরিদম কোর্স নেই যা এটি ব্যাখ্যা করেছিল
ফিলি

হাইপার, আপনার উত্তরটির জন্য আপনাকে ধন্যবাদ পাশাপাশি আমি লিখেছিলাম: Of course, an alghoritm to organise rows in groups is for sure much more complicated but I think this simple example shows my point of view.অবশ্যই, আমি জানি এটি অনেক বেশি জটিল। সুতরাং অবশেষে, যখন আমি আমার কোডটিতে বলছি INDEXআমার সমাধানগুলির কোনটি ( প্রথম বা দ্বিতীয় ) এই বাস্তবটির সাথে আরও নিকটে? এবং সময়ের উপর নির্ভর করে একটি রেকর্ড অ্যাক্সেস করতে প্রয়োজন INDEX। আসলেই কি তাই O(1)? বি-ট্রি ইনডেক্সের সাথে এটির মতো শোনাচ্ছে O(log2(N))। আমি কি সঠিক?
রুহংগ্রি

@ ফ্রেশফিলঅফসো আমার অনুমান (আরও বেশি, আমি নিশ্চিত) এটি সম্পর্কে কিছু বক্তৃতা ছিল। সম্ভবত, আমি কিছু মিস করেছি ...
রুহংগ্রি

ইলাস্টিকসন্ধান ইনভার্টেড ইনডেক্সগুলি ব্যবহার করে, বি-গাছের চেয়ে সম্পূর্ণ আলাদা elastic.co/blog/found-elasticsearch-from-the-bottom-up
Lluis মার্টিনেজ

উত্তর:


12

আপনি মূলত একটি বি-ট্রি সূচক এবং একটি হ্যাশ সূচক বর্ণনা করছেন। তাদের উভয়েরই জায়গা আছে তবে উভয়ই আলাদা আলাদা কাজের জন্য উপযুক্ত।

সুবিধাগুলি এবং অসুবিধাগুলি

বি-ট্রি (এবং বি + ট্রি) সূচকগুলি সাধারণত ভারসাম্যপূর্ণ। এর অর্থ হল যে কোনও গাছটি যেখানেই পড়ে না কেন কোনও মূল্য সন্ধান করতে সর্বদা একই পরিমাণ সময় লাগে (O (লগ এন))। সাধারণত, গাছের স্তরের সংখ্যা সীমিত, সুতরাং এটি "গভীর" "গভীর" না হয়ে ঝোঁক। ছোট ডেটা সেটগুলির জন্য, বি-ট্রি রক্ষণাবেক্ষণ এবং ব্যবহারের ব্যয়, তবে সমস্ত সারিটি পড়ার চেয়ে আরও বেশি হতে পারে। বি-ট্রি ইনডেক্সগুলি বড় ডেটা সেট, কম সलेक्टিভিটি সহ ডেটা সেট বা ডেটা সেটগুলির জন্য ভাল যেখানে আপনি কেবলমাত্র একটি অবজেক্ট নয় বরং বিভিন্ন শ্রেণীর অবজেক্ট নির্বাচন করতে চান।

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

জনপ্রিয়তা

সাধারণভাবে, আমি সর্বাধিক বি-গাছগুলি পেরিয়েছি। বিটম্যাপ সূচকগুলি হ'ল নিম্ন কার্ডিনালিটি সহ মানগুলির জন্য অন্য বিকল্প (চিন্তাভাবনা করুন বুলিয়ান বা সম্ভবত লিঙ্গ)। সূচকগুলি কী কী উপলভ্য তা আপনার ডাটাবেস ইঞ্জিনের উপর নির্ভর করে এটি পরিবর্তিত হতে চলেছে।

NoSQL

NoSQL ডাটাবেসগুলি অবশ্যই সূচকগুলিকে সমর্থন করে। বেশিরভাগই বি-ট্রি বা বি-গাছে পরিবর্তনের পক্ষে সমর্থন করে। বেশিরভাগগুলি হ্যাশ সূচকগুলি সমর্থন করে বলে মনে হচ্ছে।


4
আমি মনে করি না যে বি + গাছের স্তরের সংখ্যা স্থির রয়েছে। কমপক্ষে আমি যতটা জানি এসকিউএল-সার্ভারে নেই।
ypercubeᵀᴹ

1
সেটা সত্য. একটি বি-গাছের যে কোনও স্তরের সংখ্যা থাকতে পারে তবে এটি সাধারণত 3 বা 4 এর মধ্যে সীমাবদ্ধ থাকে I আমি আমার উত্তরটি সম্পাদনা করেছি।
সরমে

হাই @ স্যারমে আমি আপনার উত্তর সত্যিই পছন্দ। এটা অনেক ব্যাখ্যা করে। আমি যদি এই প্রশ্নের জন্য অনুগ্রহ শুরু করি তবে আপত্তি করবেন না? হয়তো কেউ আকর্ষণীয় কিছু যোগ করবে।
রুহংগ্রি

1
আপনি কি বিটম্যাপ সূচকটির জন্য নিম্ন কার্ডিনালিটি বলতে চাইছেন না?
মিহাই

1
ডান, কম কার্ডিনালিটি। বিছানায় যাওয়ার আগে আমাকে প্রশ্নের উত্তর দেওয়া বন্ধ করতে হবে :)। উত্তর আপডেট হয়েছে।
সরমে

4

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

একটি বি-ট্রি কাঠামোতে, যেমন আপনার প্রথম পরিস্থিতিটি বাস্তবে কীভাবে প্রয়োগ করা হবে, আইডিগুলি ডিস্কে ক্রমযুক্ত হবে এবং একক পৃষ্ঠায় সম্ভবত আইডস 3 - 8 রাখা হবে রেঞ্জ স্ক্যানগুলির গতি বাড়িয়ে পৃথক অ্যাক্সেস ওকে (লগ এন) করবে ।

বর্তমান ডাটাবেস বাস্তবায়নে কোনটি বেশি জনপ্রিয়? বিভিন্ন ডিবিএস বিভিন্ন পন্থা ব্যবহার করতে পারে? প্রচুর বিভিন্ন ডাটাবেসে আমার বিশাল অভিজ্ঞতা নেই। আমি জানি যে এসকিএল সার্ভার বেশিরভাগ বি-ট্রি ব্যবহার করে তবে এসকিউএল ২০১৪-তে কয়েকটি নতুন হ্যাশ সূচক রয়েছে যা আপনি নির্দিষ্ট টেবিলে ব্যবহার করতে পারেন। আমি স্বতন্ত্র রেকর্ডগুলি পুনরুদ্ধার করতে নির্মিত নু এসকিএল ডেটাবেস এবং ক্যাশিং ডাটাবেসগুলিও হ্যাশ সূচকগুলি ব্যবহার করে শুনেছি। এটি ক্যাশেগুলির জন্য অর্থবোধ করে যেহেতু আপনি ব্যবহারকারীর জন্য একটি রেকর্ড চাইছেন পৃষ্ঠা 11 এবং আপনার রেঞ্জ স্ক্যানের প্রয়োজন নেই।

এটি কি ননএসকিউএল ডিবিএসে বিদ্যমান? হ্যাঁ. পোস্টগ্রিসকিলের জন্য তৈরি সূচি ডকুমেন্টেশনগুলির এক ঝলক দেখে আমি দেখতে পাচ্ছি যে এটি হ্যাশ এবং বি-ট্রি সূচক পাশাপাশি আরও কয়েকজনকে সমর্থন করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.