इनसिक्योर इंजन के साथ कुछ गिग्स इनपुट के बाद MySQL LOAD DATA INFILE 80% तक धीमा हो जाता है


14

मैं लोड डेटा इनइमर के माध्यम से 100GB फ़ाइल लोड कर रहा हूं। मुझे MyISAM के साथ अच्छी सफलता मिली है, कुछ घंटे और किए।

मैं इसे अब InnoDB का उपयोग करके देख रहा हूँ। लोड 10 एमबी / सेकंड से अधिक तेजी से शुरू होता है (टेबल फ़ाइल की वृद्धि को देखते हुए, file_per_tableचालू होता है)।

लेकिन लगभग 5GB डेटा के बाद यह 2-4MB / सेकंड की सीमा तक धीमा हो जाता है, क्योंकि मुझे 20GB से अधिक मिलता है यह लगभग 2MB / सेकंड था।

InnoDB बफर पूल का आकार 8G है। और मैंने LOAD DATA INFILE कमांड को चलाने से पहले निम्नलिखित काम किए हैं:

SET @@session.sql_log_bin=0;
SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;
alter table item_load disable keys;
//Run LOAD DATA INFILE....

मैं यह नहीं देख सकता कि क्यों यह अच्छी तरह से शुरू हो रहा है और समय के साथ धीमा हो रहा है।

इसके अलावा, उसी सेटिंग का उपयोग करते हुए, मैंने उसी LOAD DATA INFILE कमांड को InnoDB और MyISAM और 5GB परीक्षण डेटासेट का उपयोग करके चलाया, MyISAM 20x तेज था:

InnoDB:

mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (21 min 25.38 sec)
Records: 2630886  Deleted: 0  Skipped: 0  Warnings: 6

MyISAM:

mysql> LOAD DATA CONCURRENT LOCAL INFILE '/tmp/item' REPLACE INTO TABLE item_load;
Query OK, 2630886 rows affected, 6 warnings (1 min 2.52 sec)
Records: 2630886  Deleted: 0  Skipped: 0  Warnings: 6

मुझे कोशिश करने पर विचार करना चाहिए? MyISAM इंजन लोड रेट को बेहतर बनाए रखने में सक्षम है।


अतिरिक्त जानकारिया:

  • मैंने फ़ाइलों को अलग-अलग लोड करने की कोशिश की है, कोई अंतर नहीं।

  • संयोग से, मेरे पास प्रत्येक 500MB की 150 फाइलें हैं, प्रत्येक फाइल के भीतर कुंजियां छांटी गई हैं।

  • रात भर में 40GB प्राप्त करने के बाद, 12h बाद में, लोड दर 0.5MB / सेकंड तक नीचे थी, जिसका अर्थ है कि ऑपरेशन, व्यावहारिक रूप से बोलना, असंभव है।

  • मुझे अन्य मंचों पर इसी तरह के सवालों के कोई अन्य उत्तर नहीं मिले हैं, यह मुझे प्रतीत हो रहा है कि इनोबीडी आकार में बड़ी मात्रा में डेटा को कुछ जीबी में लोड करने का समर्थन नहीं करता है।

जवाबों:


7

OBSERVATION # 1

मैंने देखा तुम बंद कर दिया autocommit। यह ibdata1 में इतना डेटा ढेर कर देगा। क्यों?

जानकारी के सात (7) वर्ग हैं जो ibdata1 में संग्रहीत हैं:

  • InnoDB टेबल्स के लिए डेटा पृष्ठ
  • InnoDB टेबल्स के लिए इंडेक्स पेज
  • डेटा शब्दकोश
  • डबल लिखें बफर
    • डेटा भ्रष्टाचार को रोकने के लिए सुरक्षा नेट
    • कैशिंग के लिए बाईपास ओएस की मदद करता है
  • बफ़र सम्मिलित करें (द्वितीयक अनुक्रमणिका में परिवर्तन)
  • रोलबैक सेगमेंट
  • लॉग्स को पूर्ववत करें
  • का एक सचित्र प्रतिनिधित्व देखने के लिए यहां क्लिक करें ibdata1

