那里。是否可以加快我的 UPDATE 查询速度?
数据库玛丽亚数据库:10.3
-- dev_db_5843.subscription
CREATE TABLE `subscription`
(
`id` int(11) NOT NULL AUTO_INCREMENT,
`work_to_dt` datetime DEFAULT NULL,
`status` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `ix_subscription_work_to_dt` (`work_to_dt`) USING BTREE,
)
ENGINE=InnoDB AUTO_INCREMENT=4187656 DEFAULT CHARSET=utf8;
我有sql查询
UPDATE subscription
SET `status`= 2
WHERE
subscription.`status` = 1 AND
subscription.work_to_dt IS NOT NULL AND
subscription.work_to_dt < '2024-04-01 14:30:31';
表订阅有 3 629 036 行。 UPDATE 查询的行数为 958。
EXPLAIN
UPDATE subscription
SET `status`= 2
WHERE
subscription.`status` = 1 AND
subscription.work_to_dt IS NOT NULL AND
subscription.work_to_dt < '2024-04-01 14:30:31';
如果从 work_to_dt 列中删除索引,我的查询持续时间大约为 5 秒
为什么会发生这种情况?我认为列索引必须加速我的更新查询,我错了吗?
subscription.work_to_dt IS NOT NULL
不是必需的,因为 NULL 不是 <=
任何东西。
最适合您情况的索引将是
(status, work_to_date)
作为单个复合索引(而不是两个单独的索引)。这将找到更新最快的行。
只有
(work_to_date)
将意味着所有带有 status = 1
的行也将与所有其他状态值混合在一起。仍然需要扫描其他行,然后主动忽略。