মাইএসকিউএল-তে একটি ট্রিগার বনাম সঞ্চিত প্রক্রিয়া সম্পাদন


11

ডিবিএ.স্ট্যাকএক্সচেঞ্জ এ এখানে একটি পোস্ট ( রেকর্ডগুলিতে একটি সংশোধন নম্বর বজায় রাখতে ট্রিগারদের জন্য সর্বোত্তম অনুশীলনগুলি কী? ) মাইএসকিউএল সম্পাদনের বিষয়ে একটি আকর্ষণীয় প্রশ্ন (কমপক্ষে আমার কাছে আকর্ষণীয়) তৈরি করেছে।

প্রসঙ্গটি হ'ল আমরা আপডেট করা প্রতিটি সারির জন্য একটি টেবিলে একটি রেকর্ড সন্নিবেশ করতে চাই। সারিটি আপডেট হওয়ার আগে আমরা পূর্বের মানটি সঞ্চয় করতে এবং তারপরে একটি কলাম (একটি "সংস্করণ" কলাম) বাড়িয়ে দিতে চাই।

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

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

সুতরাং, যখন এই সন্নিবেশ সম্পাদন করার কথা আসে, সেট-বেসড স্টোরেজ পদ্ধতি পদ্ধতির ব্যবহার বা ট্রিগার ভিত্তিক পদ্ধতির ব্যবহার করা কি আরও পারফর্মেন্ট হবে?

এই প্রশ্নটি মাইএসকিউএলের জন্য (যেহেতু এটিতে সারি-সারি সারি ট্রিগার রয়েছে) যদিও এটি অন্যান্য সারি-বাই-সারি ট্রিগার ডিবিএমএস-এ প্রয়োগ করতে পারে।


1
সঞ্চিত পদ্ধতির সংস্করণ যুক্তিকে ধাক্কা দেওয়ার বিষয়ে একটি বিষয় মনে রাখতে হবে - যখন কেউ, আপনার নিরীক্ষার প্রক্রিয়াটি বাইপাস করে সরাসরি কোনওভাবে টেবিলের কাছে লেখেন তখন আপনি কীভাবে আচ্ছন্ন হন?
বিলিংক

আমি রাজী. তবে স্কেলের অন্য প্রান্তে, আপনি নির্দিষ্ট পরিস্থিতিতে এই লগিংটি ইচ্ছাকৃতভাবে বাইপাস করতে চান। অবশ্যই, এটি সম্পূর্ণ ভিন্ন প্রশ্ন । পারফরম্যান্সের প্রভাব সম্পর্কে আমি সত্যিই আগ্রহী।
রিচার্ড

উত্তর:


7

সরলতার জন্য, ট্রিগারগুলি হ'ল ডেটাবেস পরিবর্তনের কোনও প্রকারের ট্র্যাকিং বাস্তবায়নের উপায়। তবে, আপনি ট্রিগার ব্যবহার করার সময় হুডের নীচে কী ঘটে যায় সে সম্পর্কে আপনাকে সচেতন হওয়া দরকার।

মাইএসকিউএল স্টোরেড প্রক্রিয়া প্রোগ্রামিং অনুসারে , "ট্রিগার ওভারহেড" শিরোনামের 256 পৃষ্ঠায় নিম্নলিখিতটি বলেছেন:

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

ট্রিগার ওভারহেডের একটি বিস্তৃত ব্যাখ্যা 529-531 পৃষ্ঠায় দেওয়া হয়েছে। বিভাগটি থেকে সমাপ্তি বিন্দুতে নিম্নলিখিতটি উল্লেখ করা হয়েছে:

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

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

InnoDB টেবিল এবং লগিং পরিবর্তনগুলিতে ট্রিগার ব্যবহার করার সময়

  • আপনি যে টেবিলটিতে লগ করেছেন সেটিও ইনোডিবি
  • আপনি স্বতঃসিদ্ধকরণ বন্ধ করেছেন
  • আপনি আরম্ভ করুন ট্রান্সাকশন ... কমিট / রোলব্যাক ব্লকগুলি পুরোপুরি করুন

এইভাবে, নিরীক্ষণ লগগুলি প্রধান সারণী হিসাবে কমিট / রোলব্যাক থেকে উপকৃত হতে পারে।

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

বিচারকার্য স্থগিত রাখার আদেশ

ট্রিগারটি কতটা জটিল তার উপর নির্ভর করে এটি এখনও একটি বাধা হতে পারে। আপনি যদি নিরীক্ষণ লগিংয়ে বাধাগুলি হ্রাস করতে চান তবে কিছু করার আছে। তবে এর জন্য একটু পরিকাঠামো পরিবর্তন প্রয়োজন require

পণ্য হার্ডওয়্যার ব্যবহার করে, আরও দুটি ডিবি সার্ভার তৈরি করুন

এটি অডিট লগিংয়ের কারণে মূল ডেটাবেজে (এমডি) I / O রচনা হ্রাস করতে সার্ভার করবে। আপনি এটি কীভাবে সম্পন্ন করতে পারেন তা এখানে:

পদক্ষেপ 01) মূল ডাটাবেসে বাইনারি লগিং চালু করুন।

