InnerCodeDBA 发表于 2022-12-6 11:38:56

请教一下 为什么DELETE语句执行时要去维护唯一索引?

在 MySQL 数据库中,执行 DELETE 语句其实并没有直接删除记录,而是在记录上打上一个删除标记,然后通过后台的一个叫做purge 的线程来清理。从这一点来看,DELETE和 UPDATE 确实是非常相像。事实上,DELETE 和 UPDATE 的加锁也几乎是一样的。这样说一般是有PURGE线程去维护唯一索!还是由DELETE语句去维护唯一索引呢?

CREATE TABLE `lts_wjq_paylabs_biztask_tracker` (
`id` bigint(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID,与业务无关的',
`job_id` varchar(32) DEFAULT NULL COMMENT '作业ID,程序生成的',
`job_type` varchar(32) DEFAULT NULL COMMENT '任务类型',
`priority` int(11) DEFAULT NULL COMMENT '优先级,(数值越大,优先级越低)',
`retry_times` int(11) DEFAULT '0' COMMENT '重试次数',
`max_retry_times` int(11) DEFAULT '0' COMMENT '最大重试次数',
`rely_on_prev_cycle` tinyint(4) DEFAULT NULL COMMENT '是否依赖上一个执行周期',
`task_id` varchar(64) DEFAULT NULL COMMENT '任务ID,客户端传过来的任务ID',
`real_task_id` varchar(64) DEFAULT NULL COMMENT '任务ID,客户端传过来的任务ID',
`gmt_created` bigint(20) DEFAULT NULL COMMENT '创建时间',
`gmt_modified` bigint(11) DEFAULT NULL COMMENT '修改时间',
`submit_node_group` varchar(64) DEFAULT NULL COMMENT '提交节点组,提交客户端的节点组',
`task_tracker_node_group` varchar(64) DEFAULT NULL COMMENT '执行节点组,执行job的任务节点',
`ext_params` text COMMENT '用户参数 JSON',
`internal_ext_params` text COMMENT '内部扩展参数 JSON',
`is_running` tinyint(1) DEFAULT NULL COMMENT '是否正在执行',
`task_tracker_identity` varchar(64) DEFAULT NULL COMMENT 'taskTrackerId,执行的taskTracker的唯一标识',
`need_feedback` tinyint(4) DEFAULT NULL COMMENT '反馈客户端,是否需要反馈给客户端',
`cron_expression` varchar(128) DEFAULT NULL COMMENT 'Cron表达式,执行时间表达式 (和 quartz 表达式一样)',
`trigger_time` bigint(20) DEFAULT NULL COMMENT '下一次执行时间',
`repeat_count` int(11) DEFAULT '0' COMMENT '重复一次',
`repeated_count` int(11) DEFAULT '0' COMMENT '已经重复的次数',
`repeat_interval` bigint(20) DEFAULT '0' COMMENT '重复间隔',
`last_generate_trigger_time` bigint(20) DEFAULT '0' COMMENT '最后生成的triggerTime时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_job_id` (`job_id`),
UNIQUE KEY `idx_taskId_taskTrackerNodeGroup` (`task_id`,`task_tracker_node_group`),
KEY `idx_taskTrackerIdentity` (`task_tracker_identity`),
KEY `idx_job_type` (`job_type`),
KEY `idx_realTaskId_taskTrackerNodeGroup` (`real_task_id`,`task_tracker_node_group`),
KEY `idx_priority_triggerTime_gmtCreated` (`priority`,`trigger_time`,`gmt_created`),
KEY `idx_isRunning` (`is_running`)

) ENGINE=InnoDB AUTO_INCREMENT=469088 DEFAULT CHARSET=utf8 COMMENT='等待执行任务'

yejr 发表于 2022-12-6 14:51:04

DML时,如果涉及到唯一索引约束,是要做立刻检查的,才能保证符合逻辑上唯一性

InnerCodeDBA 发表于 2022-12-6 15:48:57

yejr 发表于 2022-12-6 14:51
DML时,如果涉及到唯一索引约束,是要做立刻检查的,才能保证符合逻辑上唯一性 ...

你的意思是说 DELETE 语句 打完标记后,就要求维护所有的索引! 维护索引的工作不是由PURGE线程.

yejr 发表于 2022-12-7 09:00:13

InnerCodeDBA 发表于 2022-12-6 15:48
你的意思是说 DELETE 语句 打完标记后,就要求维护所有的索引! 维护索引的工作不是由PURGE线程. ...

purge线程主要负责这几个事:
1、删除辅助索引中不存在的记录
2、删除已被打了delete-marked标记的记录
3、删除不再需要的undo log
页: [1]
查看完整版本: 请教一下 为什么DELETE语句执行时要去维护唯一索引?