এই নিবন্ধে, আপনি শিখবেন কিভাবে রেলে ডাটাবেসের কার্যকারিতা পরীক্ষা করা যায় এবং কিছু সাধারণ ডাটাবেস কর্মক্ষমতা সমস্যার সমাধান করা যায়।
আপনি যখন একটি Rails অ্যাপ্লিকেশন বিকাশ করেন, তখন ActiveRecord হল ডিফল্ট টুল যা আপনার ডাটাবেস পরিচালনা করে। ActiveRecord .where এর মত কমান্ড ব্যবহার করে অনুসন্ধান এবং ডেটা সন্নিবেশ করার জন্য একটি সহজ এবং দ্রুত ইন্টারফেস প্রদান করে , .save , .create , এবং .update . রেল এই কমান্ডগুলিকে এসকিউএল কোয়েরিতে রূপান্তর করার কাজ করে, যা একটি ভাল জিনিস, তবে কখনও কখনও কর্মক্ষমতা সমস্যা সৃষ্টি করতে পারে। এটি গুরুত্বপূর্ণ যে আপনি কিছু সাধারণ সমস্যা এবং কীভাবে পারফরম্যান্স অপ্টিমাইজ করবেন তা বোঝা।
রুবি অন রেলে ActiveRecord-এ একটি দ্রুত নোট
Rails ActiveRecord হল মডেল-ভিউ-কন্ট্রোলার (MVC) এর একটি স্তর যা আপনার ডাটাবেসকে ব্যবসায়িক বস্তু হিসাবে উপস্থাপন করে পরিচালনা করে। ActiveRecord প্যাটার্ন একটি অ্যাপ্লিকেশনের বস্তুকে রিলেশনাল ডাটাবেস টেবিল ম্যানেজমেন্ট সিস্টেমের সাথে সংযুক্ত করতে ORM কৌশল ব্যবহার করে।
এখন, চলুন শুরু করা যাক!
রেলে ডাটাবেস পারফরম্যান্স সমস্যা সনাক্ত এবং পরীক্ষা করার 3 উপায়
1. ActiveRecord প্রশ্নে ব্যাখ্যা চালান
একটি ব্যাখ্যা বিবৃতি একটি এসকিউএল কোয়েরির কার্যকরী পরিকল্পনা সম্পর্কে তথ্য প্রদর্শন করে - কিভাবে একটি ক্যোয়ারী কার্যকর করা হবে, কতগুলি সারি স্ক্যান করা হবে, কোন সূচক ব্যবহার করা হবে এবং কীভাবে টেবিল যুক্ত করা হবে।
এক্সিকিউশন প্ল্যান আমাদেরকে বুঝতে সাহায্য করে যে কোন বিষয়গুলি দেখে প্রশ্ন সম্পাদনকে ধীর করে দেয়:
- কোনো প্রশ্নের কর্মক্ষমতা উন্নত করতে আপনার কোন সূচক যোগ করা উচিত।
- যদি সারণিগুলো একটি সর্বোত্তম ক্রমে যুক্ত করা হয়। আপনি
STRAIGHT_JOINব্যবহার করতে পারেন আরও ভালো পারফরম্যান্সের জন্য যোগদানের বিবৃতিতে টেবিলের ক্রম জোর করে।
SELECT, DELETE, INSERT, REPLACE এবং UPDATE বিবৃতিতেও কাজ করে ব্যাখ্যা করুন৷
ActiveRecord এর সাথে ব্যাখ্যা ব্যবহার করা খুবই সহজবোধ্য। নিম্নলিখিত লিখুন:
.explain যোগ করা হচ্ছে কমান্ডের শেষে ActiveRecord কমান্ডের জন্য ক্যোয়ারী প্ল্যান প্রদান করে। উপরের উদাহরণটি একটি খুব সাধারণ প্রশ্ন যা id ব্যবহার করে (প্রাথমিক কী) টেবিলটি জিজ্ঞাসা করতে। explain এর আউটপুট বিবৃতি দেখায় যে এটি pkey ব্যবহার করছে . এটি থেকে, আপনি নিশ্চিত হতে পারেন যে বিবৃতিটি সর্বোত্তম এবং দ্রুত।
আপনি একটি .explain যোগ করার চেষ্টা করতে পারেন ব্যবহার করা সূচী সহ কার্যকর করার ক্রম উন্মোচন করার জন্য আপনার ধীরগতির প্রশ্নের আদেশ দিন। যদি ক্যোয়ারী প্ল্যান Seq Scan দেখায় , সূচী ব্যবহার করা হচ্ছে না এবং একটি ক্যোয়ারী পরিবর্তন বা একটি নতুন সূচী যোগ করা প্রয়োজন৷
এখানে যোগদানের সাথে আরেকটি উদাহরণ রয়েছে:
এখানে, ব্যবহারকারী টেবিলটি সহযোগিতা টেবিলের সাথে যুক্ত হয়েছে। যখন আপনি ক্যোয়ারী প্ল্যানটি দেখেন, তখন সহযোগিতা টেবিলটি seq scan ব্যবহার করছে এবং প্রথমে নির্বাহ করা হচ্ছে — যেখানে ব্যবহারকারী টেবিলটি pkey ব্যবহার করছে সূচক এবং পরে নির্বাহ করা হয়। আপনি user_id-এ একটি সূচী যোগ করতে পারেন এই ক্যোয়ারীটি অপ্টিমাইজ করতে সহযোগিতার সারণীতে কলাম। ব্যাখ্যা কোয়েরি ভাঙতে সাহায্য করে, যাতে আপনি কোথায় অপ্টিমাইজেশান প্রয়োজন তা বের করতে পারেন।
2. কী ডাটাবেস মেট্রিক্স পরিমাপ করুন
একটি ক্যোয়ারী কার্যকারিতা কিনা তা পরিমাপ করার জন্য ক্যোয়ারী টাইম একমাত্র মেট্রিক নয় — অন্যান্য ডাটাবেস মেট্রিক্স দেখুন, যার মধ্যে রয়েছে:
- CPU ব্যবহার
- মেমরি ব্যবহার
- ওয়েটিং IO এর জন্য ডিস্ক সারি
- ইনবাউন্ড এবং আউটবাউন্ড ট্রাফিকের জন্য নেটওয়ার্ক ব্যান্ডউইথ
- উপলব্ধ ডিস্ক স্থান
- থ্রুপুট
এই মেট্রিকগুলি একটি নির্দিষ্ট থ্রেশহোল্ড অতিক্রম করলে কোয়েরি ধীর হতে পারে। পারফরম্যান্স সমস্যাগুলি বোঝার জন্য আপনাকে একটি সময়সীমা জুড়ে একটি ডেটা পয়েন্ট দেখতে হবে৷
ডেটা পয়েন্ট যা পরিমাপ করা প্রয়োজন তা অনেকগুলি কারণের উপর নির্ভর করে, যেমন:
-
ডাটাবেস প্রকার:
- সম্পর্কীয়
- ইন-মেমরি
- No-SQL
- ডেটা-ওয়্যারহাউস
-
কিভাবে সার্ভার হোস্ট করা হয়:
- অন-প্রাঙ্গনে
- মেঘে
ডাটাবেস মেট্রিক্স নিরীক্ষণ করার কোন একক উপায় নেই — এটি বিভিন্ন কারণের উপর নির্ভর করে।
3. AppSignal
ব্যবহার করে রেল অ্যাপের কর্মক্ষমতা পরিমাপ করুনএকটি কেন্দ্রীয় স্থান ছাড়া আপনার সমস্ত কর্মক্ষমতা মেট্রিক্স পরিচালনা করা কঠিন হতে পারে যা আপনাকে সমস্ত প্রশ্নের দৃশ্যমানতা দেয়। প্রতিটি কোড ব্লকে পারফরম্যান্স কোড যোগ করা কষ্টকর এবং নিয়ন্ত্রণহীন হতে পারে।
AppSignal-এর মতো টুলের সাহায্যে আপনি সহজেই আপনার অ্যাপ্লিকেশনে কর্মক্ষমতা পরিমাপকে একীভূত করতে পারেন। AppSignal বাক্সের বাইরে রেল সমর্থন করে। 'AppSignal for Ruby' ডকুমেন্টেশন থেকে সহজ AppSignal ইনস্টলেশন প্রক্রিয়া সম্পর্কে জানুন৷
কিছু গুরুত্বপূর্ণ মেট্রিক্সের উপর নজর রাখতে হবে:
- ধীরগতির প্রশ্নগুলি
- থ্রুপুটের উপর ভিত্তি করে ডাটাবেস কর্মক্ষমতা
- N+1 প্রশ্ন
- ডেটাবেস লেটেন্সি
- সক্রিয় সংযোগের সংখ্যা
এখানে একটি AppSignal ড্যাশবোর্ড দেখতে কেমন হতে পারে:

