优化删除查询

Optimize a delete query

我想知道是否有任何选项可以改进和优化我的查询。我正在为我们的员工导入计划数据,需要删除旧数据,当它存在于这个代理和日期时。原因是,代理人可能不会每天都存在(因为他们离开了公司),也可能是我们像以前一样上传更新的报告(最近的时间表更改)。

这就是我目前有此查询的原因:

DELETE FROM `agents` WHERE 
(`id` = 1 AND `date` => '01.01.2015 00:00:00' AND `date` <= '01.01.2015 23:59:59') OR 
(`id` = 2 AND `date` => '01.01.2015 00:00:00' AND `date` <= '01.01.2015 23:59:59') OR [...]

此组合适用于报告中的每个代理和报告中的每一天。我上传了一个创建了 5780 day/agent 种组合的组合。这个查询占用了我的(当前)小 table 大约 5 分钟的时间来执行。

我想知道是否有人知道我该如何改进这件事。

你想做的事情会比较困难。如所写,它可能需要完整的 table 扫描。

一种方法是在 agents(id, date) 上添加索引并单独进行删除:

DELETE FROM `agents`
    WHERE (`id` = 1 AND date >= '2015-01-01' AND `date` < '2015-01-02');

DELETE FROM `agents`
    WHERE (`id` = 2 AND date >= '2015-01-01' AND `date` < '2015-01-02')

假设日期都相同,你可以将 where 子句写成:

DELETE FROM `agents`
    WHERE `id` IN (1, 2, 3, . . . ) AND
           `date` >= '2015-01-01' AND `date` < '2015-01-02';

根据数据的分布(范围内每个 id 的日期数)权重,上述索引或 agents(date, id) 上的索引是最好的。

如果你有这样的table:

create table t123
(   id int not null,
    date datetime not null,
    myThing varchar(10) not null 
);

你后来添加了这样的索引:

ALTER TABLE t123 ADD INDEX (id,date);   -- add an index after the fact

然后像您这样在 table t123 上执行删除操作的速度将达到我想象的速度。 但是需要一直维护索引,这是一个包袱。

所有指数变化都需要仔细权衡。以降低访问速度为代价 inserts/updates/deletes.

Fast Engine Creation and Alter Table

的手册页