মোংগোডিবিতে সূচকের দিকটি কেন পদক্ষেপ নিয়েছে?


114

উদ্ধৃতি দস্তাবেজগুলি :

একটি সূচক তৈরি করার সময়, একটি কী এর সাথে যুক্ত নম্বরটি সূচকের দিক নির্দিষ্ট করে, তাই এটি সর্বদা 1 (আরোহণ) বা -1 (উতরাই) হওয়া উচিত। একক কী সূচকগুলির জন্য বা এলোমেলো অ্যাক্সেস পুনরুদ্ধারের জন্য দিকনির্দেশটি গুরুত্বপূর্ণ নয় তবে আপনি যদি যৌগিক সূচকগুলিতে বাছাই বা পরিসীমা অনুসন্ধান করছেন তবে গুরুত্বপূর্ণ।

যাইহোক, আমি কেন যৌগিক সূচকগুলিতে সূচকের দিক নির্দেশিত হওয়া উচিত তার কোনও কারণ দেখছি না। কেউ দয়া করে আরও ব্যাখ্যা প্রদান করতে পারেন (বা উদাহরণ)?

উত্তর:


111

মঙ্গোডিবি কোনওভাবে যৌগিক কীটি সম্মতি জানায় এবং এটিকে একটি বিটিআর-তে কী হিসাবে ব্যবহার করে।

একক আইটেম সন্ধান করার সময় - গাছে নোডের ক্রমটি অপ্রাসঙ্গিক।

আপনি যদি অনেকগুলি নোড ফিরিয়ে দিচ্ছেন - একে অপরের নিকটবর্তী উপাদানগুলি গাছের একই শাখাগুলিতে নীচে নেমে আসবে। নোডগুলি যত দ্রুত পরিসরে থাকে তত দ্রুত তাদের পুনরুদ্ধার করা যায়।

একক ক্ষেত্রের সূচক সহ - অর্ডারটি কোনও ব্যাপার নয়। যদি তারা আরোহী ক্রমের সাথে একত্রে থাকে তবে তারাও অবতরণ ক্রমে একসাথে থাকবে।

যখন আপনার একটি যৌগিক কী থাকে - অর্ডারটি গুরুত্বপূর্ণ হয়ে যায়।

উদাহরণস্বরূপ, কীটি যদি একটি আরোহণ বি হয় আরোহী বি সূচকে আরোহণের মতো কিছু দেখতে পারে:

সারি এবি
1 1 1
2 2 6
3 2 7 
4 3 4
5 3 5
6 3 6
7 5 1

আরোহী বি অবতরণের জন্য একটি প্রশ্নের জন্য সারিগুলি ফেরত পেতে সূচকের চারপাশে ঝাঁপিয়ে পড়তে হবে এবং ধীর হবে be উদাহরণস্বরূপ এটি সারি ফিরে আসবে1, 3, 2, 6, 5, 4, 7

সূচক হিসাবে একই ক্রমের একটি বিস্তৃত ক্যোয়ারী যথাযথভাবে সঠিক ক্রমে সারিগুলি প্রদান করবে।

একটি বিটিরিতে রেকর্ড সন্ধান করতে ও (লগ (এন)) সময় লাগে। ক্রমে বিভিন্ন রেকর্ড সন্ধান করা হ'ল ওলগ (এন) + কে যেখানে কে ফিরে আসার রেকর্ডের সংখ্যা।

যদি রেকর্ডগুলি অর্ডার থেকে বাইরে চলে যায় তবে ব্যয়টি ওলোগ (এন) * কে হিসাবে বেশি হতে পারে


1
ফলস্বরূপ সারি সম্ভবত হওয়া উচিত 1, 3, 2, 6, 5, 4, 7?
jhndodo

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

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

1
বিটিআর থেকে নোডগুলি ক্রমানুসারে আনতে হবে যতক্ষণ না আপনি রান আউট হয়ে যান এবং তারপরে একটি স্তর উপরে এবং পরবর্তী শাখায় নীচে না যান যতক্ষণ না প্রতিটি পাতার সাথে চলতে হবে। এটি ও (এন) অর্ডারের বাইরে এটি অনেক বেশি সিপিইউ নিবিড়।
জারেড কেলস

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

