উত্পাদন কোডে মঙ্গুজ সূচীকরণ


124

এর জন্য এবং / : মঙ্গুজের নথিপত্র প্রতিMongooseJSMongoDBNode.js

আপনার অ্যাপ্লিকেশন শুরু হয়ে গেলে, মঙ্গুজ স্বয়ংক্রিয়ভাবে ensureIndexআপনার স্কিমাতে প্রতিটি সংজ্ঞায়িত সূচীর জন্য কল করে । বিকাশের পক্ষে দুর্দান্ত হলেও, প্রস্তাব দেওয়া হয় যে এই আচরণটি উত্পাদনে অক্ষম থাকায় সূচক তৈরির কারণে কার্যকর পারফরম্যান্সের প্রভাব হতে পারে। autoIndexআপনার স্কিমা বিকল্পটি মিথ্যা হিসাবে সেট করে আচরণটি অক্ষম করুন ।

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

প্রোডাকশন কোডে ইনডেক্সিং পরিচালনা করার সঠিক উপায় কী? হয়তো কোনও বাহ্যিক স্ক্রিপ্টের সূচি তৈরি করা উচিত? অথবা সম্ভবত ensureIndexঅপ্রয়োজনীয় যদি কোনও একক অ্যাপ্লিকেশন কোনও সংকলনের একমাত্র পাঠক / লেখক কারণ এটি প্রতিবারই কোনও ডিবি লেখার সূচকটি চালিয়ে যাবে?

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

উত্তর:


135

আমি কখনই বুঝতে পারি নি যে কেন মোঙ্গুজ ডকুমেন্টেশন এত ব্যাপকভাবে autoIndexউত্পাদন নিষ্ক্রিয় করার পরামর্শ দেয় s একবার সূচক যুক্ত হয়ে গেলে, পরবর্তী ensureIndexকলগুলি সহজেই দেখতে পাবে যে সূচকটি ইতিমধ্যে বিদ্যমান এবং তারপরে ফিরে আসবে। সুতরাং আপনি যখন প্রথম সূচকটি তৈরি করছেন কেবল তখনই এটির পারফরম্যান্সের উপর প্রভাব পড়বে এবং সেই সময়ে সংগ্রহগুলি প্রায়শই খালি থাকে তাই সূচি তৈরি করা যে কোনও উপায়ে দ্রুত হবে।

আমার পরামর্শটি autoIndexসক্ষম হওয়া ছাড়াই যদি আপনার নির্দিষ্ট পরিস্থিতি না থাকে যেখানে এটি আপনাকে সমস্যা দিচ্ছে; যেমন আপনি যদি একটি বিদ্যমান সংগ্রহটিতে একটি নতুন সূচক যুক্ত করতে চান যার লক্ষ লক্ষ ডক রয়েছে এবং আপনি এটি তৈরি হওয়ার পরে আরও নিয়ন্ত্রণ চান।


10
আমার যোগ করার একটি প্রশ্ন আছে ... আমি যদি এটি মিথ্যা সেট করি তবে কী হবে? আমি ডেটা sertোকানোর সময় সূচিগুলি তৈরি করা হবে বা আমার স্পষ্টভাবে এটি তৈরি করার দরকার নেই। আমি দুঃখিত যদি এটি একটি আশ্চর্যজনক প্রশ্ন হয় তবে আপনি যদি উত্তর দেন তবে এটি সত্যই সহায়ক হবে।
শরণশ মহাপাত্র

5
@ সরণসমোহাপাত্র যখন autoIndexমিথ্যা হয়, আপনার সূচকগুলি তৈরি করতে আপনার মডেলটিতে নিশ্চিত ইন্ডেক্সকে কল করতে হবে ।
জনিএইচকে

আমি প্রতিবার কল করতে হবে বা একবার মাত্র মডেল সংজ্ঞায়িত করতে হবে?
সরশ মহাপাত্র

@ সরণস মোহাপাত্র যখন আপনি আপনার মডেলটি সংজ্ঞায়িত (সংকলন) করেন। আমি প্রথম অ্যাপটি শুরু করার সময় এটি করি do এখন আপনার কঠোর পরিকল্পনার ক্ষেত্রে সমস্ত সূচকে বাদ দিয়ে পুনরায় তৈরি করার সিদ্ধান্ত নেওয়া কঠিন the
মস

3
@ জোহনিএইচকে আপনি কি এখনও আপনার উত্তরটির সাথে একমত হয়েছিলেন যে এখন প্রায় 2016?
আলেকজান্ডার মিলস

41

যদিও আমি স্বীকৃত উত্তরের সাথে একমত, তবে এটি লক্ষণীয় যে মঙ্গোডিবি ম্যানুয়াল অনুসারে , এটি কোনও প্রোডাকশন সার্ভারে সূচি যোগ করার প্রস্তাবিত উপায় নয়:

যদি আপনার অ্যাপ্লিকেশনটিতে ইন্ডেক্স () অপারেশনগুলি অন্তর্ভুক্ত থাকে এবং অন্যান্য অপারেশনাল উদ্বেগের জন্য একটি সূচক উপস্থিত না থাকে তবে সূচকটি তৈরি করা ডাটাবেসের কার্যকারিতাতে মারাত্মক প্রভাব ফেলতে পারে।

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

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

এটি ছাড়াও, গৃহীত উত্তর থেকে:

সুতরাং আপনি যখন প্রথম সূচকটি তৈরি করছেন কেবল তখনই এটির পারফরম্যান্সের উপর প্রভাব পড়বে এবং সেই সময়ে সংগ্রহগুলি প্রায়শই খালি থাকে তাই সূচি তৈরি করা যে কোনও উপায়ে দ্রুত হবে।

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

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

db.ensureIndex({ name: 1 }, { background: true });

3
ঠিক আছে, সুতরাং আপনাকে যতটা করতে হবে তা হ'ল আপনার সার্ভারটি শুরু না করা অবধি প্রতিটি সংগ্রহের জন্য সমস্ত ইন্ডেক্সের কলব্যাকগুলি সরিয়ে না দেওয়া পর্যন্ত।
আলেকজান্ডার মিলস 9

@ অ্যালেক্সমিলস কীভাবে আপনি এটি নিশ্চিত করেন?
একাকী

async.each (Object.keys (মডেল), ফাংশন (কী, CB) {মডেল [Key] .ensureIndexes (CB)}, CB)
আলেকজান্ডার মিলস

প্রতিটি মঙ্গুজ মডেলের সুনির্দিষ্ট ইনডেক্সগুলি কল করুন, সমস্ত শেষ হওয়ার জন্য অপেক্ষা করুন, তারপরে আপনার সার্ভারটি শুরু করুন; আমি আপনার সার্ভারটি শুরু করার আগে ডিবি সংযোগ হওয়ার জন্য অপেক্ষা করারও পরামর্শ দিচ্ছি
আলেকজান্ডার মিলস

2
সেখানে নেই ensureIndexআর। নেই createIndexপরিবর্তে। আমি কি সঠিক?
জ্যাক ফাঁকা

1

উত্পাদন মোড পরিচালনা করতে এই ব্লক কোডটি ব্যবহার করুন:

const autoIndex = process.env.NODE_ENV !== 'production';
mongoose.connect('mongodb://localhost/collection', { autoIndex });
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.