加快UPDATE查询速度(一张表带索引)

问题描述 投票:0回答:1

那里。是否可以加快我的 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';

更新时长约5秒

如果从 work_to_dt 列中删除索引,我的查询持续时间大约为 5 秒

为什么会发生这种情况?我认为列索引必须加速我的更新查询,我错了吗?

sql mysql mariadb query-optimization
1个回答
0
投票

subscription.work_to_dt IS NOT NULL
不是必需的,因为 NULL 不是
<=
任何东西。

最适合您情况的索引将是

(status, work_to_date)
作为单个复合索引(而不是两个单独的索引)。这将找到更新最快的行。

只有

(work_to_date)
将意味着所有带有
status = 1
的行也将与所有其他状态值混合在一起。仍然需要扫描其他行,然后主动忽略。

© www.soinside.com 2019 - 2024. All rights reserved.