इसलिए मेरे पास यह ऑडिट टेबल है (मेरे डेटाबेस में किसी भी टेबल पर कार्रवाई को ट्रैक करता है):
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
पर एक tupleID / tableName संयोजन पर संबंधित कार्रवाई होती है:
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 दिन नहीं चाहिए, मुझे लगता है। मेरे पास 3GB में मेरा innodb_buffer_pool_size सेट है, और सर्वर one_file_per_table का उपयोग करने के लिए सेट नहीं है। मैं InnoDB प्रदर्शन को हटाने के लिए किन अन्य तरीकों से सुधार कर सकता हूं? (मैक ओएसएक्स पर MySQL 5.1.43 रनिंग)