সর্বাধিক সারণীর জন্য InnoDB স্টোরেজ ইঞ্জিন সহ মাইএসকিউএল 5.6 ব্যবহার করা। ইনোডিবি বাফার পুলের আকার 15 গিগাবাইট এবং ইনোডবি ডিবি + সূচকগুলি প্রায় 10 জিবি। সার্ভারে 32 গিগাবাইট র্যাম রয়েছে এবং এটি সেন্ট ওএস 7 x64 চলছে।
আমার কাছে একটি বড় টেবিল রয়েছে যার মধ্যে প্রায় 10 মিলিয়ন + রেকর্ড রয়েছে।
আমি প্রতি 24 ঘন্টা একটি রিমোট সার্ভার থেকে একটি আপডেট ডাম্প ফাইল পাই। ফাইলটি সিএসভি ফর্ম্যাটে রয়েছে। এই ফর্ম্যাটটিতে আমার নিয়ন্ত্রণ নেই। ফাইলটি 750 এমবি। আমি মাইআইএসএএম টেবিল সারিতে সারি সারি ডেটা triedোকানোর চেষ্টা করেছি এবং এটিতে 35 মিনিট সময় লেগেছে।
ফাইল থেকে 10-12 এর মধ্যে আমার প্রতি লাইনে কেবল 3 টি মান নেওয়া এবং এটি ডাটাবেসে আপডেট করা দরকার।
এরকম কিছু অর্জনের সর্বোত্তম উপায় কী?
আমাকে প্রতিদিন এটি করা দরকার।
বর্তমানে প্রবাহ এরকম:
- mysqli_begin_transaction
- লাইন ডাম্প ফাইল লাইন পড়ুন
- লাইন দ্বারা প্রতিটি রেকর্ড লাইন আপডেট করুন।
- mysqli_commit
উপরের অপারেশনগুলি প্রায় 30-40 মিনিট সময় নেয় এবং এটি করার সময়, অন্যান্য আপডেটগুলি চলছে যা আমাকে দেয়
লকের অপেক্ষার সময়সীমা অতিক্রম করে; লেনদেন পুনরায় চালু করার চেষ্টা করুন
আপডেট 1
নতুন টেবিল ব্যবহার করে ডেটা লোড হচ্ছে LOAD DATA LOCAL INFILE
। মাইআইএসএএম-তে এটি ইনোইডিবিতে 38.93 sec
7 মিনিট ৫.২১ সেকেন্ড সময় নিয়েছে। তারপরে আমি করলাম:
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
আমি আমার ভুলের জন্য ক্ষমা চাই প্রতিটি রেকর্ড আপডেটের পরিবর্তে জয়েন ব্যবহার করা আরও ভাল। এখন আমি রিক_জেমস দ্বারা প্রস্তাবিত সূচকটি ব্যবহার করে এমপ্রে উন্নত করার চেষ্টা করছি, বেঞ্চ-মার্কিং হয়ে গেলে আপডেট হবে।
UPDATEs
। সিএসভি ডেটা থেকে টেবিল আপডেট করার জন্য সোজাসুজি বিবৃতি ঠিক কেমন দেখাচ্ছে তা আমাদের জানান । তারপরে আমরা আপনাকে এমন একটি কৌশল তৈরি করতে সহায়তা করতে পারি যা আপনার প্রয়োজনীয়তাগুলি পূরণ করে।
update
এবং দয়া করে আপডেট হওয়া প্রশ্নটি পরীক্ষা করুন। ধন্যবাদ
INDEX(field2, field3, field4)
(কোনও ক্রমে)? দয়া করে আমাদের দেনSHOW CREATE TABLE
।