Ans*_*was 5 mysql performance replication
我有一个MYSQL表,只需要在今天日期之前30天内获得数据.它的数据可能在今天之后的几年内.为了更快地查询,我通常会删除旧记录,因为我认为没有必要搜索旧记录.但是,如果我们需要它来进行分析,我仍会保留记录的备份副本.原始表是这样的:
CREATE TABLE featured_deal (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
fsa VARCHAR(10),
poster_id int(11),
dealid bigint(20),
bookedDate date,
createDate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY `featured_unique`(fsa, bookedDate)
)
Run Code Online (Sandbox Code Playgroud)
我创建了一个表,这是该表的副本,称为历史:
CREATE TABLE featured_deal_history (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
fsa VARCHAR(10),
poster_id int(11),
dealid bigint(20),
bookedDate date,
createDate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY `featured_unique`(fsa, bookedDate)
)
Run Code Online (Sandbox Code Playgroud)
每当原始表上发生插入时,我都会触发填充历史表:
CREATE TRIGGER `featured_to_history`
AFTER INSERT ON lst_enmasse_featured_deal
FOR EACH ROW
INSERT INTO lst_enmasse_featured_deal_history (fsa,poster_id,dealid,bookedDate,createDate)
VALUES (NEW.fsa,NEW.poster_id,NEW.dealid,NEW.bookedDate,NEW.createDate)
Run Code Online (Sandbox Code Playgroud)
最后,我使用cron作业和命令清理表:
DELETE * FROM featured_deal WHERE bookedDate < DATE_SUB(CURDATE(), INTERVAL 30 DAY)
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来执行上述任务?我想到了MYSQL分区.但是,我没有固定的分区.日期改变,因此我每天需要两个新的分区.
原则上,您的方法是可以的,但是这个概念是基于较小的表性能更高的想法。这意味着您的查询正在对数据运行全表扫描 - 即您没有正确配置索引。
我建议您首先解决的是查询的性能。
如果您仍然需要将内容保留在热数据表之外,那么您应该寻求将任何插入历史记录表作为批量操作而不是一次一行 - 这将使表和索引保持健康状态。这可以按照 Cristian 建议的批处理操作来完成,或者您可以使用随机方法(在源表中使用状态变量)。例如像...
AFTER INSERT ON mytable
IF (0.95<RAND()) THEN
UPDATE mytable SET control=CONNECTION_ID()
WHERE control IS NULL;
INSERT INTO backuptable (...)
SELECT .... FROM mytable
WHERE control=CONNECTION_ID();
UPDATE mytable SET control=-1
WHERE control=CONNECTION_ID();
END IF;
Run Code Online (Sandbox Code Playgroud)
另一个考虑因素是,当您写入历史表时,会生成一个新的 id:为什么?
| 归档时间: |
|
| 查看次数: |
1733 次 |
| 最近记录: |