ইন্ডেক্স ওভারভিউ

এই পৃষ্ঠায় Cloud Firestore-এর জন্য ইন্ডেক্সিংয়ের বিবরণ দেওয়া আছে। Cloud Firestore ডিফল্ট হিসেবে কোনও ইন্ডেক্স তৈরি করে না। ডেটাবেসের পারফর্ম্যান্স উন্নত করতে, আপনার সবচেয়ে বেশি ব্যবহৃত কোয়েরির জন্য ইন্ডেক্স তৈরি করুন।

ডেটাবেসের পারফর্ম্যান্সের উপর ইন্ডেক্সের বড় প্রভাব থাকে। কোনও কোয়েরির জন্য ইনডেক্স থাকলে, ডেটাবেস স্ক্যান করার জন্য প্রয়োজনীয় ডেটার পরিমাণ কমিয়ে এবং ফলাফল সাজানোর জন্য প্রয়োজনীয় কাজ কমিয়ে, ডেটাবেস দক্ষতার সাথে ফলাফল ফেরত দিতে পারে। তবে, ইনডেক্স এন্ট্রি স্টোরেজের খরচ এবং ইনডেক্স করা ফিল্ডে রাইট অপারেশন চলাকালীন কাজের পরিমাণ বাড়িয়ে দেয়।

ইনডেক্সের সংজ্ঞা ও স্ট্রাকচার

একটি ইনডেক্সে নিম্নলিখিতগুলি থাকে:

  • একটি কালেকশন আইডি
  • প্রদত্ত সংগ্রহে ফিল্ডের তালিকা
  • প্রতিটি ফিল্ডের জন্য ঊর্ধ্বক্রম বা অধঃক্রম অনুযায়ী সাজানো

এছাড়াও, কোনও ইন্ডেক্স স্পার্স, মাল্টিকি বা অনন্য বিকল্প চালু করতে পারে।

ইনডেক্স অর্ডারিং

প্রতিটি ফিল্ডের ক্রম এবং সাজানোর দিকনির্দেশ অনন্যভাবে ইন্ডেক্সকে সংজ্ঞায়িত করে। যেমন, নিম্নলিখিত ইনডেক্সগুলি হল দুটি আলাদা ইনডেক্স এবং এগুলি একে অপরের পরিবর্তে ব্যবহার করা যায় না:

সংগ্রহ ফিল্ড
শহর দেশ (ঊর্ধ্বক্রম), জনসংখ্যা (নিম্নক্রম)
শহর জনসংখ্যা (নিম্নক্রম), দেশ (ঊর্ধ্বক্রম),

কোনও কোয়েরি সাপোর্ট করার জন্য ইন্ডেক্স তৈরি করার সময়, আপনার কোয়েরির মতো একই ক্রমে ফিল্ডগুলি অন্তর্ভুক্ত করুন।

ইনডেক্স ডেনসিটি

ডিফল্ট হিসেবে, ইন্ডেক্স এন্ট্রি কোনও সংগ্রহের সব ডকুমেন্ট থেকে ডেটা স্টোর করে। এটি নন-স্পার্স ইন্ডেক্স হিসেবে পরিচিত। ডকুমেন্টে ইন্ডেক্সে উল্লেখ করা কোনও ফিল্ড থাকুক বা না থাকুক, ডকুমেন্টের জন্য একটি ইন্ডেক্স এন্ট্রি যোগ করা হবে। ইনডেক্স এন্ট্রি তৈরি করার সময়, অস্তিত্বহীন ফিল্ডকে NULL ভ্যালু হিসেবে বিবেচনা করা হয়। এই আচরণ পরিবর্তন করতে, আপনি ইনডেক্সকে স্পার্স ইনডেক্স হিসেবে সংজ্ঞায়িত করতে পারেন।

স্পার্স ইন্ডেক্স

স্পার্স ইনডেক্স শুধুমাত্র সেইসব ডকুমেন্ট ইনডেক্স করে যেগুলি সংগ্রহে থাকে এবং যেগুলিতে ইনডেক্স করা ফিল্ডের মধ্যে অন্তত একটির জন্য ভ্যালু (নাল সহ) থাকে। স্পার্স ইনডেক্স স্টোরেজের খরচ কমায় এবং পারফর্ম্যান্স উন্নত করতে পারে।

অ্যারে ভ্যালুর জন্য মাল্টিকি ইন্ডেক্স

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

অ্যারে ভ্যালু ইন্ডেক্স করতে হবে বলে আপনি জানলে তবেই মাল্টি-কী ইন্ডেক্স ব্যবহার করুন। কোয়েরি প্রসেস করার সময় রেগুলার ইন্ডেক্স ব্যবহার করলে সুবিধা হয়। যেমন, রেগুলার ইনডেক্স আরও দক্ষতার সাথে একটি রেঞ্জের মধ্যে মান ফিল্টার করতে পারে।

