`
jimmy9495
  • 浏览: 296447 次
  • 性别: 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数据库的基本操作语法

    上面的列名和子查询的列名以及类型要对应 全部列名模式: create table userInfo as select * from user; 直接将整个表的类型和数据备份到新表userInfo中 9、 添加表字段 添加单列 alter table user add tel ...

    dbForge Studio for MySQL 企业版 v8.1.2 教程(最新破Crack解企业版)

    - Visual Query Builder支持子查询 - 无需打开向导即可从数据网格生成快速INSERT语句MySQL存储过程调试器 - 查询分析器 - 执行计划工具等等功能 这是dbforge studio8其他版本不具备的,能够更好的用于MySQL数据库...

    MySQL 5权威指南(第3版) 中文版 下载地址

     10.7 子查询  10.8 保证数据的一致性  10.9 找出冗余的数据记录  10.10 数据表设计方案的改进  10.11 对前n条或后n条记录进行处理  10.12 以随机方式选择数据记录  10.13 全文索引  10.14 锁定  ...

    SQL update 多表关联更新的实现代码

    实现多表更新,尤其是A表和A的子表B表数据更新,下面是例子 有A、B张表,其记录如下: A表 c1 c2 ————– 1 a1 2 a2 3 a3 8 a8 B表 c1 c3 ————– 1 b1 2 b1 3 b3 10 b10 A.c1与B.c1相等,用一条sql...

    MySQL5 权威指南第3版中文版_part1

     10.7 子查询  10.8 保证数据的一致性  10.9 找出冗余的数据记录  10.10 数据表设计方案的改进  10.11 对前n条或后n条记录进行处理  10.12 以随机方式选择数据记录  10.13 全文索引  10.14 锁定  10.15 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例271 清理SESSION缓存提高网站访问的效率 358 第6章 图形图像处理 361 6.1 图像与统计 362 实例272 图形计数器 362 实例273 GD2图形计数器 363 实例274 通过图像显示投票统计结果 365 实例275 通过图像显示密码...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例271 清理SESSION缓存提高网站访问的效率 358 第6章 图形图像处理 361 6.1 图像与统计 362 实例272 图形计数器 362 实例273 GD2图形计数器 363 实例274 通过图像显示投票统计结果 365 实例275 通过图像显示密码...

    程序员的SQL金典.rar

    透彻分析函数、子查询、表连接、不同DBMS中的SQL语法差异、SQL调优、NULL值处理、事务、开窗函数等高级技术;通过对实际案例开发过程的详细分析,使读者掌握 SQL的综合应用技巧。 内容简介 本书主要介绍SQL的语法...

    程序员的SQL金典6-8

     8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中的应用 第9章 主流数据库的SQL语法差异解决方案  9.1 SQL语法差异分析  9.1.1 数据类型的差异  9.1.2 运算符的差异  9.1.3 函数的差异  9.1.4...

    程序员的SQL金典7-8

     8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中的应用 第9章 主流数据库的SQL语法差异解决方案  9.1 SQL语法差异分析  9.1.1 数据类型的差异  9.1.2 运算符的差异  9.1.3 函数的差异  9.1.4...

    程序员的SQL金典4-8

     8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中的应用 第9章 主流数据库的SQL语法差异解决方案  9.1 SQL语法差异分析  9.1.1 数据类型的差异  9.1.2 运算符的差异  9.1.3 函数的差异  9.1.4...

    程序员的SQL金典3-8

     8.5.2 子查询在UPDATE语句中的应用  8.5.3 子查询在DELETE语句中的应用 第9章 主流数据库的SQL语法差异解决方案  9.1 SQL语法差异分析  9.1.1 数据类型的差异  9.1.2 运算符的差异  9.1.3 函数的差异  9.1.4...

    SQL中Merge用法详解

    通过MERGE语句,根据一张表(原数据表,source table)或子查询的连接条件对另外一张(目标表,target table)表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了...

    03开源NewSql数据库TiDB-Deep Dive into TiDB

    但是还不够完善,在 2.0 版本中,一方面优化统计信息的精确度以及更新及时程度,另一方面提升 SQL 优化器的能力,对查询代价的估算更加精准、对复杂过滤条件的分析更加细致、对关联子查询的处理更加优雅、对物理算子...

    2009达内SQL学习笔记

    IN 列表里有 NULL 时不处理,不影响结果;用 NOT IN 时,有 NULL 则出错,必须排除空值再运算。 in :选择列表的条件 使用IN操作符的优点: 在长的选项清单时,语法直观; 计算的次序容易管理; 比 OR 操作符清单...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    Access 微软 Access是一种桌面数据库,只适合数据量少的应用,在处理少量 数据和单机访问的数据库时是很好的,效率也很高 小型企业 三、 Oracle数据库概述 ORACLE数据库系统是美国ORACLE公司(甲骨文)提供的以...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例142 新建有返回值的线程 184 实例143 使用线程池优化多线程编程 186 实例144 Object类中线程相关的方法 187 实例145 哲学家就餐问题 189 实例146 使用信号量实现线程同步 190 实例147 使用原子变量实现线程同步 ...

Global site tag (gtag.js) - Google Analytics