इस जानकारी के कुछ अलगाव स्तर के आधार पर कुछ लेनदेन के लिए दिखाई देता है। इस तरह की कार्रवाइयाँ अनायास ही प्राथमिक कुंजी ताले और बहुत सारे फैंटम डेटा उत्पन्न कर सकती हैं । जैसे-जैसे ये दो चीजें बढ़ती जाती हैं, आपको उम्मीद करनी चाहिए कि यह काफी धीमा हो जाएगा।

सिफारिश: ऑटोकॉमिट पर छोड़ दें

OBSERVATION # 2

मैं देख रहा हूँ तुम यह है:

alter table item_load disable keys;

अक्षम कुंजी InnoDB के साथ काम नहीं करती है । यहाँ क्यों है:

  • MyISAM: DISABLE KEYSबस MyISAM तालिका के लिए अद्यतन करने वाले द्वितीयक सूचकांक को बंद कर देता है। जब आप INISERT को एक MyISAM तालिका में शामिल करते हैं जिसमें चाबियां अक्षम होती हैं, जिसमें एक तेज तालिका लोड होती है, जिसमें PRIMARY KEY और सभी अद्वितीय अनुक्रमित का निर्माण होता है। जब आप दौड़ते हैं ENABLE KEYS, तो सभी माध्यमिक सूचकांक तालिका में रैखिक रूप से बनाए जाते हैं और उन्हें जोड़ दिया जाता है .MYD
  • InnoDB: जैसा कि InnoDB के आंतरिक चित्र में दिखाया गया है, सिस्टम टेबलपीव ibdata1में द्वितीयक सूचकांक सम्मिलन को समर्पित एक संरचना है। वर्तमान में, अनुक्रमणिका को MyISAM के समान संभालने का कोई प्रावधान नहीं है।

इसे समझने के लिए, MySQL में एक InnoDB टेबल पर DISABLE कुंजियों को चलाने के मेरे प्रयास पर ध्यान दें

mysql> show create table webform\G
*************************** 1. row ***************************
       Table: webform