অ্যারে ভ্যালু ও মাল্টিকি ইন্ডেক্স নিয়ে কাজ করার সময় নিম্নলিখিত পরিস্থিতিতে সমস্যা দেখা দেয়:

  • একটি অপারেশন, রেগুলার ইন্ডেক্স দ্বারা ইন্ডেক্স করা ফিল্ডে অ্যারে ভ্যালু যোগ করার চেষ্টা করে। অ্যারে ভ্যালু যোগ করতে, আপনাকে অবশ্যই সেই ফিল্ডে আগে থেকে থাকা রেগুলার ইনডেক্স মুছে ফেলতে হবে এবং মাল্টিকি ইনডেক্স হিসেবে সেগুলি আবার তৈরি করতে হবে।
  • আপনি এমন একটি ফিল্ডে রেগুলার ইন্ডেক্স তৈরি করার চেষ্টা করছেন যাতে অ্যারে ভ্যালু আছে। আপনাকে হয় মাল্টিকি ইন্ডেক্স তৈরি করতে হবে অথবা অ্যারে ভ্যালু মুছে দিতে হবে।
  • অ্যারে ভ্যালু সহ একাধিক ফিল্ড ইন্ডেক্স করার জন্য একটি অপারেশন চেষ্টা করে। মাল্টিকি ইনডেক্সে অ্যারে ভ্যালু সহ একাধিক ফিল্ড থাকতে পারে না। এগিয়ে যেতে, আপনার ডেটা মডেল বা ইন্ডেক্স সংজ্ঞা পরিবর্তন করুন।
  • আপনি এমন একটি মাল্টিকি ইন্ডেক্স তৈরি করার চেষ্টা করছেন যেখানে দুটি ফিল্ড পাথ users.posts এবং users.zip-এর মতো একটি সাধারণ প্রিফিক্স শেয়ার করে।

অনন্য ইন্ডেক্স

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

অনন্য ইন্ডেক্সে অনুপস্থিত ফিল্ড

আপনি যদি অনন্য সূচকের জন্য অনুপস্থিত ফিল্ড সহ একটি ডকুমেন্ট যোগ করেন, তাহলে সূচকটি অনুপস্থিত ফিল্ডের জন্য null মান সেট করে। ফলাফল হিসেবে পাওয়া ইন্ডেক্স এন্ট্রি অনন্য হতে হবে অথবা অপারেশনটি ব্যর্থ হবে।

যেমন, এই ইন্ডেক্সের মাধ্যমে:

db.cities.createIndex( { "name": 1 }, { unique: true } )

আপনি যদি কালেকশনে {"abbreviation": "LA"} ডকুমেন্ট যোগ করেন, তাহলে অনন্য ইন্ডেক্স null-এ সেট করা name-এর সাথে একটি এন্ট্রি তৈরি করে। এরপর আপনি যদি ডকুমেন্ট {"abbreviation": "NYC"} যোগ করার চেষ্টা করেন, তাহলে অপারেশনটি ব্যর্থ হয় কারণ অনন্য সূচকের জন্য ফলাফল এন্ট্রি একই থাকে।

একাধিক ফিল্ড সহ অনন্য ইন্ডেক্সের ক্ষেত্রেও একই আচরণ প্রযোজ্য হয়। কোনও ডকুমেন্ট তৈরি বা আপডেট করার সময়, ইন্ডেক্স করা ফিল্ড না থাকলে সেটি null হিসেবে সেট করা হয় এবং এর ফলে তৈরি হওয়া ইন্ডেক্স এন্ট্রি ইন্ডেক্সে অনন্য হতে হবে।

অ্যারে ভ্যালুতে অনন্য ইনডেক্স

ডকুমেন্টে যাতে ওভারল্যাপ করা অ্যারে এলিমেন্ট না থাকে তা এনফোর্স করতে অনন্য মাল্টিকি ইন্ডেক্স ব্যবহার করা যেতে পারে।

এই ধরনের ইন্ডেক্স কোনও অ্যারের মধ্যে থাকা একক ডকুমেন্টে অনন্য ভ্যালু আছে কিনা তা এনফোর্স করে না।

যেমন, অনন্য ইন্ডেক্স সহ:

db.collection.createIndex( { "tags": 1 }, { unique: true } )

নিম্নলিখিত ডকুমেন্ট যোগ করার জন্য উপযুক্ত:

{
  "_id": 1,
  "tags": [ "news", "tech", "news", "music" ]
}

ইনডেক্স, একটি ডকুমেন্টের একই অ্যারের মধ্যে ডুপ্লিকেট ভ্যালু ("news") অনুমতি দেয়।

আপনি যদি ডুপ্লিকেট এলিমেন্ট সহ দ্বিতীয় ডকুমেন্ট যোগ করার চেষ্টা করেন, তাহলে অপারেশনটি ব্যর্থ হবে:

{
  "_id": 2,
  "tags": [ "sports", "music" ]
}

অপারেশনটি ব্যর্থ হয়েছে কারণ "music" ইতিমধ্যেই ডকুমেন্ট 1-এর অ্যারেতে উপস্থিত এবং ইন্ডেক্সে ম্যাপ করা হয়েছে।

