InnoDB আমদানি কর্মক্ষমতা


10

আমি প্রায় 10 মিলিয়ন সারি (বা 7 গিগাবাইট) সমন্বিত একটি বেশ বড় ইনোডিবি-টেবিল আমদানির সাথে লড়াই করছি (যা আমার পক্ষে এখন পর্যন্ত কাজ করা সবচেয়ে বড় টেবিল)।

আমি কীভাবে ইনোর আমদানির গতি উন্নত করব এবং এই মুহুর্তে আমার সেটআপটি এর মতো দেখায় তা নিয়ে আমি কিছু গবেষণা করেছি:

/etc/mysql/my.cnf/
[...]
innodb_buffer_pool_size = 7446915072 # ~90% of memory
innodb_read_io_threads = 64
innodb_write_io_threads = 64
innodb_io_capacity = 5000
innodb_thread_concurrency=0
innodb_doublewrite = 0
innodb_log_file_size = 1G
log-bin = ""
innodb_autoinc_lock_mode = 2
innodb_flush_method = O_DIRECT
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_instances=8


import is done via bash script, here is the mysql code:
SET GLOBAL sync_binlog = 1;
SET sql_log_bin = 0;
SET FOREIGN_KEY_CHECKS = 0;
SET UNIQUE_CHECKS = 0;
SET AUTOCOMMIT = 0;
SET SESSION tx_isolation='READ-UNCOMMITTED';
LOAD DATA LOCAL INFILE '$filepath' INTO TABLE monster
COMMIT;

ডেটা একটি CSVফাইলে সরবরাহ করা হয়।
বর্তমানে আমি 2 মিলিয়ন, 3 মিলিয়ন,… সারি প্রত্যেকটি দিয়ে ছোট ছোট 'টেস্ট ডাম্প' দিয়ে আমার সেটিংস পরীক্ষা করি এবং time import_script.shপারফরম্যান্সের তুলনা করতে ব্যবহার করি ।

খসড়াটি হ'ল আমি কেবল সামগ্রিক চলমান সময় পাই তাই ফলাফল পেতে সম্পূর্ণ আমদানির জন্য অপেক্ষা করতে হয়েছিল।

এখনও পর্যন্ত আমার ফলাফল:

  • 10 000 সারি: <1 সেকেন্ড
  • 100 000 সারি: 10 সেকেন্ড
  • 300 000 সারি: 40 সেকেন্ড
  • 2 মিলিয়ন সারি: 18 মিনিট
  • 3 মিলিয়ন সারি: 26 মিনিট
  • ৪ মিলিয়ন সারি: (২ ঘন্টা পরে বাতিল)

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

এই মুহুর্তের জন্য আমি MyISAMআমদানির সময় চ্যাট থেকে ব্যবহার করার জন্য কোনও পরামর্শ চেষ্টা করতে চাই এবং তার পরে টেবিল ইঞ্জিনটি পরিবর্তন করব।
আমি এটি চেষ্টা করতে চাই তবে এই মুহুর্তের জন্য আমার DROP TABLEক্যোয়ারীটি শেষ হতে কয়েক ঘন্টাও সময় লাগে। (যা আমার সেটিংটি সর্বোত্তম তার চেয়ে কম অন্য সূচকটি মনে হয়)।

অতিরিক্ত তথ্য:
আমি বর্তমানে যে মেশিনটি ব্যবহার করছি তাতে 8 গিগাবাইট র‌্যাম এবং একটি সলিড স্টেট হাইব্রিড হার্ড ড্রাইভ ডাব্লু / 5400 আরপিএম রয়েছে।
যদিও আমরা লক্ষ্য রেখেছি টেবিল থেকে অপ্রচলিত ডেটা অপসারণের জন্য আমার এখনও
একটি) টেস্টের কিছুটা দ্রুত আমদানি প্রয়োজন বিকাশকালে automatic data cleanup featureএবং
খ) যদি আমাদের সার্ভার ক্র্যাশ হয় তবে আমরা আমাদের ২ য় সার্ভারকে প্রতিস্থাপন হিসাবে ব্যবহার করতে চাই (যা প্রয়োজন টু-ডেট ডেটা, শেষ আমদানি 24 ঘন্টােরও বেশি সময় নিয়েছে)

