মাইআইএসএএম রূপান্তরকে ইনোডিবিতে গতি বাড়িয়ে দিচ্ছে


15

আমি প্রায় 450 টেবিলের একটি ডাটাবেস সহ 4 গিগাবাইট গ্রহণ করে একটি মাইএসকিএল 5.1 সার্ভার পেয়েছি। এই সারণীর বিশাল সংখ্যা (2 ব্যতীত সমস্ত) মাই আইসাম। এটি বেশিরভাগ অংশের জন্য ঠিক আছে (লেনদেনের প্রয়োজন নেই), তবে অ্যাপ্লিকেশনটি ট্র্যাফিক লাভ করছে এবং আপডেটগুলিতে টেবিল-লক হওয়ার কারণে কিছু নির্দিষ্ট সারণী প্রভাবিত হয়েছে। টেবিলের 2 টি এখন InnoDB হবার কারণ।

ছোট টেবিলগুলিতে রূপান্তর (100 কে সারি) মোটামুটি সময় নেয় না, যার ফলে ন্যূনতম ডাউনটাইম হয়। তবে আমার কয়েকটি ট্র্যাকিং টেবিল 50 মিলিয়ন সারি কাছে আসছে। ALTER TABLE...ENGINE InnoDBবড় টেবিলগুলিতে গতি বাড়ানোর কোনও উপায় আছে কি ? এবং যদি তা না হয় তবে এই লিখন-ভারী টেবিলগুলিতে মিনিমাইজিং ডাউনটাইম রূপান্তর করার জন্য কী অন্যান্য পদ্ধতি রয়েছে?


1
কিছু মনে রাখবেন: একক পোস্টে একাধিক প্রশ্ন এমন লোকদের নিরুৎসাহিত করে, যারা কোনও একটি উত্তর উত্তর পোস্ট করা থেকে উত্তর দিতে পারে।
বেনভ

আমি ভিটিসি এটি উত্তর হিসাবে বরং জটিল। আপনার স্বতন্ত্রভাবে বেশ কয়েকটি প্রশ্ন খোলা উচিত।
jcolebrand