রেল ডাটাবেস পারফরম্যান্সে রুবি অপ্টিমাইজ করার 7 উপায়
1. N+1 ক্যোয়ারী
এর জন্য আগ্রহী লোড হচ্ছে
N+1 প্রশ্ন হল সবচেয়ে সাধারণ ডাটাবেস কর্মক্ষমতা সমস্যা। আসুন একটি N+1 এর উদাহরণ দেখি ক্যোয়ারী যেখানে আপনার দুটি মডেল আছে — ব্যবহারকারী এবং প্রকল্প:
এখন, আপনি যদি ব্যবহারকারী এবং প্রকল্পের নাম খুঁজে পেতে চান, তাহলে নিম্নলিখিত কোডটি চালান:
উপরের কোডটি প্রতিটি লুপের সাথে ডাটাবেসকে জিজ্ঞাসা করবে এবং কর্মক্ষমতা সমস্যা সৃষ্টি করবে। সম্পাদিত প্রশ্নের মোট সংখ্যা হবে ব্যবহারকারীর সংখ্যা + 1।
এই সমস্যাটি দূর করা খুব সহজ:অ্যাসোসিয়েশনটি লোড করতে আগ্রহী। শুধু .includes(:projects) যোগ করুন প্রশ্নের শেষে:
এখন, লুপ চালানো ডাটাবেসকে জিজ্ঞাসা করবে না, কারণ উপরের ক্যোয়ারীটি প্রকল্পগুলিকে লোড করে:
রেল 6.1 অ্যাসোসিয়েশনটি অ্যাক্সেস করার আগে লোড করতে আগ্রহী তা নিশ্চিত করতে কঠোর লোডিং প্রদান করে। কঠোর লোডিং সক্ষম করতে, মডেলটিতে নিম্নলিখিত লাইনটি যুক্ত করুন:
এখন, যখন আপনি আগ্রহী লোড না করেই প্রকল্পগুলি অ্যাক্সেস করার চেষ্টা করবেন, রেলগুলি একটি ActiveRecord::StrictLoadingViolationError নিক্ষেপ করবে ব্যতিক্রম।
যদি আপনার কাছে রেল 6.1 না থাকে তবে আপনি বুলেটের মতো রত্ন ব্যবহার করতে পারেন।
2. একটি ডাটাবেস সূচক ব্যবহার করুন
ডাটাবেসগুলি দ্রুত ডেটা পুনরুদ্ধার করতে সাহায্য করার জন্য সূচী প্রদান করে। ব্যাখ্যা কমান্ড ব্যবহার করে যেটি আমরা আগে কভার করেছি, আপনি একটি ক্যোয়ারী একটি সঠিক সূচক ব্যবহার করছে কিনা তা নির্ধারণ করতে সক্ষম হবেন৷
আপনি ইতিমধ্যে বিদ্যমান সূচী বা একটি যোগ করা সূচক ব্যবহার করতে একটি ধীরগতির ক্যোয়ারী পরিবর্তন করতে পারেন যা কর্মক্ষমতা উন্নত করতে সাহায্য করে।
MySQL-এ চারটি ভিন্ন ধরনের সূচী রয়েছে:
- প্রাথমিক কী - সূচক স্বয়ংক্রিয়ভাবে প্রাথমিক কীতে যুক্ত হয়, যা নিশ্চিত করে যে এটি অনন্য
- অনন্য - অনন্য কী সূচক নিশ্চিত করে যে একটি বৈশিষ্ট্যে যোগ করা আইটেমগুলি সর্বদা অনন্য হয়
- সূচী - প্রাথমিক কী ব্যতীত অন্যান্য বৈশিষ্ট্যগুলিতে যোগ করা হয়েছে
- সম্পূর্ণ পাঠ্য - অক্ষর-ভিত্তিক ডেটার বিরুদ্ধে প্রশ্ন করতে সাহায্য করে
একটি সূচী একটি বি-ট্রি বা একটি হ্যাশ বিন্যাসে সংরক্ষণ করা হয়৷
৷সূচীগুলি একটি একক ক্ষেত্রে যোগ করা যেতে পারে বা একাধিক ক্ষেত্রের সংমিশ্রণ হিসাবে তৈরি করা যেতে পারে। একটি যৌগিক সূচক একাধিক ক্ষেত্র অন্তর্ভুক্ত কোয়েরি অপ্টিমাইজ করার জন্য দরকারী। যখন শুধুমাত্র একটি সূচক ব্যবহার করা হয়, তখন এটির জন্য একটি বড় ডেটাসেট স্ক্যান প্রয়োজন৷
উদাহরণস্বরূপ, নিম্নলিখিত ক্যোয়ারীতে, দুটি ক্ষেত্র রয়েছে:
"abc" প্রকল্পে অনেক ব্যবহারকারী থাকতে পারে এবং দেশের মাঠ স্ক্যান করা হবে। বড় ফলাফল ডেটাসেটের কারণে এটি একটি ধীর প্রক্রিয়া হতে পারে। এই ক্ষেত্রে, আপনি কর্মক্ষমতা উন্নত করতে প্রকল্প এবং দেশ উভয় ক্ষেত্রেই একটি যৌগিক সূচক যোগ করতে পারেন।
আপনি নিম্নলিখিত ActiveRecord মাইগ্রেশন কমান্ডের সাথে Rails-এ সূচী যোগ করতে পারেন:
একক সূচক:
যৌগিক সূচক:
3. সীমা ব্যবহার করুন
যত বেশি রেকর্ড ফেরত দেওয়া হয়, তত ধীর কর্মক্ষমতা পেতে পারে। একটি একক প্রশ্নের চেয়ে একাধিক কোয়েরি করা ভালো যা একটি বড় ডেটা সেট ফেরত দেয়৷
৷পরবর্তী 100টি ব্যাচ আনতে, আপনি অফসেট ব্যবহার করতে পারেন:
এটি উল্লেখযোগ্যভাবে কর্মক্ষমতা উন্নত করবে। মনে রাখতে হবে যে একটি উচ্চ অফসেট সঙ্গে, একটি প্রশ্ন ধীর হয়ে যায়. অফসেটে একটি সীমা যোগ করুন৷
৷4. find_each ব্যবহার করুন একটি বড় সংখ্যক আইটেম লোড করতে
রেকর্ডের উপর পুনরাবৃত্তি করার সময়, ভাল পারফরম্যান্সের জন্য তাদের রেলে ব্যাচ করুন:
এটি ডাটাবেসের সমস্ত রেকর্ড একবার জিজ্ঞাসা করবে এবং মেমরি এবং ডাটাবেসের কর্মক্ষমতা সমস্যা সৃষ্টি করবে।
find_each ব্যবহার করা হচ্ছে অথবা find_in_batches একটি ব্যাচে একই অপারেশন করে কর্মক্ষমতা উন্নত করতে সাহায্য করবে:
ডিফল্টরূপে, find_each প্রশ্নের ফলাফল 1,000 একটি ব্যাচ. আপনি এটিকে একটি যুক্তি হিসাবে সংজ্ঞায়িত করে ব্যাচের আকার পরিবর্তন করতে পারেন:
এছাড়াও আপনি find_in_batches ব্যবহার করতে পারেন আপনি যে অপারেশন করতে হবে তার উপর ভিত্তি করে। find_in_batches এর মধ্যে পার্থক্য এবং find_each এটা হল find_in_batches পৃথক রেকর্ডের পরিবর্তে মডেলের অ্যারে হিসাবে ফলাফল দেয়।
5. প্লাক ব্যবহার করে আপনার প্রয়োজনীয় ক্ষেত্র নির্বাচন করুন
প্লাক কমান্ড সরাসরি একটি অ্যাক্টিভরেকর্ড অবজেক্টের পরিবর্তে একটি প্রশ্নের ফলাফলকে একটি অ্যারেতে রূপান্তর করে৷
যদি একটি ক্যোয়ারী বড় ফলাফল প্রদান করে, Pluck ব্যবহার করলে কোডের কর্মক্ষমতা উন্নত হবে। প্লাক শুধুমাত্র একটি ডাটাবেস থেকে একটি প্রয়োজনীয় ক্ষেত্র নির্বাচন করবে:
ফলাফল একটি সূচী থেকে আনা হয়, মূল টেবিল থেকে নয়, এবং বিভিন্ন ধরণের প্রশ্নের সাথে আরও কার্যকর।
6. বাল্ক অপারেশন ব্যবহার করুন
বাল্ক মুছুন৷ ActiveRecord অবজেক্টের উপর লুপ করার একটি ডিলিট অপারেশন একবারে রেকর্ড মুছে দেবে:
প্রতিটি রেকর্ড মুছে ফেলার জন্য ডাটাবেসে অনেক প্রশ্ন করতে হবে। পরিবর্তে, একটি একক বাল্ক delete_all ব্যবহার করা সর্বোত্তম প্রশ্ন:
বাল্ক তৈরি করুন৷ কিছু লোক বুঝতে পারে না যে বাল্ক মুছে ফেলার মতো, আপনি ActiveRecord এর সাথে একটি বাল্ক সন্নিবেশও করতে পারেন। এটি n কমাতে পারে শুধুমাত্র একটি প্রশ্নের সংখ্যা. ActiveRecord::Base create পদ্ধতি ইনপুট হিসাবে হ্যাশের একটি অ্যারে গ্রহণ করে:
7. প্রয়োজনে ইন-মেমরি গণনা ব্যবহার করুন
কিছু ক্ষেত্রে, একটি ইন-মেমরি গণনা প্রশ্ন করার চেয়ে পছন্দনীয়। ধরুন আমরা আমাদের ডাটাবেসে এমন দেশগুলি খুঁজে পেতে চাই যেখানে ব্যবহারকারীর রেকর্ড নেই:
উপরের ক্যোয়ারীটির ফলাফল পেতে N প্রশ্ন প্রয়োজন। এর পরিবর্তে, আমরা প্রদত্ত দেশগুলিতে ব্যবহারকারীদের খুঁজে পেতে একটি একক প্রশ্ন লিখতে পারি এবং মেমরিতে অন্যান্য গণনা করতে পারি:
আপনি অনুরোধ-প্রতিক্রিয়া চক্র পুনরায় ব্যবহার করতে এবং কিছু ক্ষেত্রে ডাটাবেস লোড কমাতে ক্যাশে করতে পারেন। রেল তিন ধরনের ক্যাশিং কৌশল প্রদান করে:পৃষ্ঠা, অ্যাকশন এবং ফ্র্যাগমেন্ট ক্যাশিং (ডিফল্টরূপে ফ্র্যাগমেন্ট ক্যাশিং দেওয়া হয়)।
র্যাপ আপ:ActiveRecord এবং AppSignal দিয়ে আপনার রুবি অন রেল পারফরম্যান্সকে অপ্টিমাইজ করুন
ঠিক আছে, রিক্যাপ করার সময়! এই পোস্টে, আমরা রেলের ডাটাবেস কর্মক্ষমতা সমস্যাগুলি সনাক্ত এবং পরীক্ষা করার তিনটি উপায় কভার করেছি:
- ActiveRecord প্রশ্নে ব্যাখ্যা চালানো হচ্ছে
- কী ডাটাবেস মেট্রিক্স পরিমাপ
- AppSignal ব্যবহার করে রেল অ্যাপের কর্মক্ষমতা পরিমাপ করা
এবং আপনার ডাটাবেস কর্মক্ষমতা অপ্টিমাইজ করার সাতটি উপায়, এর ব্যবহার সহ:
- N+1 প্রশ্নের জন্য আগ্রহী লোড হচ্ছে
- একটি ডাটাবেস সূচক
- সীমা
find_eachবিপুল সংখ্যক আইটেম লোড করতে- প্রয়োজনীয় ক্ষেত্র নির্বাচন করতে প্লাক করুন
- বাল্ক অপারেশন
- ইন-মেমরি গণনা
রেলগুলি একটি অ্যাপ্লিকেশন বিকাশ করা খুব সহজ এবং দ্রুত করে তোলে। ActiveRecord ডাটাবেস কোডের উত্পাদনশীলতা, পুনঃব্যবহারযোগ্যতা এবং রক্ষণাবেক্ষণের সাথে সাহায্য করে। ActiveRecord ক্যোয়ারী কিভাবে SQL কোয়েরিতে অনুবাদ করে এবং এক্সিকিউট করে তা বোঝা গুরুত্বপূর্ণ।
যাইহোক, আপনার Rails ডাটাবেসের কর্মক্ষমতা অপ্টিমাইজ করার জন্য সবচেয়ে গুরুত্বপূর্ণ জিনিসটি হল কর্মক্ষমতা ডেটার উপর দৃশ্যমানতা। পারফরম্যান্সের সমস্যাগুলি সাধারণ, কিন্তু একবার আপনার কাছে এই দৃশ্যমানতা থাকলে আপনি সেগুলি সমাধান করতে পারেন৷ আপনার একটি সঠিক মনিটরিং টুল দরকার যা ডাটাবেস মেট্রিক্স প্রদান করে। আমরা AppSignal পছন্দ করি;)
পি.এস. আপনি যদি রুবি ম্যাজিক পোস্টগুলি প্রেস থেকে বের হওয়ার সাথে সাথে পড়তে চান তবে আমাদের রুবি ম্যাজিক নিউজলেটারে সাবস্ক্রাইব করুন এবং একটি পোস্ট মিস করবেন না!