ดังนั้นฉันมีตารางการตรวจสอบนี้ (ติดตามการดำเนินการในตารางใด ๆ ในฐานข้อมูลของฉัน):
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 วันในการลบฉันคิดว่า ฉันมี innodb_buffer_pool_size ตั้งไว้ที่ 3GB และเซิร์ฟเวอร์ไม่ได้ถูกตั้งค่าให้ใช้ one_file_per_table ฉันสามารถปรับปรุงประสิทธิภาพการลบ InnoDB ได้ด้วยวิธีใดอีกบ้าง (ใช้ MySQL 5.1.43 บน Mac OSX)