使用过oracle或者其他关系数据库的DBA或者开发人员都有这样的经验,在子查询上都认为数据库已经做过优化,能够很好的选择驱动表执行,然后在把该经验移植到mysql数据库上,但是不幸的是,mysql在子查询的处理上有可能会让你大失所望,在我们的生产系统上就由于碰到了这个问题:

select  i_id, sum(i_sell) as i_sell

from table_data

where i_id in (select i_id from table_data where Gmt_create >= ‘2011-10-07 00:00:00’)

group by i_id;

(备注:sql的业务逻辑可以打个比方:先查询出10-07号新卖出的100本书,然后在查询这新卖出的100本书在全年的销量情况)。

这条sql之所以出现的性能问题在于mysql优化器在处理子查询的弱点,mysql优化器在处理子查询的时候,会将将子查询改写。通常情况下,我们希望由内到外,先完成子查询的结果,然后在用子查询来驱动外查询的表,完成查询;但是mysql处理为将会先扫描外面表中的所有数据,每条数据将会传到子查询中与子查询关联,如果外表很大的话,那么性能上将会出现问题;

针对上面的查询,由于table_data这张表的数据有70W的数据,同时子查询中的数据较多,有大量是重复的,这样就需要关联近70W次,大量的关联导致这条sql执行了几个小时也没有执行完成,所以我们需要改写sql:

SELECT t2.i_id, SUM(t2.i_sell) AS sold

FROM (SELECT distinct i_id FROM table_data

WHERE gmt_create >= ‘2011-10-07 00:00:00’) t1,  table_data t2

WHERE t1.i_id = t2.i_id GROUP BY t2.i_id;

我们将子查询改为了关联,同时在子查询中加上distinct,减少t1关联t2的次数;

改造后,sql的执行时间降到100ms以内。

生产库中遇到mysql的子查询相关推荐

  1. MySQL子查询的优缺点_浅谈mysql的子查询

    浅谈mysql的子查询 mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,你可以点击这里 ,这里来获得一些信息,mysql在处理子查询的时候,会 ...

  2. mysql怎么子查询_在mysql中如何进行子查询?

    在mysql中,子查询是指将一个查询语句嵌套在另一个查询语句中,可以在SELECT.UPDATE和 DELETE语句中配合WHERE子句进行实现,WHERE子句中语法格式为"WHERE (另 ...

  3. MySQL数据库---子查询insert,update,delete语句中嵌套子查询

    十.子查询的使用(重点) 1.子查询:指的是查询语句,嵌套查询语句---->一般是放在where子句中,表示条件. 2.子查询的应用使用场景: 2.1查询过程中,虽然给了条件,但是条件的结果并不 ...

  4. MySQL 行子查询

    MySQL 行子查询 行子查询是指子查询返回的结果集是一行 N 列,该子查询的结果通常是对表的某行数据进行查询而返回的结果集. 一个行子查询的例子如下: SELECT * FROM table1 WH ...

  5. 浅谈mysql的子查询

    2019独角兽企业重金招聘Python工程师标准>>> mysql的子查询的优化一直不是很友好,一直有受业界批评比较多,也是我在sql优化中遇到过最多的问题之一,mysql在处理子查 ...

  6. MySQL(五) —— 子查询

    子查询(SubQuery)是指出现在其他SQL语句内的SELECT语句. 如: SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中 SELE ...

  7. mysql表子查询(嵌套查询)

    mysql表子查询(嵌套查询): 1.什么是子查询: 子查询是指嵌入在其它 sql 语句中的 select 语句,也叫嵌套查询 -- 如何显示与 SMITH 同一部门的所有员工? -- 1.先查出sm ...

  8. mysql嵌套子查询索引_SQL 子查询,索引优化

    场景 索引优化 单列索引 多列索引 索引覆盖 排序 场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表 create table Course( c_id int PRIMARY KE ...

  9. MySQL 嵌套子查询 with子句 from子查询 in子查询 join子查询

    一.适用场景和方法 (1)适用场景 考虑查询过程中是否存在以下情况: 查询某些数据时需要分组才能得到,某些数据不需要分组就能得到或者分组条件不同: 查询某些数据时需要where条件,某些列不需要whe ...

最新文章

  1. 【3月30日直播】新冠病毒全基因组测序——Midnight试剂盒及整体解决方案
  2. 开启mysql远程访问的权限
  3. OpenStack——基于EXSI安装OpenStack解决方案
  4. boost::isomorphism用法的测试程序
  5. 单点登录 cas 设置回调地址_单点登录落地实现技术有哪些,有哪些流行的登录方案搭配?...
  6. Git 使用明细,持续完善中......
  7. js、jQuery实现自定义弹出框效果
  8. python gui哪个好看_python的GUI选择什么方案比较好?
  9. mysql存储多少_MySQL存储引擎你们知道多少?
  10. 微信小程序Axure元件库
  11. gradle配置阿里Maven仓库
  12. 20100920卡巴最新激活码下载
  13. 计算机上怎么在表格输入分秒,excel2010中如何设置分秒格式显示单元格或数据?...
  14. 一文详细理解计算机网络 - 物理层(考试和面试必备)
  15. C语言的结构化程序设计
  16. 2022年最新河南建筑安全员模拟题库及答案
  17. 一位资深程序员大牛给予Java初学者的学习路线建议
  18. 一分钟了解阿里云产品:云虚拟主机
  19. 几款支持国标GB28181的平台以及视频监控设备接入的配置方法(Web端无插件播放)
  20. java数组初始化为 1_Java Class 1.1数组初始化

热门文章

  1. 结合Kubernetes解读微服务的12要素
  2. python爬虫06
  3. java七大设计原则,23种设计模式
  4. php7垃圾回收机制l_PHP7 垃圾回收机制(GC)解析
  5. 多个cpu+linux,linux查看多个cpu信息
  6. 十分钟学会用Go编写Web中间件
  7. 【1】Docker概述
  8. redis的内存会不会耗尽
  9. 剥开比原看代码15:比原是如何转帐的
  10. python数组的使用