মাইএসকিউএল একক টেবিলে 10 মিলিয়ন + সারিগুলি কীভাবে সম্ভব দ্রুত আপডেট করবেন?


32

সর্বাধিক সারণীর জন্য InnoDB স্টোরেজ ইঞ্জিন সহ মাইএসকিউএল 5.6 ব্যবহার করা। ইনোডিবি বাফার পুলের আকার 15 গিগাবাইট এবং ইনোডবি ডিবি + সূচকগুলি প্রায় 10 জিবি। সার্ভারে 32 গিগাবাইট র‌্যাম রয়েছে এবং এটি সেন্ট ওএস 7 x64 চলছে।

আমার কাছে একটি বড় টেবিল রয়েছে যার মধ্যে প্রায় 10 মিলিয়ন + রেকর্ড রয়েছে।

আমি প্রতি 24 ঘন্টা একটি রিমোট সার্ভার থেকে একটি আপডেট ডাম্প ফাইল পাই। ফাইলটি সিএসভি ফর্ম্যাটে রয়েছে। এই ফর্ম্যাটটিতে আমার নিয়ন্ত্রণ নেই। ফাইলটি 750 এমবি। আমি মাইআইএসএএম টেবিল সারিতে সারি সারি ডেটা triedোকানোর চেষ্টা করেছি এবং এটিতে 35 মিনিট সময় লেগেছে।

ফাইল থেকে 10-12 এর মধ্যে আমার প্রতি লাইনে কেবল 3 টি মান নেওয়া এবং এটি ডাটাবেসে আপডেট করা দরকার।

এরকম কিছু অর্জনের সর্বোত্তম উপায় কী?

আমাকে প্রতিদিন এটি করা দরকার।

বর্তমানে প্রবাহ এরকম:

  1. mysqli_begin_transaction
  2. লাইন ডাম্প ফাইল লাইন পড়ুন
  3. লাইন দ্বারা প্রতিটি রেকর্ড লাইন আপডেট করুন।
  4. mysqli_commit

উপরের অপারেশনগুলি প্রায় 30-40 মিনিট সময় নেয় এবং এটি করার সময়, অন্যান্য আপডেটগুলি চলছে যা আমাকে দেয়

লকের অপেক্ষার সময়সীমা অতিক্রম করে; লেনদেন পুনরায় চালু করার চেষ্টা করুন

আপডেট 1

নতুন টেবিল ব্যবহার করে ডেটা লোড হচ্ছে LOAD DATA LOCAL INFILE। মাইআইএসএএম-তে এটি ইনোইডিবিতে 38.93 sec7 মিনিট ৫.২১ সেকেন্ড সময় নিয়েছে। তারপরে আমি করলাম:

UPDATE table1 t1, table2 t2
SET 
t1.field1 = t2.field1,
t1.field2 = t2.field2,
t1.field3 = t2.field3
WHERE t1.field10 = t2.field10

Query OK, 434914 rows affected (22 hours 14 min 47.55 sec)

আপডেট 2

যোগদানের প্রশ্নের সাথে একই আপডেট

UPDATE table1 a JOIN table2 b 
ON a.field1 = b.field1 
SET 
a.field2 = b.field2,
a.field3 = b.field3,
a.field4 = b.field4

(14 hours 56 min 46.85 sec)