Create Table: CREATE TABLE `webform` (
  `nid` int(10) unsigned NOT NULL,
  `confirmation` text NOT NULL,
  `confirmation_format` tinyint(4) NOT NULL DEFAULT '0',
  `redirect_url` varchar(255) DEFAULT '<confirmation>',
  `status` tinyint(4) NOT NULL DEFAULT '1',
  `block` tinyint(4) NOT NULL DEFAULT '0',
  `teaser` tinyint(4) NOT NULL DEFAULT '0',
  `allow_draft` tinyint(4) NOT NULL DEFAULT '0',
  `submit_notice` tinyint(4) NOT NULL DEFAULT '1',
  `submit_text` varchar(255) DEFAULT NULL,
  `submit_limit` tinyint(4) NOT NULL DEFAULT '-1',
  `submit_interval` int(11) NOT NULL DEFAULT '-1',
  PRIMARY KEY (`nid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

mysql> alter table webform disable keys;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show warnings;
+-------+------+-------------------------------------------------------------+
| Level | Code | Message                                                     |
+-------+------+-------------------------------------------------------------+
| Note  | 1031 | Table storage engine for 'webform' doesn't have this option |
+-------+------+-------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.27-log |
+------------+
1 row in set (0.00 sec)

mysql>

OBSERVATION # 3

आपने देखा कि MyISAM, InnoDB की तुलना में 20 गुना अधिक तेज है। क्या आप इसे 24-25 गुना अधिक तेजी से पसंद करेंगे? फिर निम्नलिखित को चलाएँ:

ALTER TABLE item_load ROW_FORMAT=Fixed;

यह बिना किसी अन्य डीडीएल परिवर्तन के INSERTs को 20-25% तक बढ़ा देगा । साइड इफेक्ट: MyISAM टेबल आकार में 80% -100% बढ़ सकता है, संभवतः बड़ा।

आप इसे एक InnoDB तालिका पर भी चला सकते हैं, लेकिन ACID- संगत व्यवहार और InnoDB का MVCC अभी भी इसके प्रदर्शन की अड़चन होगी, खासकर अगर VARCHAR क्षेत्रों में उल्लेखनीय रूप से वृद्धि हुई है ibdata1


पहली 2 टिप्पणियों में मैं जिन चीजों को जोड़ने की कोशिश कर रहा था, उन्हें ठीक करने के बाद मैंने पहली बार देखा, मेरा पहला प्रयास स्वाभाविक रूप से अकेले छोड़ने की थी (बस बिन लॉगिंग बंद करें)। तीसरे अवलोकन पर, मेरे डेटा का आकार लंबाई में अत्यधिक परिवर्तनशील है, मुझे लगता है कि यह एक समस्या होगी? मुझे ऐसा लग रहा है कि मुझे बस इस मेज को रखने की जरूरत है।
डेविड पार्क

6

इस प्रश्न का अंतिम उत्तर एक विशाल संदर्भ तालिका के लिए InnoDB का उपयोग नहीं करना था। MyISAM तेजी से चिल्ला रहा है, पूरे लोड के लिए डिस्क की गति के पूर्ण प्रवाह के पास, InnoDB नीचे से टकराता है। MyISAM सरल है, लेकिन इस मामले में इस तालिका की आवश्यकताएं हैं। LOAD DATA INFILE पर थोक भार के साथ एक साधारण संदर्भ तालिका के लिए, MyISAM जाने का रास्ता है, अब तक बहुत अच्छा है।

लेकिन ध्यान दें कि यदि आप MyISAM और InnoDB टेबल दोनों चलाते हैं, तो आपको 2 कैशिंग तंत्रों के लिए मेमोरी आवंटन पर विचार करने की आवश्यकता है, प्रत्येक इंजन का अपना विशिष्ट कैशिंग है जिसे अलग मेमोरी आवंटन की आवश्यकता होती है।


5

आप अपनी इनपुट फ़ाइलों को छोटे विखंडू में विभाजित करने का प्रयास कर सकते हैं।

मैं इसके लिए व्यक्तिगत रूप से http://www.percona.com/doc/percona-toolkit/2.1/pt-fifo-split.html का उपयोग करता हूं ।

यदि आपको आयात के दौरान टेबल के लिए टेबल लॉक मिलता है तो क्या होगा? हो सकता है कि InnoDB का रोवेल लॉकिंग इसे धीमा कर दे (MyISAM एक टेबल लॉक का उपयोग करता है)।

आप आगे के विचारों के लिए यहां भी पढ़ सकते हैं: http://derwiki.tumblr.com/post/24490758395/loading-half-a-billion-rows-into-mysql


मेरी फाइलें पहले से ही 500 एमबी चंक में हैं, मैं लोड को आसान बनाने के लिए एक एकल नामित पाइप के माध्यम से उन सभी को पाइप कर रहा था, लेकिन मैं अब इस दृष्टिकोण की कोशिश करूंगा।
डेविड पार्क

यहाँ कोई अंतर नहीं देख रहा है, बहुत जल्दी मैं डेटा की 11MB / सेकंड विस्तार से स्पीड ड्रॉप को 6MB (लगभग 2GB के बाद) डेटा में देख रहा हूँ और इसे छोड़ना जारी है। मैं सभी फ़ाइलों को लूप के लिए लोड कर रहा हूं, अलग-अलग mysql कॉल करें।
डेविड पार्क

पहली फ़ाइल 54s, 3m39s में 2, 3m9s में तीसरी, 4m7s, 5m21s, और इसी तरह भरी हुई है। सभी फाइलें aprox समान आकार की हैं।
डेविड पार्क

2

यदि आपका पीके AUTO_INCREMENT नहीं है या सीएसवी फ़ाइल में डेटा पीके पर सॉर्ट नहीं किया गया है, तो यह डेटालेड के प्रदर्शन को प्रभावित कर सकता है। चूंकि MySQL में तालिका एक इंडेक्स है, इसलिए सभी डेटा सॉर्ट किए गए क्रम में संग्रहीत किए जाते हैं, यदि PK की मान AUTO_INCREMENT पर नहीं है, तो MySQL की तुलना में सॉर्ट किए गए डेटा को संग्रहीत करने के लिए बहुत सारे डेटा शिफ्टिंग करना पड़ता है। जब टेबल का आकार बढ़ना शुरू होता है तो यह धीमे डेटा लोड का कारण होता है।

मैं लोड के साथ 91GB csv फ़ाइल लोड कर रहा हूं AUTO_INCREMENT पर LOAD DATA INFILE का उपयोग कर रहा हूं और मुझे अपने थ्रूपुट में कोई गिरावट नहीं दिख रही है। मुझे 140K से 145K इंसर्ट प्रति सेकंड मिल रहे हैं। Percona MySQL 5.6.38 का उपयोग करना

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.