以下是来自DBA+社群MySQL领域原创专家李海翔分享的MySQL优化案例,关于MySQL V5.6.x/5.7.x SQL查询性能问题。

一、简单创建一表,并使用存储过程插入一部分数据

二、执行如下查询

Q1:

Q2:Q2比Q1只多了一个使用OR子句连接的条件,数据中没有满足此条件的数据

问题: Q1和Q2哪个查询快?快者比慢者能快出几倍?为什么?

三、实际运行结果

对Q1和Q2稍加改造,目的是避免有大量的查询结果输出。目标列使用COUNT()函数替换。

看红色字体,所耗费的时间,Q1是Q2的近乎40倍。为什么?

四、探索原因

第一招:察看执行计划

对比执行计划,发现Q1使用了“MATERIALIZED”物化方式存储子查询的临时结果,是不是物化导致了Q1慢呢?

第二招:察看IO

Q2和Q1不一致之处在于Q2的“Handler_read_key”值20002远远比比Q1的2高,这说明Q2更多地利用了索引。

且看MySQL官方解释如下:

Handler_read_key

The number of requests to read a row based on a key. If this value is high, it is a good indication that your tables are properly indexed for your queries.

问题:

为什么Q2会有更多的索引读?索引是从哪里来的?

Q1被物化,意味着Q1使用了临时表;而Q2子查询是否被物化是否使用了临时表呢?

五、新的疑问,再次探索

之下如下操作,注意show warnings技巧的使用。查询结果作了形式的调整,便于阅读。

可以看出,Q1的子查询被物化后,又作了半连接优化,意味着子查询被上拉方式优化。

Q2表明,首先使用了临时表,但是和Q1不同的是,子查询没有被上拉优化。

但是,MySQL对于临时表的使用,会自动创建索引,所以我们能看到在“auto_key”上执行了“primary_index_lookup”。这就是Q2快于Q1的原因。也是为什么Q2的索引读计数器的值较大的原因。

问题:半连接优化

六、继续探索

执行计划似乎改变不大,但类似了Q2的执行计划。(哈哈,可执行show warnings;命令看看,获取更详细的信息才能得出更靠谱的结论)

在禁止了半连接操作之后,执行速度一下子坐上了飞机,有了40余倍的提升。

七、结论

1. Q1使用了物化+半连接优化,Q2是子查询,但没有使用半连接优化,可见MySQL中半连接优化的效率未必高。

2. 似乎物化的子查询用半连接上拉,MySQL的判断条件还是存在一点儿问题。

mysql半连接_MySQL优化案例:半连接(semi join)优化方式导致的查询性能低下(转载)...相关推荐

  1. mysql semi join_MySQL 通过semi join 优化子查询

    半连接是MySQL 5.6.5引入的,多在子查询exists中使用,对外部row source的每个键值,查找到内部row source匹配的第一个键值后就返回,如果找到就不用再查找内部row sou ...

  2. mysql优化案例(14秒优化到不到1秒)

    优化案例 前面用过的tbiguser表有10000000条记录 创建tuser1表和tuser2表,并初始化若干的数据. create table tuser1( id int primary key ...

  3. mysql半连接_mysql表的半连接,反连接导致的mysql性能优化剖析

    [导读] 关于Oracle的半连接,反连接,我一直认为这是一个能讲很长时间的话题,所以在我的新书<Oracle DBA工作笔记>中讲性能优化的时候,我花... 关于Oracle的半连接,反 ...

  4. mysql semi join_MySQL 5.6 Semi join优化之materialization strategy

    8月 24, 2014 | Nix.Huang 考虑如下查询: select * from Country where Country.code IN (select City.Country fro ...

  5. MySQL内连接方法_Mysql常用的几种join连接方式

    1.首先准备两张表 部门表: 员工表: 以下我们就对这两张表进行不同的连接操作 1.内连接 作用: 查询两张表的共有部分 语句:Select from tableA A Inner join tabl ...

  6. Spark性能调优案例-多表join优化,减少shuffle

    背景 A任务在凌晨1点到3点,平均耗时1h,且是核心公共任务,急需优化. 整体逻辑示意图: // 从tableA读取一次数据,放到临时表t1 DROP TABLE IF EXISTS temp.tmp ...

  7. mysql 一对多 join_Mysql中FIND_IN_SET与JOIN在一对多关系查询时的优劣

    Mysql中的FIND_IN_SET函数在我知道它之前,我在做一个一对多的外键查询时,都会在中间设计一个关系表.比如一篇文章(post)对应多个标签(tag),我就会在中间设计一个关系表(post_t ...

  8. 删除mysql表_Mysql 删除数据表的三种方式详解

    用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, 用 delete. 删除程度可从强到 ...

  9. 数据库-优化-案例-count()函数的优化

    函数Count()的优化 需求:在一条SQL中同时查处2006年和2007年电影的数量 错误的方式: 语句: select count(release_year='2006' or release_y ...

最新文章

  1. 腾讯优图实验室-计算机视觉(日常实习生招聘)
  2. 【图像超分辨率】(SPSR)Structure-Preserving SR with Gradient Guidance
  3. 7-192 素因子分解 (20 分)
  4. Java 并发编程之可重入锁 ReentrantLock
  5. 小D课堂 - 零基础入门SpringBoot2.X到实战_第4节 Springboot2.0单元测试进阶实战和自定义异常处理_19、SpringBoot个性化启动banner设置debug日志...
  6. Careercup - Facebook面试题 - 5890898499993600
  7. 搅动PC市场风云,荣耀何以成为破局者?
  8. java socket调试工具_SocketToolV1.0-Java网络TCP调试助手
  9. 《普林斯顿微积分读本》笔记-第2章三角学回顾
  10. Unity 监听Hierachy、Project等视图结构变化的事件
  11. 转载:ITRS/GCRS/J2000坐标系的相互转换
  12. 51单片机对直流电机的控制(使用proteus仿真)
  13. 解决Unity3D提示‘Newtonsoft‘could not be found
  14. C语言使用openssl库解析TLS报文(SNI和证书)
  15. 卡方独立性检验|卡方拟合性检验
  16. 字跳三轮面试完,我想去读个硕士了T_T
  17. mysql建库、建表命令、sql语句大全
  18. luoguP3799 妖梦拼木棒
  19. npm模块之opn使用教程(node **.js直接再浏览器中打开相应的文件)
  20. linux用户登录身份验证错误,启动 WLS 时的身份验证错误(解决linux下问题)

热门文章

  1. [Python2] List-comprehensions 列表推导式
  2. Homework-201521410028
  3. 标准库函数和系统调用的区别
  4. CHIL-SQL-INNER JOIN 关键字
  5. 简单的线路的界面的调用方法
  6. AC日记——ISBN号码 openjudge 1.7 29
  7. 如何动态设置控件的宽高度?
  8. JavaScript遇到浏览器不兼容与解决方案
  9. QTP学习笔记----2013.04.25
  10. 【TensorFlow实战】TensorFlow实现经典卷积神经网络之ResNet