Linux 性能採集項目中,發現入庫極慢。經定位,同一設備(conf_id)同一時間點(insert_time)存在大量重複行,導致表膨脹 10 倍(427,366 行 vs 去重後 42,387 行)。
CREATE TABLE perf_linux ( id VARCHAR(255) PRIMARY KEY, conf_id VARCHAR(255) NOT NULL, insert_time DATETIME, cpu_usage FLOAT(11,2), memory_usage FLOAT(11,2), io_usage_write FLOAT(11,2), io_usage_read FLOAT(11,2) );
CREATE TABLE perf_linux_t LIKE perf_linux; INSERT INTO perf_linux_t SELECT * FROM perf_linux;
ALTER TABLE perf_linux_t
ADD COLUMN auto_id INT NOT NULL AUTO_INCREMENT,
DROP PRIMARY KEY,
ADD PRIMARY KEY (auto_id);
SELECT MIN(auto_id) FROM perf_linux_t GROUP BY insert_time, conf_id;
tmp 存放保留行。CREATE TABLE tmp LIKE perf_linux_t; INSERT INTO tmp SELECT * FROM perf_linux_t WHERE auto_id IN (SELECT MIN(auto_id) FROM perf_linux_t GROUP BY insert_time, conf_id);
ALTER TABLE tmp DROP COLUMN auto_id, DROP PRIMARY KEY; TRUNCATE TABLE perf_linux; INSERT INTO perf_linux SELECT * FROM tmp; DROP TABLE tmp; DROP TABLE perf_linux_t;
數據量從 427,366 降至 42,387,冗余消除 90%,入庫速度顯著提升。但根因(採集端重複發送)仍需進一步排查。
支援 ROW_NUMBER() 窗口函數,單條 SQL 完成:
WITH ranked AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY conf_id, insert_time ORDER BY id) AS rn FROM perf_linux ) DELETE FROM perf_linux WHERE id IN (SELECT id FROM ranked WHERE rn > 1);
UNIQUE KEY uk_conf_time (conf_id, insert_time) 防重複寫入(需處理衝突邏輯)。DELETE ... LIMIT 10000 避免長事務鎖表。