mysql> SHOW CREATE TABLE monster\G
*************************** 1. row ***************************
       Table: monster
Create Table: CREATE TABLE `monster` (
  `monster_id` int(11) NOT NULL AUTO_INCREMENT,
  `ext_monster_id` int(11) NOT NULL DEFAULT '0',
  `some_id` int(11) NOT NULL DEFAULT '0',
  `email` varchar(250) NOT NULL,
  `name` varchar(100) NOT NULL,
  `address` varchar(100) NOT NULL,
  `postcode` varchar(20) NOT NULL,
  `city` varchar(100) NOT NULL,
  `country` int(11) NOT NULL DEFAULT '0',
  `address_hash` varchar(250) NOT NULL,
  `lon` float(10,6) NOT NULL,
  `lat` float(10,6) NOT NULL,
  `ip_address` varchar(40) NOT NULL,
  `cookie` int(11) NOT NULL DEFAULT '0',
  `party_id` int(11) NOT NULL,
  `status` int(11) NOT NULL DEFAULT '2',
  `creation_date` datetime NOT NULL,
  `someflag` tinyint(1) NOT NULL DEFAULT '0',
  `someflag2` tinyint(4) NOT NULL,
  `upload_id` int(11) NOT NULL DEFAULT '0',
  `news1` tinyint(4) NOT NULL DEFAULT '0',
  `news2` tinyint(4) NOT NULL,
  `someother_id` int(11) NOT NULL DEFAULT '0',
  `note` varchar(2500) NOT NULL,
  `referer` text NOT NULL,
  `subscription` int(11) DEFAULT '0',
  `hash` varchar(32) DEFAULT NULL,
  `thumbs1` int(11) NOT NULL DEFAULT '0',
  `thumbs2` int(11) NOT NULL DEFAULT '0',
  `thumbs3` int(11) NOT NULL DEFAULT '0',
  `neighbours` tinyint(4) NOT NULL DEFAULT '0',
  `relevance` int(11) NOT NULL,
  PRIMARY KEY (`monster_id`),
  KEY `party_id` (`party_id`),
  KEY `creation_date` (`creation_date`),
  KEY `email` (`email`(4)),
  KEY `hash` (`hash`(8)),
  KEY `address_hash` (`address_hash`(8)),
  KEY `thumbs3` (`thumbs3`),
  KEY `ext_monster_id` (`ext_monster_id`),
  KEY `status` (`status`),
  KEY `note` (`note`(4)),
  KEY `postcode` (`postcode`),
  KEY `some_id` (`some_id`),
  KEY `cookie` (`cookie`),
  KEY `party_id_2` (`party_id`,`status`)
) ENGINE=InnoDB AUTO_INCREMENT=13763891 DEFAULT CHARSET=utf8

2
আপনি কি 10K বা 100K সারিগুলির মতো কম বড় আমদানি দিয়ে চেষ্টা করেছেন?
ypercubeᵀᴹ

1
SHOW CREATE TABLE yourtable\Gএই 10 মিলিয়ন সারি সারণির টেবিল কাঠামোটি দেখানোর জন্য দয়া করে চালান
রোল্যান্ডোমাইএসকিউএলডিবিএ

@ রোল্যান্ডোমাইএসকিউএলডিবিএ তাই আমি করেছি (অস্পষ্ট ক্ষেত্রের নাম সহ)
নুয়াল

ডাবল রাইফ বাফারটি অক্ষম করে ( innodb_doublewrite = 0) আপনার মাইএসকিউএল ইনস্টলেশনটি ক্রাশ নিরাপদ নয়: আপনার যদি কোনও পাওয়ার ব্যর্থতা থাকে (কোনও মাইএসকিউএল ক্র্যাশ নয়), আপনার ডেটা নিঃশব্দে দূষিত হতে পারে।
jfg956

উত্তর:


13

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

InnoDB আর্কিটেকচার