পদক্ষেপ 02) একটি সস্তা সার্ভার ব্যবহার করে, বাইনারি লগিং সক্ষম করে মাইএসকিউএল (এমডি হিসাবে একই সংস্করণ) সেটআপ করুন। এটি ডিএম হবেন। এমডি থেকে ডিএম-র প্রতিরূপ সেটআপ করুন।

পদক্ষেপ 03) দ্বিতীয় সস্তার সার্ভার ব্যবহার করে, বাইনারি লগিং সহ মাইএসকিউএল (এমডি হিসাবে একই সংস্করণ) সেটআপ করুন। --Replicate-do-table ব্যবহার করার জন্য প্রতিটি অডিট টেবিল সেটআপ করুন । এটি এউ হবে। ডিএম থেকে এইউ-র প্রতিরূপ সেটআপ করুন।

পদক্ষেপ 04) এমডি থেকে টেবিলের কাঠামোগত mysqldump করে এটিকে ডিএম এবং এউতে লোড করুন।

পদক্ষেপ 05) ব্ল্যাকহোল স্টোরেজ ইঞ্জিনটি ব্যবহার করতে MD এর সমস্ত অডিট টেবিল রূপান্তর করুন

পদক্ষেপ 06) ব্ল্যাকহোল স্টোরেজ ইঞ্জিনটি ব্যবহার করতে ডিএম এবং এউতে সমস্ত সারণী রূপান্তর করুন

পদক্ষেপ 07) মাইআইএসএএম স্টোরেজ ইঞ্জিনটি ব্যবহার করতে এউ-এর সমস্ত নিরীক্ষণ সারণী রূপান্তর করুন

হয়ে গেলে

  • ডিএম তার বাইনারি লগে কেবল এমডি থেকে রেকর্ড করুন এবং স্টাফ রেকর্ড করবেন
  • সঙ্গে --replicate-do-টেবিল সব নিরীক্ষা টেবিলের উপর ফিল্টার, এইউ ডিএম থেকে প্রতিলিপি নির্মাণ করতে হবে

এটি যা করে তা হ'ল আলাদা ডিবি সার্ভারে নিরীক্ষণের তথ্য এবং এমডি সাধারণত যে লেখার আই / ও অবক্ষয় হ্রাস করে তা হ্রাস করে।


তীব্র উত্তর +++ 1
b_dubb

1

এই আপডেটটি প্রচুর পরিমাণে সঞ্চালনের জন্য এখানে একটি পদ্ধতির উপায়।

এই উদাহরণের জন্য

  • টেবিল_এতে প্রাথমিক কী আইডি রয়েছে
  • আপনি প্রাথমিক কী হিসাবে কেবল আইডি দিয়ে টেবিল_এ_কিজ 2 আপডেট নামে একটি সারণী তৈরি করেন
  • আপনি টেবিল_এ_কিজ 2 আপডেট করুন টেবিল_এ থেকে আইডিস সহ আইডিগুলি আপডেট করুন আপনি অবশ্যই আপডেট হতে হবে

টেবিল_এ_কিজ 2 আপডেট করতে নিম্নলিখিতগুলি করুন:

CREATE TABLE table_A_Keys2Update SELECT id FROM table_A;
ALTER TABLE table_A_Keys2Update ADD PRIMARY KEY (id);

আপনি যে আইডিগুলির সংশোধন নম্বর বাড়ানোর দরকার রয়েছে তার সাথে টেবিল_এ_কিজ 2 আপডেট স্থাপনের পরে, সমস্ত আইনের সারণীর সংখ্যার পুনর্বিবেচনার সংখ্যার জন্য নিম্নলিখিত আপডেটের সাথে যুক্ত করুন যার টেবিল_এ এবং টেবিল_এ_কিজ 2 আপডেট করুন:

UPDATE table_A A INNER JOIN table_A_Keys2Update B USING (id)
SET A.revision = A.revision + 1;

এই এক লাইনের ক্যোয়ারীটি একটি ট্রিগার এবং একটি সঞ্চিত পদ্ধতি প্রতিস্থাপন করতে পারে।

Allyচ্ছিকভাবে, আপনি এই প্রশ্নটি একটি সঞ্চিত পদ্ধতিতে রাখতে পারেন এবং যদি আপনার ইচ্ছা হয় তবে এটি কল করতে পারেন।


এটি সত্যিই sertোকানো সম্পর্কে আমি কৌতূহলী। আপনি যদি নিরীক্ষণ সন্নিবেশ করান তবে <<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<< <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ট্রিগার, আপনি would শুধু <আপডেট সারি থেকে ডেটা> ঢোকান এমনটা নিরীক্ষা মূল্যবোধ । সুতরাং, একক লাইন, সারি-সারি সারি সন্নিবেশ বাল্ক সন্নিবেশের চেয়ে দ্রুততর হবে?
রিচার্ড

সরলতার জন্য, ট্রিগারটি আরও ভাল হতে পারে 1) প্রাথমিক_তালিকাটি কখনই কোনও শীর্ষ সময়ের মাঝে বাল্ক সন্নিবেশগুলি অনুভব করে না, ২) নিরীক্ষণের তথ্য কোনও নির্দিষ্ট মুহুর্তে অন-চাহিদা পড়তে হবে এবং 3) আপনার সাইট কম পাচার হয়।
রোল্যান্ডোমাইএসকিউএলডিবিএ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.