GreatSQL社区

搜索

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

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

下载.png

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

  34. ) ENGINE=InnoDB AUTO_INCREMENT=469088 DEFAULT CHARSET=utf8 COMMENT='等待执行任务'
复制代码


全部回复(3)
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
InnerCodeDBA

7

主题

0

博客

36

贡献

新手上路

Rank: 1

积分
47

2022年度求知人物2022年度活跃用户

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-11-23 18:49 , Processed in 0.019000 second(s), 14 queries , Redis On.
快速回复 返回顶部 返回列表