মাইএসকিউএল লোড ডেটা ইনফিল InnoDB ইঞ্জিনের সাথে কয়েক জিগ ইনপুট দেওয়ার পরে 80% কমিয়ে দেয়


14

আমি লোড ডেটা ইনফিলের মাধ্যমে একটি 100 গিগাবাইট ফাইল লোড করছি। আমি মাইআইএসএএম এর সাথে বেশ কয়েক ঘন্টা ভাল সাফল্য পেয়েছি এবং করেছি।

আমি এখন এটি InnoDB ব্যবহার করে চেষ্টা করছি। লোডটি 10MB / সেকেন্ডের চেয়ে দ্রুত শুরু হয় (টেবিল ফাইলের বিকাশটি দেখানো হয়, file_per_tableচালু করা হয়)।

তবে প্রায় 5 জিবি ডেটার পরে এটি 2-4MB / সেকেন্ড পরিসরে গতি কমে যায়, আমি যখন 20 গিগাবাইটের বেশি পাই তখন এটি 2MB / সেকেন্ডের কাছাকাছি ছিল।

InnoDB বাফার পুলের আকার 8G। এবং লোড ডেটা ইনফিল কমান্ডটি চালানোর আগে আমি নিম্নলিখিতটি সম্পাদন করেছি:

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....

কেন এটি ভাল শুরু এবং সময়ের সাথে ধীর হয়ে যাওয়ার কারণ আমি দেখতে পাচ্ছি না।

এছাড়াও, একই সেটিংস ব্যবহার করে, আমি টেবিলের সাথে ইনোডিবি এবং মাইআইএসএএম এবং একটি 5 গিগাবাইট টেস্ট ডেটাসেট ব্যবহার করে একই লোড ডেটা ইনফিল কমান্ডটি চালিয়েছি, মাইআইএসএএম 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

আমার আর কিছু চেষ্টা করা বিবেচনা করা উচিত? মাইআইএসএএম ইঞ্জিন লোডের হার আরও ভাল রাখতে সক্ষম।


অতিরিক্ত তথ্য:

  • আমি পৃথকভাবে ফাইলগুলি লোড করার চেষ্টা করেছি, কোনও পার্থক্য নেই।

  • ঘটনাচক্রে, আমার প্রতিটি 500MB এর 150 টি ফাইল রয়েছে, প্রতিটি ফাইলের মধ্যে কীগুলি বাছাই করা হয়।

  • রাতারাতি 40 গিগাবাইট পাওয়ার পরে, 12 ঘন্টা পরে, লোডের হারটি 0.5MB / সেকেন্ডে নেমে গেছে, যার অর্থ কার্যকরীভাবে বলা যায়, ব্যবহারিকভাবে বলা অসম্ভব।

  • অন্যান্য ফোরামে অনুরূপ প্রশ্নের উত্তর আমি অন্য কোনও সন্ধান পাইনি, এটি আমার কাছে মনে হয় যে ইনোডিবি কয়েকটি জিবি আকারে বড় আকারের ডেটা টেবিলগুলিতে লোড করতে সমর্থন করে না।

উত্তর:


7

পর্যবেক্ষণ # 1

আমি তোমাদের বন্ধ পরিণত খেয়াল autocommit। এটি আইবডাটা 1 তে এত বেশি ডেটা পাইল করবে। কেন?

ইবদাতা 1 এ তথ্য সংরক্ষণের (7) শ্রেণি রয়েছে:

  • InnoDB টেবিলগুলির জন্য ডেটা পৃষ্ঠাগুলি
  • ইনোডিবি টেবিলগুলির জন্য সূচক পৃষ্ঠা
  • তথ্য অভিধান
  • ডাবল রাইট বাফার
    • ডেটা দুর্নীতি রোধে সুরক্ষা নেট
    • ক্যাচিংয়ের জন্য বাইপাস ওএসকে সহায়তা করে
  • বাফারটি সন্নিবেশ করুন (দ্বিতীয় সূচকে স্ট্রিমলাইন পরিবর্তনগুলি)
  • রোলব্যাক সেগমেন্টস
  • লগগুলি পূর্বাবস্থায় ফেরান
  • চিত্রের উপস্থাপনা দেখতে এখানে ক্লিক করুন ibdata1

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

প্রস্তাবনা: অটোমোটি চালু করুন

পর্যবেক্ষণ # 2

আমি দেখতে পাচ্ছি আপনার এটি আছে:

alter table item_load disable keys;

অক্ষম কীগুলি InnoDB এর সাথে কাজ করে না । এখানে কেন:

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

এটি চিত্রিত করার জন্য, মাইএসকিউএল-র একটি ইনোডিবি টেবিলে অক্ষম কীগুলি চালানোর জন্য আমার প্রচেষ্টাটি নোট করুন

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>

পর্যবেক্ষণ # 3

আপনি লক্ষ্য করেছেন যে মাইআইএসএএম InnoDB এর চেয়ে 20x দ্রুত লোড করে। আপনি কি আরও 24-25 বারের মতো দ্রুত হতে চান? তারপরে নিম্নলিখিতটি চালান:

ALTER TABLE item_load ROW_FORMAT=Fixed;

