আমি প্রায় 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
SHOW CREATE TABLE yourtable\G
এই 10 মিলিয়ন সারি সারণির টেবিল কাঠামোটি দেখানোর জন্য দয়া করে চালান
innodb_doublewrite = 0
) আপনার মাইএসকিউএল ইনস্টলেশনটি ক্রাশ নিরাপদ নয়: আপনার যদি কোনও পাওয়ার ব্যর্থতা থাকে (কোনও মাইএসকিউএল ক্র্যাশ নয়), আপনার ডেটা নিঃশব্দে দূষিত হতে পারে।