45

সহজ উত্তর আপনি খুঁজছেন যে যে দিক হল শুধুমাত্র গুরুত্বপূর্ণ যখন আপনি দুই বা ততোধিক মাঠে বাছাই করা হয়

আপনি যদি বাছাই করছেন {a : 1, b : -1}:

ইনডেক্স {a : 1, b : 1}হতে হবে তুলনায় ধীর সূচক{a : 1, b : -1}


1
@ মার্কপিইজাক কারণ পুরো
সাজটাকে মেমোরিটিকে

@ সাম্মায়ে আমি মনে করি এটি সঠিক ধারণা, যদিও আমি নিশ্চিত নই যে এটি সম্পূর্ণ ধরণের। আমি বাস্তবায়ন কিভাবে এটি সত্যিই কাজ করে তাকান আছে অনুভব করি, কিন্তু আমি যে ফলাফল ফিরে টানা যেতে পারে অনুসারে সাজানো মনে হবে একটি একা, এবং তারপর অতিরিক্ত সাজানোর মেমরির মধ্যে সম্পন্ন করা করার প্রয়োজন হবে।
জায়েদ মাসুদ

1
হুম, গতবার অদ্ভুতভাবে আমি কোডটি পরীক্ষা করেছিলাম যে এটি বাছাইয়ের কারণে আংশিক প্রকারের বাদ পড়েছিল তবে মেহে, সম্ভবত এটি পরিবর্তন হয়েছে
সামায়ায়ে

আমি যদি বাছাই করছি তবে আমার সূচি {a: -1, b: -1}থাকতে {a: -1, b: -1}হবে বা {a: 1, b: 1}যথেষ্ট হবে।
হুসেন

@ হুসেইন আপনার উদাহরণে {a: 1, b: 1}সূচকটি যথেষ্ট হওয়া উচিত কারণ একটি সূচককে পুরোপুরি উল্টানো ভাল। উদাহরণস্বরূপ সূচকটি {a: 1}এক ধরণের জন্য ব্যবহার করা যেতে পারে{a: -1}
জায়েদ মাসুদ

12

কেন সূচক

দুটি মূল বিষয় বুঝতে হবে।

  1. কোনও সূচকের চেয়ে কোনও সূচকের চেয়ে ভাল, সঠিক সূচকটি যে কোনওটির চেয়ে অনেক ভাল।
  2. মঙ্গোডিবি কেবলমাত্র ক্যোয়ারী অনুসারে একটি সূচক ব্যবহার করবে, আপনি সম্ভবত যা ব্যবহার করতে চান তার যথাযথ ক্ষেত্রের ক্রম দিয়ে যৌগিক সূচক তৈরি করবে।

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

সূচকগুলি কীভাবে

কোন গ্রুপের ক্ষেত্রকে একত্রে সূচিত করা উচিত তা নির্ধারণ করা আপনার চালানো প্রশ্নগুলি বোঝার বিষয়। আপনার সূচক তৈরি করতে ব্যবহৃত ক্ষেত্রগুলির ক্রমটি গুরুত্বপূর্ণ। সুসংবাদটি হ'ল, যদি আপনি আদেশটি ভুল পেয়ে থাকেন তবে সূচকটি মোটেই ব্যবহার করা হবে না, সুতরাং ব্যাখ্যা দিয়ে স্পট করা সহজ হবে।

কেন বাছাই করা হচ্ছে

