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