একই ডকুমেন্টের মধ্যে একই অ্যারের এলিমেন্টগুলি অনন্য কিনা তা নিশ্চিত করতে হলে, আপনার অ্যাপ্লিকেশন লজিকে $push-এর পরিবর্তে $addToSet-এর মতো আপডেট করার অপারেটর ব্যবহার করে এটি ম্যানেজ করুন।

খালি অ্যারে, অনুপস্থিত ফিল্ড এবং শূন্য মান

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

  • খালি অ্যারে, অনুপস্থিত ফিল্ড এবং স্ট্যান্ডঅ্যালোন নাল: অ্যারে ফিল্ড খালি থাকলে, সম্পূর্ণ অনুপস্থিত থাকলে অথবা স্ট্যান্ডঅ্যালোন null ভ্যালু (অ্যারের মধ্যে নয়) থাকলে, ডকুমেন্টের জন্য কোনও ইন্ডেক্স কী তৈরি হয় না। তাই, ডুপ্লিকেট কী সংক্রান্ত সমস্যা ট্রিগার না করেই একাধিক ডকুমেন্টে খালি ফিল্ড বা স্ট্যান্ডঅ্যালোন null ভ্যালু থাকতে পারে।
  • অ্যারের মধ্যে নাল এলিমেন্ট: অ্যারেতে এলিমেন্ট হিসেবে null ভ্যালু থাকলে (যেমন, ["news", null]), null এলিমেন্ট ইন্ডেক্স করা হয়। ইনডেক্স করা অ্যারে ফিল্ডে null এলিমেন্ট আছে এমন পরবর্তী কোনও ডকুমেন্ট ডুপ্লিকেট কী সংক্রান্ত সমস্যার কারণে ব্যর্থ হবে।

TTL ইনডেক্স

আপনার ডেটাবেস থেকে পুরনো ডেটা অটোমেটিক সরাতে TTL ইনডেক্স ব্যবহার করুন। একটি TTL ইন্ডেক্স একটি নির্দিষ্ট ফিল্ডকে একটি নির্দিষ্ট সংগ্রহে ডকুমেন্টের মেয়াদ শেষ হওয়ার সময় হিসাবে মনোনীত করে। TTL-এর মাধ্যমে, আপনি পুরনো ডেটা মুছে দিয়ে স্টোরেজের খরচ কমাতে পারবেন। সাধারণত ডেটা মেয়াদ শেষ হওয়ার ২৪ ঘণ্টার মধ্যে মুছে ফেলা হয়।

ইনডেক্স তৈরি করার সময় হওয়া সমস্যার সমাধান করা

আপনার ইন্ডেক্স ম্যানেজ করার সময় ইন্ডেক্স তৈরি সংক্রান্ত সমস্যা হতে পারে। ডেটাবেসে ডেটা সংক্রান্ত কোনও সমস্যা হলে, ইনডেক্সিং অপারেশন ব্যর্থ হতে পারে। নিম্নলিখিত কারণে ইন্ডেক্সিং অপারেশন ব্যর্থ হতে পারে:

  • আপনি ইনডেক্স করার সীমায় পৌঁছে গেছেন। যেমন, অপারেশনটি হয়ত প্রতি ডকুমেন্টে সর্বাধিক সংখ্যক ইন্ডেক্স এন্ট্রিতে পৌঁছে গেছে। ইনডেক্স তৈরি করা না গেলে, আপনি একটি ত্রুটি মেসেজ দেখতে পাবেন। আপনি ইন্ডেক্স সীমায় না পৌঁছে থাকলে, ইন্ডেক্স অপারেশন আবার চেষ্টা করুন।
  • মাল্টিকি ইন্ডেক্স প্রয়োজন। অন্তত একটি ইন্ডেক্স করা ফিল্ডে অ্যারে ভ্যালু আছে। এগিয়ে যেতে, আপনাকে অবশ্যই মাল্টিকি ইন্ডেক্স ব্যবহার করতে হবে অথবা অ্যারে ভ্যালু মুছে দিতে হবে।
  • অ্যারে ভ্যালু সহ একাধিক ফিল্ড ইন্ডেক্স করার জন্য একটি অপারেশন চেষ্টা করে। মাল্টিকি ইনডেক্সে অ্যারে ভ্যালু সহ একাধিক ফিল্ড থাকতে পারে না। এগিয়ে যেতে, আপনার ডেটা মডেল বা ইন্ডেক্স সংজ্ঞা পরিবর্তন করুন।
  • আপনি অনন্য ইন্ডেক্স বিকল্প সেট করেছেন এবং ইন্ডেক্স করা ফিল্ডের ডেটা ডুপ্লিকেট ইন্ডেক্স এন্ট্রি তৈরি করবে। এগিয়ে যেতে, ডেটা থেকে ডুপ্লিকেট ভ্যালুর কম্বিনেশন সরিয়ে দিন।

এর পরে কী করতে হবে