我有一个问题,我不知道如何为它做解释计划.所以我所拥有的是临时表创建查询和表 struct .

create temporary table if not exists tmp_staging_task_ids as
         select distinct s.usr_task_id
           from ue_events_staging s
          where s.queue_id is null
          limit 6500;

以上 Select 查询解释计划;

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: s
   partitions: NULL
         type: ref
possible_keys: ue_events_staging_queue_id,usr_task_id,queue_id_usr_task_id,queue_id_app_id
          key: queue_id_usr_task_id
      key_len: 303
          ref: const
         rows: 17774428
     filtered: 100.00
        Extra: Using where; Using index; Using temporary

-oh my 天.

update ue_events_staging s
         join tmp_staging_task_ids t on t.usr_task_id = s.usr_task_id
          set s.queue_id = 'queue_id';

表 struct ;

Create Table: CREATE TABLE `ue_events_staging` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `queue_id` varchar(100) DEFAULT NULL,
  `usr_task_id` bigint NOT NULL,
  `app_id` bigint NOT NULL,
  `platform` tinyint NOT NULL,
  `capture_time` bigint NOT NULL,
  `input_type` varchar(50) NOT NULL,
  `type` varchar(100) NOT NULL,
  `event_type` varchar(10) NOT NULL,
  `screen` varchar(100) NOT NULL,
  `object_name` varchar(255) DEFAULT NULL,
  `app_custom_tag` varchar(255) DEFAULT NULL,
  `exception_class_name` varchar(250) DEFAULT NULL,
  `exception_tag` varchar(250) DEFAULT NULL,
  `non_responsive` tinyint(1) DEFAULT '0',
  `is_first` tinyint(1) DEFAULT '0',
  `is_second` tinyint(1) DEFAULT '0',
  `is_last` tinyint(1) DEFAULT '0',
  `is_quit` tinyint(1) DEFAULT '0',
  `x_coordinate` double DEFAULT NULL,
  `y_coordinate` double DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ue_events_staging_queue_id` (`queue_id`),
  KEY `usr_task_id` (`usr_task_id`),
  KEY `screen` (`app_id`,`platform`,`screen`),
  KEY `app_id_queue_id` (`app_id`,`queue_id`),
  KEY `queue_id_usr_task_id` (`queue_id`,`usr_task_id`),
  KEY `queue_id_app_id` (`queue_id`,`app_id`)

请判断大约需要3.5k秒并导致加载的可能性.

推荐答案

这看起来像是您正在以6500行为一批进行更新.

如果不需要该临时表,可以重构更新查询以使其独立.您不需要临时表,因为您可以将其WHERE queue_id IS NULL直接放入UPDATE的WHERE中.

UPDATE ue_events_staging
   SET queue_id = 'queue_id'
 WHERE queue_id IS NULL
 LIMIT 6500;

临时表创建步骤从表中提取6500个不同的(任意 Select )usr_task_id个值.其中一些值可能与表中的多行相关,因此UPDATE语句可能会更新表中的6500多行.

我建议的重构将更新表中任意 Select 的6500行.在语句的末尾,可能会更新某些值为usr_task_id的行,而不会更新其他行.如果这对您的业务规则来说是可以接受的,那么它会更快.

如果您的业务规则require中包含每个特定usr_task_id值的所有行都要一次更新,那么您可以try 这样做,以简化这两个语句.

create temporary table if not exists tmp_staging_task_ids as
         select s.usr_task_id
           from ue_events_staging s
          where s.queue_id is null
          limit 6500;

update ue_events_staging 
   set queue_id = 'queue_id'
 where usr_task_id IN 
        (select usr_task_id from tmp_staging_task_ids);

这消除了创建临时表时的DISTINCT操作符,可能会节省一些时间.IN子句隐含不同的值.

"随意 Select "?不带ORDER BY和WITH LIMIT子句的语句指示MySQL任意 Select 行.MySQL Select 检索速度最快的行(希望如此).

Mysql相关问答推荐

是否有一种方法可以在mysql中设置一列,使其自动成为该行的行号的值?

嵌套MySQL语句问题

MySQL:统计单词在单元格中出现的次数,并将数字放在bra中单词的旁边

如何将左联接的小计/总计行中的所有列作废

子查询是否可以按主查询中的列进行分组?

从表中 Select 具有不同顺序的列

时间戳上滚动窗口的 SQL 计数不同

如果其中一个表为空,则 mysql 中的查询会给出 0 个结果

使用 autocommit = 0 和 InnoDB 表的 LOCK TABLES 检测死锁

任何值的 SQL WHERE 子句?

如何在 MySQL 中查找重复值和更新值

获取 TEXT 类型行的百分比

如何让连续 3 周或以上的用户有订单?

Golang Gorm没有从关联表中检索数据

在 MySQL 的存储过程中调用存储过程

mysql 按日期 Select 总和组

用户 'User'@'%' 和 'User'@'localhost' 不一样吗?

Mysql中int(10)的最大大小是多少

mysql 数据类型仅存储月份和年份

MySQL合并两列并添加到一个新列中