মন্তব্যে প্রশ্ন থেকে স্পষ্টতা:

  • টেবিলের প্রায় 6% সারি ফাইল দ্বারা আপডেট করা হবে তবে কখনও কখনও এটি 25% এরও বেশি হতে পারে।
  • ক্ষেত্রগুলিতে আপডেট হওয়া সূচীতে রয়েছে। টেবিলটিতে 12 টি সূচক রয়েছে এবং 8 টি সূচীতে আপডেট ক্ষেত্র অন্তর্ভুক্ত রয়েছে।
  • এটা তোলে নয় প্রয়োজনীয় এক লেনদেন হালনাগাদ না। এটি সময় নিতে পারে তবে 24 ঘন্টাের বেশি সময় নিতে পারে না। আমি পুরো টেবিলটি লক না করেই 1 ঘন্টার মধ্যে এটি সম্পন্ন করতে চাইছি, কারণ পরে আমাকে স্পিনেক্স সূচকটি আপডেট করতে হবে যা এই টেবিলের উপর নির্ভরশীল। অন্যান্য কাজের জন্য ডাটাবেস উপলব্ধ থাকাকালীন পদক্ষেপগুলি দীর্ঘতর সময় নেয় কিনা তা বিবেচ্য নয়।
  • আমি প্রিপ্রসেসি পদক্ষেপে সিএসভি ফর্ম্যাটটি সংশোধন করতে পারি। কেবলমাত্র হালকা হালনাগাদ এবং লক ছাড়াই গুরুত্বপূর্ণ বিষয়।
  • সারণী 2 হ'ল মাইআইএসএএম। এটি লোড ডেটা ইনফিল ব্যবহার করে সিএসভি ফাইল থেকে নতুন তৈরি টেবিল। এমওয়াইআই ফাইলের আকার 452 এমবি। সারণী 2 ফিল্ড 1 কলামে সূচিযুক্ত।
  • মাইআইএসএএম টেবিলের এমওয়াইডি 663 এমবি।

আপডেট 3:

এখানে উভয় টেবিল সম্পর্কে আরও বিশদ রয়েছে।

CREATE TABLE `content` (
  `hash` char(40) CHARACTER SET ascii NOT NULL DEFAULT '',
  `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `og_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `keywords` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `files_count` smallint(5) unsigned NOT NULL DEFAULT '0',
  `more_files` smallint(5) unsigned NOT NULL DEFAULT '0',
  `files` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
  `category` smallint(3) unsigned NOT NULL DEFAULT '600',
  `size` bigint(19) unsigned NOT NULL DEFAULT '0',
  `downloaders` int(11) NOT NULL DEFAULT '0',
  `completed` int(11) NOT NULL DEFAULT '0',
  `uploaders` int(11) NOT NULL DEFAULT '0',
  `creation_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `upload_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `last_updated` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `vote_up` int(11) unsigned NOT NULL DEFAULT '0',
  `vote_down` int(11) unsigned NOT NULL DEFAULT '0',
  `comments_count` int(11) NOT NULL DEFAULT '0',
  `imdb` int(8) unsigned NOT NULL DEFAULT '0',
  `video_sample` tinyint(1) NOT NULL DEFAULT '0',
  `video_quality` tinyint(2) NOT NULL DEFAULT '0',
  `audio_lang` varchar(127) CHARACTER SET ascii NOT NULL DEFAULT '',
  `subtitle_lang` varchar(127) CHARACTER SET ascii NOT NULL DEFAULT '',
  `verified` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `uploader` int(11) unsigned NOT NULL DEFAULT '0',
  `anonymous` tinyint(1) NOT NULL DEFAULT '0',
  `enabled` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `tfile_size` int(11) unsigned NOT NULL DEFAULT '0',
  `scrape_source` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `record_num` int(11) unsigned NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`record_num`),
  UNIQUE KEY `hash` (`hash`),
  KEY `uploaders` (`uploaders`),
  KEY `tfile_size` (`tfile_size`),
  KEY `enabled_category_upload_date_verified_` (`enabled`,`category`,`upload_date`,`verified`),
  KEY `enabled_upload_date_verified_` (`enabled`,`upload_date`,`verified`),
  KEY `enabled_category_verified_` (`enabled`,`category`,`verified`),
  KEY `enabled_verified_` (`enabled`,`verified`),
  KEY `enabled_uploader_` (`enabled`,`uploader`),
  KEY `anonymous_uploader_` (`anonymous`,`uploader`),
  KEY `enabled_uploaders_upload_date_` (`enabled`,`uploaders`,`upload_date`),
  KEY `enabled_verified_category` (`enabled`,`verified`,`category`),
  KEY `verified_enabled_category` (`verified`,`enabled`,`category`)
) ENGINE=InnoDB AUTO_INCREMENT=7551163 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=FIXED


