मैं एक बहुत बड़ी InnoDB-तालिका आयात करने के साथ थोक में संघर्ष कर रहा हूँ जिसमें लगभग 10 मिलियन पंक्तियाँ (या 7GB) हैं (जो मेरे लिए मेरे द्वारा अब तक काम की गई सबसे बड़ी तालिका है)।
मैंने कुछ शोध किया कि इनो की आयात गति में सुधार कैसे किया जाए और फिलहाल मेरा सेटअप इस तरह दिखता है:
/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 मिनट
- 4 मिलियन पंक्तियाँ: (2 घंटे के बाद रद्द)
ऐसा लगता है कि कोई 'रसोई की किताब' समाधान नहीं है और किसी को अपने आप ही सेटिंग्स के इष्टतम मिश्रण का पता लगाना होगा।
अपने सेट अप में क्या बदलाव करना है इसके बारे में सुझाव के अलावा, मैं वास्तव में अधिक जानकारी की सराहना करूंगा कि मैं आयात प्रक्रिया को बेहतर कैसे मान सकता हूं / अधिक जानकारी प्राप्त कर सकता हूं कि क्या हो रहा है और कहां अड़चन हो सकती है।
मैंने उन सेटिंग्स के लिए दस्तावेज़ीकरण को पढ़ने की कोशिश की जो मैं बदल रहा हूं, लेकिन फिर मैं किसी भी साइड-इफेक्ट के बारे में नहीं जानता हूं और अगर मैं बुरी तरह से चुने गए मूल्य के साथ प्रदर्शन को कम कर सकता हूं।
फिलहाल मैं MyISAM
आयात के दौरान उपयोग करने और बाद में टेबल इंजन बदलने के लिए चैट से एक सुझाव की कोशिश करना चाहूंगा ।
मैं यह कोशिश करना चाहता हूं, लेकिन इस पल के लिए मेरी DROP TABLE
क्वेरी को समाप्त होने में भी घंटों लगते हैं। (जो एक और संकेतक लगता है कि मेरी सेटिंग कम है तो इष्टतम है)।
अतिरिक्त जानकारी:
वर्तमान में मैं जिस मशीन का उपयोग कर रहा हूं उसमें 8GB RAM और एक सॉलिड स्टेट हाइब्रिड हार्ड ड्राइव w / 5400RPM है।
हालांकि, हमारा लक्ष्य तालिका के अप्रचलित डेटा को हटाने का लक्ष्य है, जबकि मुझे अभी भी विकासशील और
बी) के
परीक्षण के लिए कुछ हद तक तेजी से आयात की आवश्यकता है, automatic data cleanup feature
जबकि
हमारे सर्वर के क्रैश होने पर हम अपने 2 सर्वर को प्रतिस्थापन के रूप में उपयोग करना चाहते हैं (जिसकी आवश्यकता है) अंतिम तिथि डेटा, अंतिम आयात 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
) को अक्षम करने से आपका MySQL इंस्टॉलेशन सुरक्षित क्रैश नहीं होता है: यदि आपके पास कोई पावर विफलता (MySQL क्रैश नहीं है), तो आप डेटा को चुपचाप दूषित कर सकते हैं।