• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >Mysql > 对MySQL子查询的简单改写优化

对MySQL子查询的简单改写优化

作者:罗龙九 字体:[增加 减小] 来源:互联网 时间:2017-05-11

罗龙九通过本文主要向大家介绍了mysql子查询,mysql 子串,mysql子查询语句,mysql 子字符串,mysql数据库子查询等相关知识,希望本文的分享对您有所帮助

使用过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;

</div>

(备注: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;

</div>

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

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 对MySQL子查询的简单改写优化
  • MySQL子查询的几种常见形式介绍

相关文章

  • 2018-12-05SQL Server 触发器 表的特定字段更新时,触发Update触发器
  • 2018-12-05Mysql 安全注意事项
  • 2017-05-11Mysql自动备份与还原方法
  • 2018-12-05MySQL 和 SQL 注入与防范方法
  • 2018-12-05asp.net 将图片上传到mysql数据库的方法
  • 2018-12-05MySQL5.5.27的安装详解(图文)
  • 2018-12-05SQLServer 数据导入导出的几种方法小结
  • 2018-12-05mysql中如何配置ssl_key和ssl-cert与ssl-ca的路径以及建立ssl连接的实例
  • 2018-12-05SQLServer 2005数据库连接字符串 连接sql2005必备资料
  • 2017-05-11MyISAM和InnoDB引擎优化分析

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • Linux安装JDK和Tomcat以及MySQL的图文教程
    • 有关登陆密码的课程推荐10篇
    • 用SQL统计SQLServe表存储空间大小的代码
    • 不同数据库之间导入导出功能介绍
    • Linux下查看MySQL的安装路径
    • 小编带你深入解析SQL Server索引的原理
    • 详解MySQL存储过程参数有三种类型(in、out、inout)
    • 使用Perl DBI操作MySQL的一些建议
    • mysql命令行还原phpMyAdmin导出的含有中文的SQL文件
    • mysql执行时间为负数的原因分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有