উপরের বাম কোণে, InnoDB বাফার পুলের একটি চিত্র রয়েছে। নোট করুন এটির একটি অংশ রয়েছে সন্নিবেশ বাফারকে উত্সর্গীকৃত। এটা কি করে? এটি সিস্টেমের টেবিল স্পেসের (বা ওরফে ইবদাটা 1) ভিতরে বাফার পুল থেকে সন্নিবেশ বাফারে গৌণ সূচকগুলিতে পরিবর্তন স্থানান্তরিত হয়। ডিফল্টরূপে, ইনোডব_চেঞ্জ_বফার_ম্যাক্স_সাইজ 25 তে সেট করা থাকে This এর অর্থ বাফার পুলের 25% পর্যন্ত গৌণ সূচকগুলি প্রক্রিয়াকরণের জন্য ব্যবহার করা যেতে পারে।

আপনার ক্ষেত্রে ইনোডিবি বাফার পুলের জন্য আপনার কাছে 6.935 গিগাবাইট রয়েছে। আপনার গৌণ সূচকগুলি প্রক্রিয়াকরণের জন্য সর্বোচ্চ 1.734 গিগাবাইট ব্যবহার করা হবে।

এখন, আপনার টেবিল তাকান। আপনার কাছে 13 গৌণ সূচক রয়েছে। আপনার প্রক্রিয়াকৃত প্রতিটি সারিতে অবশ্যই একটি মাধ্যমিক সূচক এন্ট্রি তৈরি করতে হবে, সারিটির প্রাথমিক কীটি দিয়ে এটি জোড়া করুন এবং বাফার পুলের সন্নিবেশ বাফার থেকে জোড় হিসাবে তাদেরকে ইবদাটা 1-এর সন্নিবেশ বাফারে প্রেরণ করুন। প্রতিটি সারি দিয়ে 13 বার এটি ঘটে। এটি 10 ​​মিলিয়ন দ্বারা গুণ করুন এবং আপনি প্রায় একটি বাধা এসে অনুভব করতে পারেন।

ভুলে যাবেন না যে একক লেনদেনে 10 মিলিয়ন সারি আমদানি করা সমস্ত কিছুকে একটি রোলব্যাক সেগমেন্টে গাদা করে দেবে এবং ইবদাটা 1-এ ইউএনডিও স্থান পূরণ করবে।

পরামর্শ

পরামর্শ # 1

এটি বরং বড় টেবিলটি আমদানির জন্য আমার প্রথম পরামর্শ

  • সমস্ত অ-অনন্য সূচকগুলি ফেলে দিন
  • ডেটা আমদানি করুন
  • সমস্ত অ-অনন্য সূচক তৈরি করুন

পরামর্শ # 2

সদৃশ সূচকগুলি থেকে মুক্তি পান। আপনার ক্ষেত্রে, আপনার আছে

KEY `party_id` (`party_id`),
KEY `party_id_2` (`party_id`,`status`)

উভয় সূচক দিয়ে শুরু হয় party_id, আপনি 13 এর মধ্যে একটি সূচককে মুক্তি দিয়ে কমপক্ষে 7.6% গৌণ সূচক প্রক্রিয়াকরণ বাড়িয়ে তুলতে পারেন eventually আপনাকে শেষ পর্যন্ত চালানো দরকার

ALTER TABLE monster DROP INDEX party_id;

পরামর্শ # 3

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

পরামর্শ # 4

ডিফল্ট 8 এম এর পরে আপনার ইনডোড_ব্লগ_বাফলার সাইজটি 64 এম- তে বাড়ানো উচিত । একটি বড় লগ বাফার ইনোডিবি লেখার I / O পারফরম্যান্স বাড়িয়ে তুলতে পারে।

উপসংহার

প্রথম দুটি পরামর্শ রাখুন, নিম্নলিখিতটি করুন:

  • ১৩ টি অ-অনন্য সূচি ফেলে দিন
  • ডেটা আমদানি করুন
  • ব্যতীত সমস্ত অ-অনন্য ইনডেক্স তৈরি করুন party_idসূচক

সম্ভবত নিম্নলিখিতটি সাহায্য করতে পারে