আপনার প্রশ্নের জন্য বাছাই করতে পারে। তবে বাছাই করা একটি ব্যয়বহুল ক্রিয়াকলাপ হতে পারে, সুতরাং আপনি যে ক্ষেত্রগুলি অনুসন্ধান করছেন এমন ক্ষেত্রের মতো আপনি বাছাই করা ক্ষেত্রগুলির সাথে চিকিৎসা করা গুরুত্বপূর্ণ। সুতরাং এটির সূচক থাকলে এটি আরও দ্রুত হবে। তবে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে, আপনি যে ক্ষেত্রটি বাছাই করছেন তা অবশ্যই আপনার সূচকের শেষ ক্ষেত্র। এই নিয়মের একমাত্র ব্যতিক্রম যদি ক্ষেত্রটিও আপনার ক্যোয়ারির অংশ হয় তবে অবশ্যই সর্বশেষ-বিধি-বিধি প্রয়োগ করা হবে না।

বাছাই কিভাবে

আপনি সূচকের সমস্ত কী বা একটি উপসেটে বাছাই নির্দিষ্ট করতে পারেন; যাইহোক, বাছাই কীগুলি সূচীতে প্রদর্শিত হবে একই ক্রমে তালিকাবদ্ধ থাকতে হবে। উদাহরণস্বরূপ, একটি সূচি কী প্যাটার্ন {a: 1, b: 1 a একটি ধরণের সমর্থন করতে পারে {a: 1, b: 1} তবে {b: 1, a: 1 on এ নয়}

বাছাইয়ের জন্য অবশ্যই তার সমস্ত কীগুলির জন্য সূচক কী প্যাটার্ন হিসাবে একই সাজানোর দিকনির্দেশ (যেমন আরোহী / উতরাই) নির্দিষ্ট করতে হবে বা তার সমস্ত কীগুলির জন্য সূচক কী প্যাটার্ন হিসাবে বিপরীত সাজানোর দিকটি নির্দিষ্ট করতে হবে। উদাহরণস্বরূপ, একটি সূচি কী প্যাটার্ন {a: 1, b: 1 a একটি ধরণের সমর্থন করতে পারে {a: 1, b: 1} এবং {a: -1, b: -1} তবে {a: -1 এ নয় , বি: 1}

মনে করুন এই সূচকগুলি রয়েছে:

{ a: 1 }
{ a: 1, b: 1 }
{ a: 1, b: 1, c: 1 }

Example                                                    Index Used
db.data.find().sort( { a: 1 } )                            { a: 1 }
db.data.find().sort( { a: -1 } )                           { a: 1 }
db.data.find().sort( { a: 1, b: 1 } )                      { a: 1, b: 1 }
db.data.find().sort( { a: -1, b: -1 } )                    { a: 1, b: 1 }
db.data.find().sort( { a: 1, b: 1, c: 1 } )                { a: 1, b: 1, c: 1 }
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } )   { a: 1, b: 1 }

আমি বুঝতে পারি যে এটি একটি উদাহরণ তবে { a: 1, b: 1, c: 1 }সূচি থাকলে আপনার কী সত্যিই সূচকের প্রয়োজন { a: 1}এবং { a: 1, b: 1}বা সূচি { a: 1, b: 1, c: 1 }সমস্ত ক্ষেত্রে কভার করে? যদি অনুসন্ধানগুলি সর্বদা একই ধরণের ব্যবহার করে: 1 -1
-র

1
যদি কেবলমাত্র 'এ' সম্পত্তি নিয়ে কাজ করে এমন অনেকগুলি প্রশ্ন রয়েছে তবে 3 টি বৈশিষ্ট্য 'এ', 'বি', 'সি' দিয়ে সূচক দ্বারা অনুসন্ধান করার চেয়ে ডাটাবেস ইঞ্জিনের জন্য 'ক' সম্পত্তি সহ সূচীটি অনুসন্ধান করা তত দ্রুত। কারণ সূচকের আকার বৃদ্ধি পাবে এবং গণনাও বৃদ্ধি পাবে। প্রাক্তন। 20 টি অধ্যায় আছে বই। সুতরাং অধ্যায় 3 এবং তারপরে নির্দিষ্ট পৃষ্ঠায় যাওয়া আরও দ্রুত। @ লুকাসলিজিস
সোমনাথ মুলুক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.