mysql left join 耗时_性能调优:mysql之left join
需求是一个普通的两个表连接从而查询出详细信息。其中A表是大表, 测试数据都有数万条; B表是小表大概1000多条数据。
1. 为了赶工写出的未优化SQL(为突出主题, 返回字段用 * 代替不写出详细字段, WHERE条件也去掉了):
SELECT
*
FROM
A a
LEFT JOIN
B b
ON
a.JOB_ID = b.ID
耗时:3.712s
rows字段代表这个步骤相对上一步结果每一行需要扫描的行数,可以看到这个sql需要扫描的行数为22711*1230, 这几乎是两个表做笛卡尔积的开销了(select * from a, b)。
MySQL对JOIN的处理采用了一种叫做BLOCK Nested-Loop 的算法。 Block Nested-Loop 算法是通过驱动表(可以简单理解为前面的表)的结果集作为循环基础数据, 然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。 如果还有第三个参与 JOIN, 则再通过前面两个表的 JOIN 结果集作为JOIN的基础数据,再一次通过循环查询条件到第三个表中查询数据。 结论: 驱动表(前面表)的数据量决定了总扫描数。
2. 从业务上
都是全表扫描, 然后我发现左表数据在业务上如果右表为NULL就没意义了, 然后改为INNER JOIN。
耗时: 2.745s
3. 可以看到上面的type都是ALL
system/const/eq_ref/ref/range/index/ALL ---- 从左到右效率递减
都是type都是ALL考虑到连接的条件是否可以为主键, 有主键的话MySQL可以使用索引查询, 效率会提升很多。
由于A表是历史表做链接的字段不是主键, 所以只能在B表把这个字段加上主键。
耗时: 2.672s
还是很慢, 因为还没建立索引, 现在对B表ID字段加上索引, 结果如下:
耗时:0.109s
mysql left join 耗时_性能调优:mysql之left join相关推荐
- 服务器内存一般多大_性能调优第一步,搞定服务器硬件选型
服务器选型是Linux性能调优的第一步. 无论你是自行购买服务器进行托管,还是租用服务器,购买云主机,都要面临的一个问题:选择服务器的硬件配置. 我们需要从不同角度.多个方面来决定选择一台什么样的服务 ...
- java 性能 火焰图_性能调优工具-火焰图
性能调优工具-火焰图 发布时间:2019-07-17 19:29, 浏览次数:402 前言 工具的进化一直是人类生产力进步的标志,合理使用工具能大大提高我们的工作效率,遇到问题时,合理使用工具更能加快 ...
- python 断点重传_性能调优-python SDK 调优
python SDK python 和 java 或者和 GO ,在性能上来说都不是最好的,而且 python 无法支持多核的并发,只能跑在单核上的多线程.但是 oss 也提供了相应的方法提高多线程的 ...
- MySQL性能调优(MySQL高性能第三版)
创建高性能索引 query优化 连接优化 内存使用 查询缓存优化 日志设置优化 Innodb存储引擎优化 索引设计问题 1.不稳定列问题: 磁盘驱动器的负载和DML语句的性能需求决定了表上索引数目的上 ...
- MySQL教程——4 高级篇(性能调优、锁)
1. 应用优化 前面章节,我们介绍了很多数据库的优化措施.但是在实际生产环境中,由于数据库本身的性能局限,就必须要对前台的应用进行一些优化,来降低数据库的访问压力. 1.1 使用连接池 对于访问数据库 ...
- linux mysql io压力大_MySQL性能调优(四) Linux 磁盘IO
1. IO处理过程 磁盘IO经常会成为系统的一个瓶颈,特别是对于运行数据库的系统而言.数据从磁盘读取到内存,在到CPU缓存和寄存器,然后进行处理,最后写回磁盘,中间要经过很多的过程,下图是一个以wri ...
- mysql集群搭建及性能调优之一(集群搭建)
本文讲解mysql的集群搭建 文章目录 1. docker安装并启动三台mysql 2. 创建基础库并设置可访问用户 3. 主从配置 3.1 主服务器配置 3.2 从服务器配置 1. docker安装 ...
- vmware响应时间过长_性能调优高并发下如何缩短响应时间
点击上方"蓝字"带你去看小星星 菜菜哥,请你看电影呀,但是得帮我一个忙 好呀,看什么? 哥斯拉2:怪兽之王 看过了~ X战警:黑凤凰 看过了 追龙2和黑衣人呢? 都看过了,你说帮什 ...
- sql 执行计划 嵌套循环_性能调优–嵌套和合并SQL循环与执行计划
sql 执行计划 嵌套循环 In this article, we will explore Nested and Merge SQL Loops in the SQL Execution plan ...
- Spark性能调优案例-多表join优化,减少shuffle
背景 A任务在凌晨1点到3点,平均耗时1h,且是核心公共任务,急需优化. 整体逻辑示意图: // 从tableA读取一次数据,放到临时表t1 DROP TABLE IF EXISTS temp.tmp ...
最新文章
- AJAX培训第二讲:使用AJAX框架(上)
- 解决android模拟器不能访问网络的问题
- 终于来了!微软正式推出 VS Code 测试 API
- 本地Apache配置虚拟主机/域名
- SpringNote01.基于SpringMVC-Hibernate的Blog系统
- python装饰器详解-Python 函数装饰器
- 安卓深度探索(卷一)第六章
- 2022最新简历模板
- 固态硬盘系统经常假死_win10系统更换固态硬盘经常假死的解决方法
- Silverlight MMORPG WebGame游戏设计(五)-----Client的嫁妆
- [BJOI2019] 排兵布阵(分组背包)
- Python3操作EXCEL,取汉字首字母,拼接全拼
- python基础----文件处理
- java中API什么意思
- 设置锁屏方式后,锁屏长按电源键还有锁屏按钮(lockdown)锁屏状态下应该没有,解锁使用后长按才有这个按钮。
- linux启动redis进程,Linux安装Redis实现过程及报错解决方案
- 大数据 端到端_成为数据科学家的端到端指南
- 基于流的深度生成模型
- 患者到医院看病事件模拟
- 易语言 用精易的网页_访问 请求https的时候返回不了数据
热门文章
- UEditor使用说明
- Python全栈_Day5_用户、群组、权限
- 构建自己的NSZombie
- spring catch了异常还是回滚了_干货:Spring 踩坑之@Transactional 神奇失效
- pythontkinter显示表格_详谈Python 窗体(tkinter)表格数据(Treeview)
- Hexo Next底部powered by的logo栏更改以及注意事项(附官方文档,文末有福利链)
- Win7如何删除家庭组
- 微信公众号教程(8)用微信开发模式做欢迎词
- golang使用go-sql-driver实现mysql增删改操作
- C# 程序中使用 SQLite 数据库