মাইএসকিউএলে আপডেটের ক্যোয়ারী ব্যাচের সবচেয়ে কার্যকরী উপায় কী?


10

আমি একটি অ্যাপ্লিকেশন লিখছি যা প্রয়োজন বর্ধিত সময়ের জন্য ডাটাবেসটিতে প্রচুর পরিমাণে আপডেট ফ্লাশ করা দরকার এবং কীভাবে কীভাবে এই প্রশ্নটি অনুকূল করা যায় সে সম্পর্কে আমি আটকে গিয়েছি। বর্তমানে আমি ব্যবহার করছি INSERT INTO ... VALUES (..), (..) ON DUPLICATE KEY UPDATE, যা সমস্ত মানকে একটি ক্যোয়ারিতে ব্যাচ করতে কাজ করে তবে বড় টেবিলগুলিতে ধীরে ধীরে কার্যকর করে। আমার কখনই সারি সন্নিবেশ করার দরকার নেই।

আমি যে অন্যান্য পন্থাগুলি দেখেছি সেগুলি ব্যবহার করে আপডেট করা হয় SET value = CASE WHEN...(যেভাবে আমি প্রশ্নগুলি তৈরি করছি তার ফলে উত্পন্ন করা শক্ত হবে, এবং CASEশত / হাজার হাজার কীগুলির পারফরম্যান্স সম্পর্কে আমি নিশ্চিত নই ), এবং কেবল একাধিক সংক্ষিপ্ত আপডেট। এগুলির দুটিই কি আমার বর্তমান পদ্ধতির চেয়ে দ্রুততর হবে?

এটি আমাকে অবাক করে দেয়, যতদূর আমি বলতে পারি, মাইএসকিউএলে এটি করার কোনও বুদ্ধিমান, দক্ষ উপায় নেই। সত্যিই যদি এর থেকে দ্রুততর কোনও রাস্তা না থাকে ON DUPLICATE KEYতবে PostgreSQL এ স্যুইচ করে এর UPDATE FROMসিনট্যাক্সটি ব্যবহার করা কি উপযুক্ত হবে ?

অন্য যে কোনও পরামর্শেরও প্রশংসা করা হয়!

সম্পাদনা করুন: এখানে এমন একটি সারণী যা ঘন ঘন আপডেট হয়। অপ্রাসঙ্গিক হওয়ার কারণে আমি কলামের নামগুলি সরিয়েছি।

CREATE TABLE IF NOT EXISTS `table` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `a` bigint(20) unsigned NOT NULL DEFAULT '0',
  `b` bigint(20) unsigned NOT NULL DEFAULT '0',
  `c` enum('0','1','2') NOT NULL DEFAULT '0',
  `d` char(32) NOT NULL,
  -- trimmed --
  PRIMARY KEY (`id`),
  KEY `a` (`a`),
  KEY `b` (`b`),
  KEY `c` (`c`),
  KEY `d` (`d`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

এটি টেস্টিং মেশিনে রয়েছে এবং উত্পাদনে নয় তাই InnoDB পুরোপুরি সঠিকভাবে সুর করা যায় না। কীভাবে INSERT FROM পরিচালিত হয় সে সম্পর্কে আমি পুরোপুরি নিশ্চিত নই, তবে আপনি যা বলেছেন তা সঠিক বলে মনে হচ্ছে। আপনি যে তথ্য চেয়েছিলেন সেগুলি দিয়ে প্রশ্নটি আপডেট করেছে।
jli

উত্তর:


14

যেহেতু আপনি InnoDBটেবিলগুলি ব্যবহার করছেন তাই সর্বাধিক সুস্পষ্ট অপ্টিমাইজেশন হ'ল একাধিক UPDATEগুলি লেনদেনে গ্রুপ করা to

InnoDBলেনদেনের ইঞ্জিন হওয়ার সাথে সাথে , আপনি কেবল নিজের জন্য UPDATEনয়, সমস্ত লেনদেনের ওভারহেডের জন্যও অর্থ প্রদান করেন: লেনদেন বাফার পরিচালনা, লেনদেন লগ পরিচালনা, লগটিকে ডিস্কে ফ্লাশ করে।

আপনি যদি এই ধারণাটি দিয়ে যৌক্তিকভাবে স্বাচ্ছন্দ্য বোধ করেন তবে UPDATEএকবারে 100-1000 গুলি চেষ্টা করে গ্রুপ করুন , প্রতিবারের মতো এভাবে মোড়ানো:

START TRANSACTION;
UPDATE ...
UPDATE ...
UPDATE ...
UPDATE ...
COMMIT;

সম্ভাব্য ডাউনসাইডস:

  • একটি ত্রুটি পুরো লেনদেনকে ভেঙে ফেলবে (তবে সহজেই কোডে সংশোধন করা হবে)
  • আপনার 1000 UPDATEএস জমে আপনি দীর্ঘ সময় অপেক্ষা করতে পারেন, তাই আপনি কিছুটা সময়সীমাও পেতে চাইতে পারেন
  • আপনার অ্যাপ্লিকেশন কোডে আরও জটিলতা।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.