এটি কোনও ডিডিএল পরিবর্তন ছাড়াই 20-25% ইনসার্টের গতি বাড়িয়ে তুলবে । পার্শ্ব প্রতিক্রিয়া: মাইআইএসএএম টেবিলটি সম্ভবত 80% আকারে 80% -100% বাড়তে পারে larger

আপনি এটি একটি ইনোডিবি টেবিলেও চালাতে পারেন, তবে এসিআইডি- সম্মতিজনক আচরণ এবং ইনোডিবি'র এমভিসিসি এখনও তার অভিনয়টির প্রতিবন্ধক হবে, বিশেষত যদি ভর্চারের ক্ষেত্রগুলি উল্লেখযোগ্যভাবে বৃদ্ধি পায় তবে এটি লিখিত হয় ibdata1


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

6

এই প্রশ্নের চূড়ান্ত উত্তরটি ছিল একটি বিশাল রেফারেন্স সারণীর জন্য InnoDB ব্যবহার না করা। মাইআইএসএএম দ্রুত চিৎকার করছে, পুরো লোডের জন্য ডিস্ক গতির পুরো থ্রুটপুট কাছে, ইনোডিবি বোগ করছে। মাইআইএসএএম সহজ, তবে এক্ষেত্রে এই টেবিলের প্রয়োজনীয়তাও রয়েছে। লোড ডেটা ইনফাইলে প্রচুর পরিমাণে বোঝা সহ একটি সাধারণ রেফারেন্স টেবিলের জন্য, মাইএসএএম এখন পর্যন্ত যাবার উপায়।

তবে মনে রাখবেন যে আপনি মাইআইএসএএম এবং ইনোডিবি টেবিল দুটি চালনা করলে আপনি দুটি ক্যাচিং পদ্ধতির জন্য মেমরি বরাদ্দ বিবেচনা করতে যাচ্ছেন, প্রতিটি ইঞ্জিনের নিজস্ব অনন্য ক্যাশিং রয়েছে যার জন্য পৃথক মেমরি বরাদ্দ প্রয়োজন।


5

আপনি নিজের ইনপুট ফাইলগুলি ছোট অংশগুলিতে ভাগ করার চেষ্টা করতে পারেন।

আমি ব্যক্তিগতভাবে এই জন্য http://www.percona.com/doc/percona-toolkit/2.1/pt-fifo-split.html ব্যবহার করি ।

আমদানির সময় আপনি যদি টেবিলের জন্য একটি টেবিল লক পান তবে কি হবে? হতে পারে ইনোডিবি-র রোলেভেল লকিং এটিকে ধীর করে দেয় (মাইআইএসএএম একটি টেবিল লক ব্যবহার করে)।

এছাড়াও আপনি আরও আইডিয়ার জন্য এখানে পড়তে পারে: http://derwiki.tumblr.com/post/24490758395/loading-half-a-billion-rows-into-mysql


আমার ফাইলগুলি ইতিমধ্যে 500 এমবি খণ্ডে রয়েছে, বোঝা আরও সহজ করার জন্য আমি একক নামকরণ পাইপের মাধ্যমে সেগুলি সমস্ত পাইপ করছিলাম, তবে আমি এখনই এই পদ্ধতির চেষ্টা করব।
ডেভিড পার্কস

এখানে কোনও পার্থক্য দেখা যাচ্ছে না, খুব দ্রুত আমি দেখতে পাচ্ছি 11MB / সেকেন্ডের ডিবি ফাইলের সেকেন্ডার থেকে 6 এমবি (প্রায় 2 গিগাবাইটের পরে) ডেটা এবং এটি ড্রপ অবিরত রয়েছে। আমি লুপ, আলাদা মাইএসকিএল কলগুলির জন্য সমস্ত ফাইল লোড করছি।
ডেভিড পার্কস

প্রথম ফাইলটি 54 সেকেন্ডে লোড হয়েছে, 3 ম 39 এ দ্বিতীয়, 3 ম 9 এস, 4 এম 7 এস, 5 এম 21 এ, এবং আরও কিছু on সমস্ত ফাইল একই আকারের aprox।
ডেভিড পার্কস

2

আপনার পিকে যদি স্বয়ংক্রিয়রূপ না হয় বা সিএসভি ফাইলে ডেটা পিকে তে সাজানো না হয় এটি ডেটালয়েডের কার্যকারিতা প্রভাবিত করতে পারে। যেহেতু মাইএসকিউএলে টেবিলটি একটি সূচক তাই সমস্ত ডেটা বাছাই করা ক্রমে সংরক্ষণ করা হয়, যদি পিকে মান মাইএসকিউএল এর চেয়ে বেশি হয় না তবে মাইএসকিউএল তথ্যের অনুসারে বাছাই করা তথ্য সংরক্ষণের জন্য প্রচুর ডেটা স্থানান্তর করতে হয়। টেবিলের আকার বাড়তে শুরু করার সময় ধীরে ধীরে ডেটা লোড হওয়ার কারণ এটি।

আমি লগ ডেটা ইনফিল ব্যবহার করে পটকের সাথে পিকে দিয়ে 91 জিবি সিএসভি ফাইলটি লোড করছি এবং আমার থ্রুপুটে কোনও ড্রপ দেখতে পাচ্ছি না। আমি সেকেন্ডে 140K থেকে 145K সন্নিবেশ পাচ্ছি। পারকোনা মাইএসকিউএল 5.6.38 ব্যবহার করা

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