`
jimmy9495
  • 浏览: 300079 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

mysql做update时有in关联子查询条件时效率奇慢分析

阅读更多
# Query_time: 4.568689  Lock_time: 0.000068 Rows_sent: 0  Rows_examined: 6157476
SET timestamp=1414501476;

UPDATE push_group_task SET arrive_num = arrive_num+1,update_time = NOW()  WHERE id IN (SELECT p.group_task_id FROM push_task p WHERE p.state = 0 AND p.cust_id='166518' AND p.push_begin_time <= NOW() AND NOW() < p.push_end_time AND p.time_bucket_begin <= FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()), '%H') AND FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()), '%H') < p.time_bucket_end);

表push_group_task一共只有1137条记录
而表push_task一共只有6094条记录
但是在只涉及这两个表的这个sql做更新的时候,却查询了6928878条记录
导致并发执行时候暴露出来这条SQL的速度奇慢。
1137*6094=6928878

分析是mysql没有先执行in里面的子查询,如果是把子查询查出之后,只需要update几条数据;
这样看起来mysq是逐行遍历push_group_task表,把每条记录都去做一次in子查询。


目前把这条sql拆成两条,先把in里面的select值全查出来,再把结果放到update里面;

/** 查出结果以逗号分割*/
SELECT GROUP_CONCAT(p.group_task_id SEPARATOR ',') FROM push_task p WHERE p.state = 0 AND p.cust_id='100541' AND p.push_begin_time <= NOW() AND NOW() < p.push_end_time AND p.time_bucket_begin <= FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()), '%H') AND FROM_UNIXTIME(UNIX_TIMESTAMP(NOW()), '%H') < p.time_bucket_end

/** 把查出的结果放到in里面*/
UPDATE push_group_task SET arrive_num = arrive_num+1,update_time = NOW()  WHERE id IN (1,2)





0
1
分享到:
评论

相关推荐

    MySQL数据库update更新子查询

    在处理涉及子查询的更新操作时,有一些特定的规则和限制需要注意。本篇将深入探讨如何在`UPDATE`语句中正确使用子查询,并提供相关的解决方案。 首先,我们要明白在`UPDATE`语句中直接使用子查询可能引发的问题。...

    MySQL海量数据查询优化策略.

    10. 使用EXISTS代替IN:在子查询中使用EXISTS通常比使用IN执行更快,尤其是在大表和小表的关联查询中,因为EXISTS在找到第一个匹配项后即停止搜索。 11. 使用表的别名:在复杂查询中使用表的别名可以提高代码的...

    MySQL 多表关联一对多查询实现取最新一条数据的方法示例

    总之,MySQL多表关联查询实现取最新一条数据的关键在于正确地使用子查询和聚合函数,以及理解如何根据业务需求进行适当的关联和过滤。通过合理的设计和优化,我们可以有效地处理一对多关系中的数据获取问题,提高...

    mysql第五章.pdf

    5. 子查询:子查询是嵌套在SELECT、INSERT、UPDATE或DELETE语句中的查询。子查询通常用在WHERE子句中,作为查询条件。它们从内层向外层逐层处理,处理完最内层的子查询后,将结果用于外层查询的条件中。 6. 排序与...

    mysql基础操作及案例分析

    ### MySQL基础操作及案例分析 #### 一、DML操作(数据定义语言) **1. 数据插入** 在MySQL中,可以使用`INSERT`语句来向表中插入数据。有两种基本格式: - **指定列名**:适用于部分或全部列需要插入数据的情况...

    mysql各种语句多表查询+ mysql视图 mysql数据库管理+ select语句+ 创建

    外连接允许你在结果集中包含不匹配的记录,而子查询是在一个查询中嵌套另一个查询,用于获取满足特定条件的数据。例如,你可以使用子查询来找出某个部门薪水最高的员工,然后再用这个结果去与其他部门的员工比较。 ...

    mysql语句集合包括模糊查询索引函数

    1. **数据查询.sql**:可能包含各种查询示例,如JOIN操作、子查询、聚合函数的使用等。 2. **mysql.sql**:可能是一个包含常见MySQL语句的脚本文件,可以学习和参考。 3. **主外键约束.txt**:这是数据库关系模型的...

    sql查询分析器sql查询分析器

    - 优化JOIN操作,减少不必要的笛卡尔积和子查询,提高JOIN效率。 4. SQL查询分析器在实际工作中的应用: - 数据报表生成:通过编写复杂的SQL查询,快速生成各类数据报表。 - 数据挖掘:利用分析器进行大数据探索...

    mysql练习题

    8. 子查询:mysql中可以使用子查询来实现复杂的查询操作,例如查询某个表中的所有记录,然后再从中查询满足某个条件的记录。 9. 索引:mysql中可以使用索引来提高查询效率,索引可以是某个字段或多个字段的组合。 ...

    MYSQL读书笔记整理

    - **子查询优化**:使用EXISTS替代IN,因为 EXISTS 在大多数情况下更快,尤其是在子查询结果集大的时候。 - **避免SELECT ***:只选择需要的列,可以减少数据传输量,提高查询速度。 - **使用LIMIT优化分页查询**...

    里面包含mysql的整个数据库的学习资料,包含建表,外键,模糊查询,子查询,内连接等

    - 子查询是嵌套在其他SQL语句中的查询,通常用于SELECT、INSERT、UPDATE、DELETE语句中。 - 模糊查询使用LIKE关键字配合通配符(%表示任意字符出现任意次数,_表示任意单个字符)进行不精确匹配。 9. MySQL的配置...

    Mysql联表update数据的示例详解

    MySQL中的联表更新操作是一种高效的数据管理技巧,它允许你在单个UPDATE语句中同时更新两个或更多相关联的表。这种技术特别适用于那些需要基于其他表中的信息来修改数据的情况。本文将深入探讨MySQL UPDATE JOIN语法...

    解析mysql与Oracle update的区别

    如果需要更新两个关联的表,开发者通常需要使用子查询或者游标(如示例代码所示)。在给出的示例中,Oracle 使用了一个嵌套的 `SELECT` 查询,创建了一个可更新的结果集,然后通过 `SET` 子句来更新目标字段。这种...

    MySQL数据库课堂笔记 + MySQL-DEMO

    5. **更新与删除**:展示如何更新数据和删除记录,以及在有多个关联表时如何考虑影响。 6. **索引实践**:通过创建索引并对比查询速度,理解索引的重要性。 7. **存储过程与函数的应用**:编写并执行存储过程和函数...

    MySQL数据库教程-源程序文件

    例如,你可以使用SELECT语句进行复杂的数据检索,包括联合查询、子查询、分组和排序等;UPDATE语句则用于修改已存在的数据;INSERT语句用于向表中添加新的记录;而DELETE语句用于移除不再需要的记录。 SQL(结构化...

    MySQL报错1093 – You can’t specify target table ‘t’ for update in FROM clause, Time: 0

    在MySQL数据库中,错误代码1093 - "You can’t specify target table ‘t’ for update in FROM clause" 是一个常见的错误,它通常发生在尝试在一个`UPDATE`语句的`FROM`子句中直接引用要更新的目标表时。...

    MySQL查询语句汇总与使用指南.docx

    - **使用子查询**:`SELECT * FROM orders WHERE customer_id IN (SELECT id FROM customers WHERE name = 'John Doe');` ##### 3.4 事务处理 事务处理确保了一组操作要么全部成功执行,要么都不执行,以此来保证...

    mysql update语句的用法详解

    同时,`ON UPDATE`功能允许InnoDB表与其他表同步更新,但目前不支持在子查询中更新同一表。 最后,一个简单的`UPDATE`示例: ```sql UPDATE publishers SET city = 'Atlanta', state = 'GA' WHERE state = 'NY'; `...

    MYSQL笔记.zip

    练习通常会涵盖选择(SELECT)、插入(INSERT)、更新(UPDATE)、删除(DELETE)语句,以及更复杂的联接(JOIN)、子查询和聚合函数(如COUNT、SUM、AVG)。理解这些基本操作是掌握MySQL的基础。 "使用终端操作...

    mysql查询语句汇总.rar

    - **关联子查询**:将子查询与外部查询关联,如`SELECT * FROM table1 WHERE column1 = (SELECT column2 FROM table2 WHERE condition);` 5. **分组和聚合** - **GROUP BY**:按指定列进行分组,`SELECT column1,...

Global site tag (gtag.js) - Google Analytics