এটিকে একক প্রশ্নে পরিণত করার জন্য আমি আনন্দের সাথে পরামর্শ নেব, তবে এই প্রশ্নটি মুছে ফেলার জন্য এবং কেবল নতুন প্রশ্নটি খোলার পরামর্শ দেওয়া হচ্ছে কি? পুনর্লিখনটি বেশিরভাগ দ্বিতীয় ২ টি বুলেটগুলি সরিয়ে প্রথম পরিবর্তন করতে থাকবে (আমি শিরোনামটি আপডেট করেছি পাশাপাশি কোন স্টোরেজ ইঞ্জিনগুলিও
ডেরেক ডউনি

হয় ঠিক আছে। এটি সাধারণত এর সহজ অপর দুই প্রশ্ন লেখার এবং এক মুছে দিন। তবে, আপনি এইটিকে সহজেই "রেফারেন্সের" জন্য রেখে যেতে পারেন এবং অন্য দুটিটিকে এটিতে উল্লেখ করতে পারেন, "এটি আমার সামগ্রিক লক্ষ্য" প্রশ্ন হিসাবে।
jcolebrand

এটিকে একটি বুলেটে সম্পাদনা করুন, তারপরে ফলোআপ প্রশ্নগুলি পোস্ট করুন।
ব্রায়ান বলসুন-স্ট্যান্টন

উত্তর:


10

আমাকে এই বলে শুরু করা যাক, আমি ALTER পছন্দ করি না। এটা খারাপ, আইএমএইচও।

বলুন, এটি আপনার বর্তমান টেবিল স্কিমা -

CREATE TABLE my_table_of_love (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
my_value VARCHAR(40),
date_created DATE,
PRIMARY KEY(id)
) ENGINE=MyISAM CHARSET=utf8;

আমি যে পথটি প্রস্তাব করছি তা এখানে -

একটি নতুন টেবিল অবজেক্ট তৈরি করুন যা পুরানোটিকে প্রতিস্থাপন করবে:

CREATE TABLE my_table_of_love_NEW (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
my_value VARCHAR(40),
date_created DATE,
PRIMARY KEY(id)
) ENGINE=InnoDB CHARSET=utf8

পুরানো টেবিল থেকে সমস্ত সারি নতুন টেবিলটিতে নাম সন্নিবেশ করান:

INSERT INTO my_table_of_love_NEW (id,my_value,date_created)
SELECT id,my_value,date_created FROM my_table_of_love;

ধোঁয়া আপনার মাইগ্রেশন পরীক্ষা:

SELECT COUNT(*) FROM my_table_of_love_NEW;
SELECT COUNT(*) FROM my_table_of_love;
SELECT a.id,a.my_value,a.date_created FROM my_table_of_love_NEW a
LEFT JOIN my_table_of_love b ON (b.id = a.id)
WHERE a.my_value != b.my_value;

টেবিলের নামগুলি অদলবদল করুন যাতে আপনার রোলব্যাকের প্রয়োজন হলে আপনি ব্যাক আপ বজায় রাখতে পারেন।

RENAME TABLE my_table_of_love TO my_table_of_love_OLD;
RENAME TABLE my_table_of_love_NEW TO my_table_of_love;

রিগ্রেশন টেস্টে এগিয়ে যান।

একাধিক সূচি এবং কয়েক মিলিয়ন সারি সহ এই টেবিলটি আরও বেশি বেশি পছন্দসই হয়।

থটস?


1
সম্মত ... যদিও এটি যদি ভারিভাবে লেনদেন হয় তবে এটি করার সময় আপনার ডাটাবেসটি নেওয়ার প্রয়োজন হতে পারে। (তবে একটি পরিবর্তনের টেবিল আপনাকে ডাউনটাইমের দীর্ঘতর সময় দেবে, সম্ভবতঃ)
জো

হ্যাঁ, আমি অনুভব করেছি যে এটি আরও সক্রিয় টেবিলগুলির জন্য ডাউনটাইম প্রয়োজন। আমি কিছু পরীক্ষা চালাতে যাচ্ছি, তবে কেন 50 মিলিয়ন সারির ALTER TABLEচেয়ে বেশি সময় লাগবে INSERT INTO...SELECT?
ডেরেক ডাউনি

এটা হবে না। মূলত মাইএসকিউএল অভ্যন্তরীণভাবে ঠিক যেমনটি এই পোস্টারটির পরামর্শ দিয়েছে does এটি সংজ্ঞাটির একটি অনুলিপি তৈরি করে এবং অনুলিপিটিকে অনুলিপি করে।
মরগান টকার

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

আমাকে এখনই যোগ করতে দাও যে, মাইএসকিউএল ৫.7-এ, ALTERs খুব সহজেই মোকাবেলা করা সহজ এবং সহজ।
এলোমেলোভাবে

7

1) ক্ষতি সুরক্ষা হ'ল বিড়ম্বনার একটি ক্রিয়া। সর্বদা একটি ব্যাকআপ নিন। আপনি যদি সত্যিই ভৌতিক হয়ে থাকেন তবে ব্যাকআপ তৈরি করুন এবং ব্যাকআপ থেকে পুনরুদ্ধার করুন।

2) মাইএসকিউএল ম্যানুয়ালটির এই পৃষ্ঠায় সারণী প্রকার রূপান্তর করার জন্য নির্দেশ রয়েছে।

ইনোডিবি-তে কোনও টেবিল পরিবর্তন করার দ্রুততম উপায় হ'ল সরাসরি কোনও ইনোডিবি সারণিতে সন্নিবেশগুলি করা। এটি হ'ল, ALTER TABLE ... ENGINE = INNODB ব্যবহার করুন বা অভিন্ন সংজ্ঞা সহ একটি খালি InnoDB টেবিল তৈরি করুন এবং INSERT INTO দিয়ে সারিগুলি সন্নিবেশ করুন ... নির্বাচন করুন * থেকে ... নির্বাচন করুন

3) পোস্টগ্রাইএসকিউএল সম্পূর্ণ পাঠ্য অনুসন্ধান করে , স্পিংস ইঞ্জিনটি মাইএসকিউএল-এর জন্য এটি করবে বলে মনে হচ্ছে


আমি স্পিনিক্সে অবশ্যই নজর রাখব, কারণ আমি সম্প্রতি এটি সম্পর্কে শুনেছি।
ডেরেক ডোনয়

3

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

আমি তোমাকে পছন্দ করি কিছু ডেডিকেটেড সম্পূর্ণ টেক্সট সার্চ ইঞ্জিন আগ্রহ সুপারিশ স্পিংক্স , Lucene ( solr ) এবং ডাটাবেসের স্তর থেকে তা পরিত্রাণ পেতে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.