CREATE TABLE monster_new LIKE monster;
ALTER TABLE monster_new
  DROP INDEX `party_id`,
  DROP INDEX `creation_date`,
  DROP INDEX `email`,
  DROP INDEX `hash`,
  DROP INDEX `address_hash`,
  DROP INDEX `thumbs3`,
  DROP INDEX `ext_monster_id`,
  DROP INDEX `status`,
  DROP INDEX `note`,
  DROP INDEX `postcode`,
  DROP INDEX `some_id`,
  DROP INDEX `cookie`,
  DROP INDEX `party_id_2`;
ALTER TABLE monster RENAME monster_old;
ALTER TABLE monster_new RENAME monster;

এর মধ্যে ডেটা আমদানি করুন monster। তারপরে, এটি চালান

ALTER TABLE monster
  ADD INDEX `creation_date`,
  ADD INDEX `email` (`email`(4)),
  ADD INDEX `hash` (`hash`(8)),
  ADD INDEX `address_hash` (`address_hash`(8)),
  ADD INDEX `thumbs3` (`thumbs3`),
  ADD INDEX `ext_monster_id` (`ext_monster_id`),
  ADD INDEX `status` (`status`),
  ADD INDEX `note` (`note`(4)),
  ADD INDEX `postcode` (`postcode`),
  ADD INDEX `some_id` (`some_id`),
  ADD INDEX `cookie` (`cookie`),
  ADD INDEX `party_id_2` (`party_id`,`status`);

একবার চেষ্টা করে দেখো !!!

বিকল্প

আপনি monster_csvকোনও তালিকা ছাড়াই মাইআইএসএএম টেবিল হিসাবে একটি সারণী তৈরি করতে পারেন এবং এটি করতে পারেন:

CREATE TABLE monster_csv ENGINE=MyISAM AS SELECT * FROM monster WHERE 1=2;
ALTER TABLE monster RENAME monster_old;
CREATE TABLE monster LIKE monster_old;
ALTER TABLE monster DROP INDEX `party_id`;

এতে আপনার ডেটা আমদানি করুন monster_csv। তারপরে, অন্য আমদানি তৈরি করতে mysqldump ব্যবহার করুন

mysqldump -t -uroot -p mydb monster_csv | sed 's/monster_csv/monster/g' > data.sql

মাইএসকিএলডাম্প ফাইলটি data.sqlINSERT কমান্ডগুলিকে একসাথে 10,000,000,000 সারি আমদানি করে বাড়ানো হবে।

এখন, শুধু mysqldump লোড করুন

mysql -uroot -p mydb < data.sql

অবশেষে, মাইআইএসএএম টেবিলটি থেকে মুক্তি পান

DROP TABLE monster_csv;

আমি এই সমস্ত কীগুলি সম্পর্কেও অবগত ছিলাম না (এটি আমার নকশা নয়) তবে আপনার ব্যাখ্যাটি খুব দৃinc় বিশ্বাসযোগ্য seems আজকের জন্য আরেকটি চেষ্টা শুরু করতে দেরি হলেও আমি আগামীকাল কী চেষ্টা করতে হবে তা দুর্দান্ত পরামর্শগুলি দেখছি। তোমাকে জানাবো! <3
নুয়াল

1
monsterInnoDB টেবিলগুলিতে কোনও কী না থাকাকালীন আমি কম 20 মিনিটের মধ্যে সম্পূর্ণ ডাটাবেস (কেবল টেবিল নয়) আমদানি করতে সক্ষম হয়েছি । কীগুলি যুক্ত করা প্রায় গ্রহণ করেছে। অন্য 20 মিনিট আমি বলব এটি এই ক্ষেত্রে আমার সমস্যাটি বেশ সমাধান করে। আপনাকে অনেক ধন্যবাদ!
নুয়াল

8

আমি একটি মন্তব্য লিখতে চেয়েছিলাম (কারণ এটি কোনও চূড়ান্ত উত্তর নয়), তবে এটি খুব দীর্ঘ হয়ে গেছে:

আমি আপনাকে পরামর্শের কয়েকটি বিস্তৃত টুকরো দিতে যাচ্ছি, এবং আপনি যদি চান তবে আমরা প্রত্যেকের বিশদ বিবরণে যেতে পারি:

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

মনে রাখবেন যে এর মধ্যে কিছু সুরক্ষিত নয় বা অ-আমদানি (স্বাভাবিক অপারেশন) এর জন্য পরামর্শযোগ্য নয়।


আপনাকে অনেক ধন্যবাদ! আমি প্রথমে সূচকগুলি সম্পর্কে রোল্যান্ডোর ধারণার চেষ্টা করে দেখতে চাই তবে আমার ধারণা এই "লেনদেন-রোলব্যাক" স্টাফটি এখনও একটি সমস্যা হয়ে থাকবে। আপনি এই সম্পর্কে বিস্তারিত বলতে পারেন? আমি মনে করি আমদানির সময় আমি যতটা সম্ভব এই কার্যকারিতাটি অক্ষম করতে চাই এবং উত্পাদনে যাওয়ার সময় কেবল পুনরায় সক্ষম করতে চাই ~ আমার মনে হয় ...
নুয়াল

1
রোল্যান্ডোর পরামর্শটি আমার # 7 পয়েন্ট। রোলব্যাক ওভারহেড এড়ানো এতো সহজ SET SESSION tx_isolation='READ-UNCOMMITTED';(যদি আপনি সমান্তরালভাবে কয়েকটি থ্রেড দিয়ে আমদানি করেন তবেই কার্যকর) এবং ব্যাচগুলিতে সন্নিবেশ সম্পর্কে @ সাইপারকিউ মন্তব্যের মতোই সহজ। আপনার এখানে একটি সম্পূর্ণ উদাহরণ রয়েছে: mysqlperformanceblog.com/2008/07/03/… আপনি সর্বশেষ InnoDB সংস্করণগুলিতে সমস্ত বৈশিষ্ট্যের সুবিধা পাচ্ছেন তা নিশ্চিত করুন: mysqlperformanceblog.com/2011/01/07/…
জিনাস

1
আমার সাধারণ ধারণা ছিল যে কেউ ছোট ছাগের আমদানি এড়াতে পারে বরং "সমস্ত অন্তর্ভুক্ত" অপারেশনে যেতে পারে তবে আমি দেখছি মাল্টি-থ্রেডিং কিছু সম্ভাবনা খুলতে পারে। অনুমান যে এটি খুব কেস নির্দিষ্ট। যাইহোক আমি রোল্যান্ডোর জবাব গ্রহণ করেছি কারণ এই টুইটটি (আপনার # 7) একা আমার 1 ঘন্টার মধ্যে পুরো আমদানি করতে সহায়তা করেছিল তবে আপনার তালিকাটি অবশ্যই নিরর্থক থেকে অনেক দূরে এবং আমার ধারণা যে এটি আমাদের ডিবি যে হার বাড়ছে তার রেফারেন্স হিসাবে খুব তাড়াতাড়ি রেফারেন্সের জন্য এটি ব্যবহার করব I আমাকে ভয়
দেখায়

আমি @ ইউসির সাথে একমত আপনার উত্তরটি সমস্যা সমাধান এবং কার্যকারিতা উন্নতির ক্ষেত্রে আরও ব্যাপক। +1
রোল্যান্ডোমাইএসকিউএলডিবিএ

3

এখন পর্যন্ত বেশিরভাগ ভাল টিপস দেওয়া হয়েছে তবে সেরাদের জন্য খুব বেশি ব্যাখ্যা ছাড়াই। আমি আরও বিশদ দেব।

প্রথমত, সূচক তৈরিতে বিলম্ব করা ভাল, অন্যান্য প্রতিক্রিয়ায় পর্যাপ্ত বিবরণ সহ। আমি এটি ফিরে আসতে হবে না।

একটি বৃহত্তর InnoDB লগ ফাইল আপনাকে অনেক সহায়তা করবে (আপনি যদি মাইএসকিউএল 5.6 ব্যবহার করছেন তবে এটি মাইএসকিউএল 5.5 তে বাড়ানো সম্ভব নয়)। আপনি GB জিবি ডেটা areোকাচ্ছেন, আমি কমপক্ষে ৮ জিবি মোট লগ আকারের প্রস্তাব দেব ( innodb_log_files_in_groupএটির ডিফল্টে রাখুন (২) এবং innodb_log_file_sizeগিগাবাইটে 4 গিগাবাইট)। এই 8 জিবিটি সঠিক নয়: এটি কমপক্ষে রেডো লগের আমদানির আকার এবং সম্ভবত সেই আকারের দ্বিগুণ বা চতুর্থাংশ হওয়া উচিত। ইনোডিবি লগের আকারের পিছনে যুক্তি এটি বাড়িয়ে দেয় যে লগটি প্রায় পূর্ণ হয়ে গেলে, ইনোডিবি তার বাফার পুলটি ডিস্কে আক্রমনাত্মকভাবে ফ্লাশ করা শুরু করবে যাতে লগটি পূরণ করা যায় না (যখন লগটি পূর্ণ হয়, ইনোডিবি কোনও ডাটাবেস লিখতে পারে না যতক্ষণ না কিছু লেখা থাকে) বাফার পুলের পৃষ্ঠাগুলি ডিস্কে লেখা হয়)।

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

