MySQL优化案例:半连接(semi join)优化方式导致的查询性能低下

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:
20151207114716645.jpg


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

 

专家简介

  

20160729044029167.jpg
李海翔

网名:那海蓝蓝

DBA+社群MySQL领域原创专家


从事数据库研发、数据库测试与技术管理等工作10余年,对数据库的内核有深入研究,擅长于PostgreSQL和MySQL等开源数据库的内核与架构。现任职于Oracle公司MySQL全球开发团队,从事查询优化技术的研究和MySQL查询优化器的开发工作。著有《数据库查询优化器的艺术》一书。

 

 

 

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


20160729044101353.jpg


二、执行如下查询


Q1:


20160729044120843.jpg


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


20160729044128286.jpg


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


三、实际运行结果


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


20160729044136271.jpg


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


四、探索原因


第一招:察看执行计划


20160729044146746.jpg


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


第二招:察看IO

20160729044200801.jpg


20160729044210526.jpg


20160729044218838.jpg


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技巧的使用。查询结果作了形式的调整,便于阅读。


20160729044246859.jpg


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


20160729044301540.jpg

20160729044310756.jpg


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


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


问题:半连接优化


六、继续探索


20160729044319638.jpg


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


20160729044329324.jpg


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


七、结论


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


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



本文来自云栖社区合作伙伴"DBAplus",原文发布时间:2015-12-07

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
17天前
|
关系型数据库 MySQL 索引
mysql 分析5语句的优化--索引添加删除
mysql 分析5语句的优化--索引添加删除
13 0
|
22天前
|
存储 关系型数据库 MySQL
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
轻松入门MySQL:数据库设计之范式规范,优化企业管理系统效率(21)
|
17天前
|
SQL 缓存 关系型数据库
mysql性能优化-慢查询分析、优化索引和配置
mysql性能优化-慢查询分析、优化索引和配置
83 1
|
1天前
|
SQL 关系型数据库 MySQL
不允许你不知道的 MySQL 优化实战(一)
不允许你不知道的 MySQL 优化实战(一)
|
2天前
|
存储 缓存 关系型数据库
掌握MySQL数据库这些优化技巧,事半功倍!
掌握MySQL数据库这些优化技巧,事半功倍!
|
2天前
|
缓存 关系型数据库 MySQL
MySQL数据库优化技巧:提升性能的关键策略
索引是提高查询效率的关键。根据查询频率和条件,创建合适的索引能够加快查询速度。但要注意,过多的索引可能会增加写操作的开销,因此需要权衡。
|
2天前
|
SQL Oracle 关系型数据库
下次老板问你MySQL如何优化时,你可以这样说,老板默默给你加工资
现在进入国企或者事业单位做技术的网友越来越多了,随着去O的力度越来越大,很多国企单位都开始从Oracle向MySQL转移,相对于Oracle而言,MySQL最大的问题就是性能,所以,这个时候,在公司如果能够处理好MySQL的性能瓶颈,那么你也就很容易从人群中脱颖而出,受到老板的青睐。
22 1
|
3天前
|
存储 数据可视化 关系型数据库
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
本文探讨MySQL中时间类型的选择,阐述datetime、timestamp、整形时间戳等类型特点以及它们在千万级数据量下的查询性能
MySQL字段的时间类型该如何选择?千万数据下性能提升10%~30%🚀
|
3天前
|
关系型数据库 MySQL 中间件
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-02 死锁和死锁检测
【4月更文挑战第19天】在高并发环境下,死锁发生在多个线程间循环等待资源时,导致无限期等待。MySQL中,死锁可通过`innodb_lock_wait_timeout`参数设置超时或`innodb_deadlock_detect`开启死锁检测来解决。默认的50s超时可能不适用于在线服务,而频繁检测会消耗大量CPU。应对热点行更新引发的性能问题,可以暂时关闭死锁检测(风险是产生大量超时),控制并发度,或通过分散记录减少锁冲突,例如将数据分拆到多行以降低死锁概率。
19 1
|
7天前
|
SQL 关系型数据库 MySQL
mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示
mysql 数据库查询 查询字段用逗号隔开 关联另一个表并显示
17 2