CREATE TABLE `content_csv_dump_temp` (
  `hash` char(40) CHARACTER SET ascii NOT NULL DEFAULT '',
  `title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `category_id` int(11) unsigned NOT NULL DEFAULT '0',
  `uploaders` int(11) unsigned NOT NULL DEFAULT '0',
  `downloaders` int(11) unsigned NOT NULL DEFAULT '0',
  `verified` tinyint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`hash`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

এবং এখানে আপডেট ক্যোয়ারী যা contentথেকে ডেটা ব্যবহার করে সারণি আপডেট করা হয়content_csv_dump_temp

UPDATE content a JOIN content_csv_dump_temp b 
ON a.hash = b.hash 
SET 
a.uploaders = b.uploaders,
a.downloaders = b.downloaders,
a.verified = b.verified

আপডেট 4:

উপরের সমস্ত পরীক্ষা টেস্ট মেশিনে করা হয়েছিল। তবে এখন আমি প্রোডাকশন মেশিনে একই পরীক্ষা করেছি, এবং অনুসন্ধানগুলি খুব দ্রুত।

mysql> UPDATE content_test a JOIN content_csv_dump_temp b
    -> ON a.hash = b.hash
    -> SET
    -> a.uploaders = b.uploaders,
    -> a.downloaders = b.downloaders,
    -> a.verified = b.verified;
Query OK, 2673528 rows affected (7 min 50.42 sec)
Rows matched: 7044818  Changed: 2673528  Warnings: 0

আমি আমার ভুলের জন্য ক্ষমা চাই প্রতিটি রেকর্ড আপডেটের পরিবর্তে জয়েন ব্যবহার করা আরও ভাল। এখন আমি রিক_জেমস দ্বারা প্রস্তাবিত সূচকটি ব্যবহার করে এমপ্রে উন্নত করার চেষ্টা করছি, বেঞ্চ-মার্কিং হয়ে গেলে আপডেট হবে।


আপনার কি কোনও সংমিশ্রণ রয়েছে INDEX(field2, field3, field4) (কোনও ক্রমে)? দয়া করে আমাদের দেন SHOW CREATE TABLE
রিক জেমস

1
12 এবং 8 সূচকগুলি আপনার সমস্যার একটি গুরুতর অংশ। মাইআইএসএএম আরেকটি গুরুতর অঙ্গ। ইনোডিবি বা টোকুডিবি একাধিক সূচকের সাথে আরও ভাল পারফর্ম করে।
রিক জেমস

আপনার দুটি আলাদা আছে UPDATEs । সিএসভি ডেটা থেকে টেবিল আপডেট করার জন্য সোজাসুজি বিবৃতি ঠিক কেমন দেখাচ্ছে তা আমাদের জানান । তারপরে আমরা আপনাকে এমন একটি কৌশল তৈরি করতে সহায়তা করতে পারি যা আপনার প্রয়োজনীয়তাগুলি পূরণ করে।
রিক জেমস

@ রিকজেমস কেবল একটিই আছে updateএবং দয়া করে আপডেট হওয়া প্রশ্নটি পরীক্ষা করুন। ধন্যবাদ
এএমবি

উত্তর:


17

আমার অভিজ্ঞতার ভিত্তিতে আমি আপনার সিএসভি ফাইলটি আমদানি করতে লোড ডেটা ইনফিল ব্যবহার করব ।

লোড ডেটা ইনফিল বিবৃতিটি একটি খুব উচ্চ গতিতে একটি টেক্সটে পাঠ্য ফাইল থেকে সারিগুলি পড়ছে।

উদাহরণ আমি ইন্টারনেটে লোড ডেটা উদাহরণে পেয়েছি । আমি আমার বাক্সে এই উদাহরণটি পরীক্ষা করেছি এবং ভাল কাজ করেছি

উদাহরণ সারণী

CREATE TABLE example (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Column2` varchar(14) NOT NULL,
  `Column3` varchar(14) NOT NULL,
  `Column4` varchar(14) NOT NULL,
  `Column5` DATE NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB

সিএসভি ফাইলের উদাহরণ

# more /tmp/example.csv
Column1,Column2,Column3,Column4,Column5
1,A,Foo,sdsdsd,4/13/2013
2,B,Bar,sdsa,4/12/2013
3,C,Foo,wewqe,3/12/2013
4,D,Bar,asdsad,2/1/2013
5,E,FOObar,wewqe,5/1/2013

মাইএসকিউএল কনসোল থেকে চালানোর জন্য আমদানি বিবৃতি

LOAD DATA LOCAL INFILE '/tmp/example.csv'
    -> INTO TABLE example
    -> FIELDS TERMINATED BY ','
    -> LINES TERMINATED BY '\n'
    -> IGNORE 1 LINES
    -> (id, Column3,Column4, @Column5)
    -> set
    -> Column5 = str_to_date(@Column5, '%m/%d/%Y');

ফল

MySQL [testcsv]> select * from example;
+----+---------+---------+---------+------------+
| Id | Column2 | Column3 | Column4 | Column5    |
+----+---------+---------+---------+------------+
|  1 |         | Column2 | Column3 | 0000-00-00 |
|  2 |         | B       | Bar     | 0000-00-00 |
|  3 |         | C       | Foo     | 0000-00-00 |
|  4 |         | D       | Bar     | 0000-00-00 |
|  5 |         | E       | FOObar  | 0000-00-00 |
+----+---------+---------+---------+------------+

IGNORE কেবল কলাম শিরোনাম যা প্রথম লাইন উপেক্ষা করে।

আইজিনোরের পরে, আমরা আমদানি করতে কলামগুলি (কলাম 2 এড়িয়ে যাওয়া) নির্দিষ্ট করছি, যা আপনার প্রশ্নের মানদণ্ডগুলির একটির সাথে মেলে।

এখানে ওরাকল থেকে সরাসরি অন্য একটি উদাহরণ রয়েছে: লড ডেটা ইনফাইলের উদাহরণ

আপনার শুরু করার জন্য এটি যথেষ্ট হবে।


আমি টেম্প টেবিলটিতে ডেটা লোড করার জন্য লোড ডেটা ব্যবহার করতে পারি এবং তারপরে এটি মুখ্য টেবিলে আপডেট করতে অন্যান্য প্রশ্নগুলি ব্যবহার করতে পারি, ধন্যবাদ
এএমবি

14

উল্লিখিত সমস্ত বিষয়গুলির আলোকে, দেখে মনে হচ্ছে যেন বাধাটি নিজেই যোগদান করে।

সহায়তা # 1: বাফার আকারে যোগদান করুন

সমস্ত সম্ভাবনায়, আপনার যোগদান_বাফার_ আকার সম্ভবত খুব কম।

মাইএসকিউএল ডকুমেন্টেশন অনুসারে কীভাবে মাইএসকিউএল যোগ দিন বাফার ক্যাশে ব্যবহার করে

আমরা কেবল ব্যবহৃত কলামগুলিকে জোড় বাফারে সংরক্ষণ করি, পুরো সারিগুলিতে নয়।

এটি হ'ল জোড় বাফারের কীগুলি র‌্যামে থাকুন।

আপনার প্রতিটি কি জন্য 10 মিলিয়ন সারি গুণ 4 বাইট রয়েছে। এটা প্রায় 40M।

সেশনটিতে এটিকে ৪২০ এম (৪০ এম এর চেয়ে কিছুটা বড়) এড়িয়ে দেওয়ার চেষ্টা করুন

SET join_buffer_size = 1024 * 1024 * 42;
UPDATE table1 a JOIN table2 b 
ON a.field1 = b.field1 
SET 
a.field2 = b.field2,
a.field3 = b.field3,
a.field4 = b.field4;

এটি যদি কৌশলটি করে তবে এটিকে যুক্ত করতে এগিয়ে যান my.cnf

[mysqld]
join_buffer_size = 42M

নতুন সংযোগের জন্য মাইএসকিএলডি পুনরায় চালু করার প্রয়োজন নেই। শুধু রান

mysql> SET GLOBAL join_buffer_size = 1024 * 1024 * 42;

সহায়তা # 2: অপারেশনে যোগ দিন Join

আপনি অপ্টিমাইজারটি টুইট করে যোগদানের ক্রিয়াকলাপের স্টাইলটি পরিচালনা করতে পারেন

মাইএসকিউএল ডকুমেন্টেশন অনুসারে ব্লক নেস্টড-লুপ এবং ব্যাচড কী অ্যাক্সেসে যোগ দেয়

বিকেএ ব্যবহার করা হলে, join_buffer_size এর মান নির্ধারণ করে যে কীগুলির ব্যাচ স্টোরেজ ইঞ্জিনে প্রতিটি অনুরোধে কত বড়। বাফার যত বড় হবে তত ক্রমযুক্ত অ্যাক্সেস একটি যোগদানের ক্রিয়াকলাপের ডান হাতের টেবিলে থাকবে, যা পারফরম্যান্সে উল্লেখযোগ্যভাবে উন্নতি করতে পারে।

বিকেএ ব্যবহার করার জন্য, অপটিমাইজার_সুইচ সিস্টেম ভেরিয়েবলের ব্যাচড_কি_অ্যাক্সেস পতাকাটি অবশ্যই সেট করতে হবে। বিকেএ এমআরআর ব্যবহার করে, তাই মিঃ পতাকাও অবশ্যই চালু থাকতে হবে। বর্তমানে, এমআরআরের জন্য ব্যয়ের অনুমান খুব হতাশাব্যঞ্জক। সুতরাং, বিকেএ ব্যবহারের জন্য এমআরআর_কোস্ট_ভিত্তিক বন্ধ থাকাও প্রয়োজনীয়।

এই একই পৃষ্ঠাটি এটি করার পরামর্শ দেয়:

mysql> SET optimizer_switch='mrr=on,mrr_cost_based=off,batched_key_access=on';

ASPECT # 3: ডিস্কে আপডেটগুলি লেখা (বিকল্প)

বেশিরভাগ বাফার পুলের বাইরে নোংরা পৃষ্ঠাগুলি দ্রুত লেখার জন্য ইনোডাব_রাইট_আই_থ্রেডগুলি বাড়িয়ে দিতে ভুলে যান।

[mysqld]
innodb_write_io_threads = 16

এই পরিবর্তনের জন্য আপনাকে মাইএসকিউএল পুনরায় চালু করতে হবে

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


নিস! টিউনেবল জোড় বাফার টিপ জন্য +1। আপনি যদি যোগ দিতে চান, মেমরিতে যোগ দিন। ভালো পরামর্শ!
পিটার ডিকসন-মূসা

3
  1. CREATE TABLE যা সিএসভির সাথে মেলে
  2. LOAD DATA যে টেবিলের মধ্যে
  3. UPDATE real_table JOIN csv_table ON ... SET ..., ..., ...;
  4. DROP TABLE csv_table;

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

যদি অন্য কিছু টেবিলে লেখা না থাকে তবে ...

  1. CREATE TABLEযা সিএসভির সাথে মেলে; কোন ইনডেক্স ছাড়া কি প্রয়োজন হয় JOINমধ্যে UPDATE। যদি অনন্য থাকে তবে এটি তৈরি করুন PRIMARY KEY
  2. LOAD DATA যে টেবিলের মধ্যে
  3. কপি real_tableকরার জন্য new_table( CREATE ... SELECT)
  4. UPDATE new_table JOIN csv_table ON ... SET ..., ..., ...;
  5. RENAME TABLE real_table TO old, new_table TO real_table;
  6. DROP TABLE csv_table, old;

আপডেটের চেয়ে তৃতীয় ধাপ দ্রুততর হয়, বিশেষত যদি অপ্রয়োজনীয় সূচকগুলি ছেড়ে দেওয়া হয়।
৫ ম পদক্ষেপটি "তাত্ক্ষণিক"।


সেকেন্ডে উদাহরণস্বরূপ বলতে পারি, তৃতীয় পদক্ষেপের পরে, আমরা পদক্ষেপ 4 করছি, তারপরে নতুন ডেটাটি রিয়েল_ট্যাবেলে getsোকানো হবে তাই আমরা সেই ডেটাটি নতুন_ টেবিলটিতে মিস করব? এটার জন্য কী কাজ? ধন্যবাদ
এএমবি

কি দেখুন pt-online-schema-digest; এটি এ এর ​​মাধ্যমে এই জাতীয় সমস্যাগুলির যত্ন নেয় TRIGGER
রিক জেমস

আপনি সম্ভবত না থেকে টেবিলের উপর কোনো ইনডেক্স প্রয়োজন LOAD DATA। অপ্রয়োজনীয় সূচকগুলি যুক্ত করা ব্যয়বহুল (সময় মতো)।
রিক জেমস

সর্বশেষ তথ্যের উপর ভিত্তি করে, আমি সিএসভি ফাইলটির দিকে ঝুঁকির সাথে মাইআইএসএএম টেবিলটিতে কেবল একটি দিয়ে লোড করা হচ্ছে AUTO_INCREMENT, তারপরে পিকে ভিত্তিতে একসময় 1K সারি ছিন্ন করে। তবে বিশদটি বানানের চেষ্টা করার আগে আমার সমস্ত প্রয়োজনীয়তা এবং টেবিল স্কিমাটি দেখতে হবে
রিক জেমস

আমি হ্যাশটি সেট করে PRIMARY indexরেখেছি, তবে অর্ডার ক্যোয়ারী ব্যবহার করে 50 কে চ্যান করার সময় আরও বেশি সময় লাগে, এবং সেট হিসাবে PRIMARY index?
এএমবি

3

আপনি বলেছেন:

  • আপডেটগুলি আপনার টেবিলের 6-25% প্রভাবিত করে
  • আপনি যত তাড়াতাড়ি এটি করতে চান (<১ ঘন্টা)
  • লক ছাড়া
  • এটি একটি একক লেনদেন হতে হবে না
  • তবুও (রিক জেমস উত্তরের মন্তব্যে), আপনি বর্ণের পরিস্থিতি সম্পর্কে উদ্বেগ প্রকাশ করেছেন

এই বিবৃতি অনেকগুলি বিরোধী হতে পারে। উদাহরণস্বরূপ, বড় আপডেটগুলি ডাব্লু / টেবিলটি লক করে। বা এক বিশালাকার লেনদেন ব্যবহার করে জাতি শর্ত ডাব্লু / ও এড়ানো।

এছাড়াও, যেহেতু আপনার টেবিলটি ভারীভাবে সূচকযুক্ত, তাই সন্নিবেশ এবং আপডেট উভয়ই ধীর হতে পারে।


জাতি শর্ত এড়ানো

আপনি যদি আপনার টেবিলটিতে একটি আপডেট হওয়া টাইম স্ট্যাম্প যুক্ত করতে সক্ষম হন তবে আপনি একক লেনদেনে অর্ধ-মিলিয়ন আপডেট লগ করা থেকে বিরত থাকার পরেও রেসের অবস্থার জন্য সমাধান করতে পারেন।

এটি আপনাকে লাইন বাই লাইন আপডেট করতে (যেমন আপনি বর্তমানে করছেন) মুক্ত করে, তবে স্বতঃসংশোধন বা আরও যুক্তিসঙ্গত লেনদেন ব্যাচ সহ।

আপনি পরবর্তী অবস্থার ইতিমধ্যে ঘটেছে না এমন একটি পরীক্ষা করে (রেখার বাই লাইন আপডেট করার সময়) রেস শর্তগুলি এড়িয়ে যান ( UPDATE ... WHERE pk = [pk] AND updated < [batchfile date])

এবং, গুরুত্বপূর্ণ, এটি আপনাকে সমান্তরাল আপডেটগুলি চালাতে দেয় ।


যত দ্রুত সম্ভব চালানো Run সমান্তরালীকরণ

এই সময়ের সাথে এখন স্ট্যাম্পে চেক করুন:

  1. আপনার ব্যাচের ফাইলটি কিছু যুক্তিসঙ্গত আকারের অংশগুলিতে বিভক্ত করুন (বলুন 50,000 সারি / ফাইল)
  2. সমান্তরালভাবে, প্রতিটি ফাইলে একটি স্ক্রিপ্ট পড়ুন এবং 50,000 আপডেটের বিবৃতি সহ একটি ফাইল আউটপুট করুন।
  3. সমান্তরালভাবে, একবার (2) শেষ হলে, mysqlপ্রতিটি স্ক্যুয়াল ফাইল চালান।

(উদাহরণস্বরূপ, কমান্ডকে সহজেই বহন করার জন্য সমান্তরালভাবে bashদেখুন splitএবং xargs -Pউপায়গুলি দেখুন । সমান্তরালতার ডিগ্রি আপনি কতগুলি থ্রেড আপডেটের জন্য উত্সর্গ করতে ইচ্ছুক তার উপর নির্ভর করে )


মনে রাখবেন যে "লাইন বাই লাইন" কমপক্ষে 100 ব্যাচের কাজগুলিতে 10x ধীর হতে পারে
রিক জেমস

নিশ্চিত হওয়ার জন্য আপনাকে এই ক্ষেত্রে এটি বেঞ্চমার্ক করতে হবে। একটি টেবিলের 6-25% আপডেট করা (আপডেট হওয়া কলামগুলির সাথে 8 টি সূচক যুক্ত), আমি সূচি বজায় রাখার সম্ভাবনাটি উপভোগ করব।
পিটার ডিকসন-মূসা

আমার অর্থ, কিছু ক্ষেত্রে সূচকগুলি ছেড়ে দেওয়া, বাল্ক আপডেট করা এবং পরে পুনরায় তৈরি করা আরও দ্রুত হতে পারে ... তবে ওপি ডাউনটাইম চায় না।
পিটার ডিকসন-মূসা

1

বড় আপডেটগুলি I / O সীমাবদ্ধ। স হ্র হ:

  1. একটি স্বতন্ত্র সারণী তৈরি করুন যা আপনার 3 টি প্রায়শই আপডেট হওয়া ক্ষেত্রগুলিকে সঞ্চয় করবে। আসুন আপনি একটি টেবিলের সম্পদ_ স্ট্যাটিককে কল করুন যেখানে আপনি রাখেন , ভাল, স্থিতিশীল ডেটা এবং অন্যান্য সম্পদ_ডায়ামিক যা আপলোডার, ডাউনলোডার এবং যাচাই করে রাখবে।
  2. যদি আপনি পারেন তবে সম্পদ_ডিনামিক সারণির জন্য মেমোরি ইঞ্জিনটি ব্যবহার করুন । (প্রতিটি আপডেটের পরে ডিস্কে ব্যাকআপ নিন)।
  3. আপনার হালনাগাদ এবং নিম্পল সম্পদ_ডিমনিককে আপনার আপডেট 4 হিসাবে আপডেট করুন (যেমন লড ইনফিল ... ইন টেম্পোর; আপডেট করুন সম্পদ_ডিনামিক একটি জো টেম্প বি a.id = বি.আইডি SET এ [কী আপডেট করতে হবে] এটি এক এর চেয়ে কম সময় নেয় মিনিট। (আমাদের সিস্টেমে, সম্পদ_দৈনিকতে 95৫ এম এর সারি এবং আপডেটগুলি প্রভাব ফেলবে 40 6 এম সারি, 40 এরও বেশি কিছুটা বেশি in)
  4. আপনি যখন স্ফিংক্সের সূচক চালাবেন, JOIN সম্পত্তির_স্ট্যাটিক এবং সম্পদ_ডিনামিক (ধরে নিবেন যে আপনি এই ক্ষেত্রগুলির কোনওটি একটি গুণ হিসাবে ব্যবহার করতে চান)।

0

UPDATEদ্রুত চালানোর জন্য , আপনার প্রয়োজন

INDEX(uploaders, downloaders, verified)

এটি উভয় টেবিলে থাকতে পারে। তিনটি ক্ষেত্র যে কোনও ক্রম হতে পারে।

UPDATEএটি দুটি টেবিলের মধ্যে সারিগুলি দ্রুত মেলাতে সক্ষম হওয়াটিকে সহায়তা করবে ।

এবং দুটি টেবিল (উভয় INT SIGNEDবা উভয় INT UNSIGNED) তে ডেটাটাইপগুলি একই করুন ।


এটি আসলে আপডেটটি ধীর করে দিয়েছে।
এএমবি

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