সুতরাং আমার এই অডিট টেবিলটি রয়েছে (আমার ডাটাবেসের কোনও টেবিলের ক্রিয়াকলাপগুলি ট্র্যাক করে):
CREATE TABLE `track_table` (
`id` int(16) unsigned NOT NULL,
`userID` smallint(16) unsigned NOT NULL,
`tableName` varchar(255) NOT NULL DEFAULT '',
`tupleID` int(16) unsigned NOT NULL,
`date_insert` datetime NOT NULL,
`action` char(12) NOT NULL DEFAULT '',
`className` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
KEY `userID` (`userID`),
KEY `tableID` (`tableName`,`tupleID`,`date_insert`),
KEY `actionDate` (`action`,`date_insert`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
এবং আমার পুরানো আইটেম সংরক্ষণাগার শুরু করা দরকার। টেবিলটি প্রায় 50 মিলিয়ন সারিতে বেড়েছে, তাই আমি সারিগুলি সরিয়ে ফেলতে দ্রুততম উপায়টি ছিল এটি একবারে একটি ছক মুছে ফেলা (উপর ভিত্তি করে tableName
)।
এটি বেশ ভাল কাজ করে তবে কয়েকটি টেবিলের উপর যেগুলি ভারী লেখা রয়েছে, এটি সম্পূর্ণ হবে না। আমার জিজ্ঞাসাটি এমন সমস্ত আইটেম মুছে ফেলে যার সাথে delete
টিপলআইডি / টেবিলনাম সংমিশ্রণের সাথে সম্পর্কিত ক্রিয়া রয়েছে:
DELETE FROM track_table WHERE tableName='someTable' AND tupleID IN (
SELECT DISTINCT tupleID FROM track_table
WHERE tableName='someTable' AND action='DELETE' AND date_insert < DATE_SUB(CURDATE(), INTERVAL 30 day)
)
আমি এটিকে আমার সার্ভারে 3 দিনের জন্য চালাতে দিয়েছি এবং এটি বৃহত্তম টেবিলে কখনও শেষ হয়নি। ব্যাখ্যা আউটপুট (যদি আমি নির্বাচন করতে মুছুন স্যুইচ করুন:
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 1 | PRIMARY | track_table | ref | tableID | tableID | 257 | const | 3941832 | Using where |
| 2 | DEPENDENT SUBQUERY | track_table | ref | tableID,actionDate | tableID | 261 | const,func | 1 | Using where; Using temporary |
সুতরাং 4 মিলিয়ন সারিগুলি মুছতে 3 দিন লাগবে না, আমি ভাবব। আমার আমার ইনডোডবি_বাফলার_পুল_সাইজটি 3 জি-তে সেট করা আছে এবং সার্ভারটি ওয়ান_ফাই_পার_সামগ্রী ব্যবহারের জন্য সেট করা নেই। InnoDB মুছে ফেলতে পারফরম্যান্সের আরও কী কী উপায়ে উন্নতি করতে পারি? (ম্যাক ওএসএক্সে মাইএসকিউএল 5.1.43 চলছে)