আপনার র‌্যাম আপনাকে যতটা অনুমতি দেয় ততক্ষণে আপনার কাছে একটি বাফার পুল রয়েছে এবং যদি আপনার টেবিলটি এটিতে না ফিট করে তবে বেশি র‌্যাম কেনা বাদে আপনি তেমন কিছু করতে পারবেন না। তবে এটি আপনার টেবিলটি বাফার পুলের সাথে ফিট করে তবে এটি আপনার বাফার পুলের 75% এর চেয়ে বড়, আপনি innodb_max_dirty_pages_pctআমদানির সময় 85 বা 95 এ উন্নীত করার চেষ্টা করতে পারেন (ডিফল্ট মান হ'ল 75)। এই কনফিগারেশন প্যারামিটারটি InnoDB কে আক্রমণাত্মকভাবে বাফার পুলটি ফ্লাশ করা শুরু করতে বলেছে যখন নোংরা পৃষ্ঠাগুলির শতাংশ এই সীমাতে পৌঁছে যায়। এই প্যারামিটারটিকে ঘুরিয়ে দিয়ে (এবং আপনি যদি ডেটার আকারে ভাগ্যবান হন), আপনি আপনার আমদানির সময় আক্রমণাত্মক আইও এড়িয়ে যেতে পারেন এবং সেই আইওকে পরে বিলম্ব করতে পারেন।

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

আপনার হাইব্রিড এসএসডি / 5400 আরপিএম ডিস্ক সম্পর্কে, আমি সেগুলি সম্পর্কে কীভাবে এটি অপ্টিমাইজ করব তা জানি না। 5400RPM ডাটাবেসের জন্য ধীর দেখায় তবে এসএসডি তা এড়িয়ে চলেছে। সম্ভবত আপনি নিজের ডিস্কের এসএসডি অংশটি রেডো লগতে সিক্যুয়ালি লিখেছেন এবং এসএসডি পারফরম্যান্সগুলিতে আঘাত করছে। আমি জানি না.

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

আপনি যদি মাল্টি-থ্রেড বিবেচনা করছেন, তবে আপনার কাছে একটি মাল্টি-সকেট (NUMA) কম্পিউটার রয়েছে। এই ক্ষেত্রে, নিশ্চিত হয়ে নিন যে আপনি মাইএসকিউএল সোয়াপ পাগলের সমস্যা এড়াচ্ছেন

আপনি যদি মাইএসকিউএল 5.5 ব্যবহার করছেন তবে মাইএসকিউএল 5.6 এ আপগ্রেড করুন: এতে রেডো লগের আকার বাড়ানোর বিকল্প রয়েছে এবং এতে আরও ভাল বাফার পুল ফ্লাশিং অ্যালগরিদম রয়েছে।

আপনার আমদানির জন্য শুভকামনা।

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