驱动表

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介:

同样的SQL,不同的表做驱动表可能会导致执行的不同。例如:

1) 主表为lesson:
EXPLAIN SELECT l.* 
FROM lesson l 
INNER JOIN lesson_collect lc ON l.lesson_id=lc.lesson_id 
WHERE lc.account_id='...' 
ORDER BY l.`create_time` DESC\G;

image

2) 主表为lesson_collect
EXPLAIN SELECT l.* 
FROM lesson_collect lc 
INNER JOIN lesson l ON lc.lesson_id=l.lesson_id 
WHERE lc.account_id='...' 
ORDER BY l.`create_time` DESC\G;

image

同样的语句, lc做主表能够导致两张表都使用索引,l做索引只能使用一个索引;lc做主表使用了temporary和filesort,而l做主表使用了filesort。

驱动表

MySQL优化器处理多表连接时首先要确定以谁为驱动表,也就是说以哪个表为基准,一般情况下,哪个表的结果集小,就以哪个表为驱动表。

MySQL 表关联的算法是 Next LOOP Join,是通过驱动表的结果集作为循环基础数据,然后一条一条地通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。

当进行多表连接查询时,驱动表的定义为:

1) 指定了联接条件时,满足查询条件的记录行数少的表为驱动表;
2) 未指定联接条件时,行数少的表为驱动表;
3) LEFT JOIN和straight_join中, 最左表为驱动表;
4) INNER JOIN中,MySQL优化器自动选择最小表作为驱动表。

优化的目标是尽可能减少JOIN中Nested Loop的循环次数, 使用小结果集驱动大结果集。

因此,有时候,同一SQL语句,inner join会比left join要快。原因就是inner join可以由mysql自己选择驱动表,而left join很可能被程序员定义为慢表为驱动表。

驱动表造成的问题

mysql自动选取驱动表也不一定是真正的最优方案。当SQL中没有order by时,MySQL优化器选择的驱动表一般没有问题。可当表需要字段来排序,例如create_time,如果排序字段不在驱动表里,就不可避免的出现「Using filesort」「Using temporary」

因此,要尽可能的保证排序字段在驱动表中,left join和straight_join可以强制指定连接顺序。

有时可能遇到这种问题:原本运行良好的查询语句,过了一段时间后,突然变得很糟糕。有可能是因为数据分布情况发生了变化,从而导致MySQL优化器对驱动表的选择发生了变化,进而出现索引失效的情况。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
Java 数据库连接 Maven
使用mybatis插件generator生成实体类,dao层和mapper映射
使用mybatis插件generator生成实体类,dao层和mapper映射
1193 0
|
Shell 虚拟化 数据中心
加番 · 自定义vSphere证书
自上个月开始,陆续有客户和粉丝私信:由于vCenter证书过期,出现无法访问控制台的情况。其实这个问题在VMware KB(https://kb.vmware.com/s/article/79248)已经有非常详尽的描述。简单来说,从6.5U2版本以后,vCenter自签名证书有效期只有2年,需要定期更新。
|
7月前
|
机器学习/深度学习 资源调度 Java
YOLOv11改进策略【注意力机制篇】| 2024 SCI TOP FCAttention 即插即用注意力模块,增强局部和全局特征信息交互
YOLOv11改进策略【注意力机制篇】| 2024 SCI TOP FCAttention 即插即用注意力模块,增强局部和全局特征信息交互
431 1
YOLOv11改进策略【注意力机制篇】| 2024 SCI TOP FCAttention 即插即用注意力模块,增强局部和全局特征信息交互
|
11月前
|
JavaScript 开发者 UED
数据驱动方式的优缺点
【10月更文挑战第13天】 数据驱动是软件开发中,特别是在 Vue 等框架中的一种重要理念。它通过数据绑定简化代码结构,提高开发效率和可维护性,增强用户体验,促进团队协作,并提升性能和灵活性。然而,也存在初始学习成本高、数据绑定复杂、内存管理问题及调试难度大等挑战。总体而言,数据驱动在现代应用开发中具有显著优势,但也需谨慎应对潜在问题。
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之无法创建mysql的连接池什么导致的
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
223 0
|
XML 机器学习/深度学习 监控
性能监控之Telegraf+InfluxDB+Grafana NVIDIA GPU实时监控
【6月更文挑战12天】性能监控之Telegraf+InfluxDB+Grafana NVIDIA GPU实时监控
483 0
|
存储 人工智能 算法
【阿里云产品测评】揭秘阿里云向量检索服务:赋予智能时代搜索新“维度”
【1月更文挑战第3天】在数字化洪流席卷全球的今天,信息的表达与检索方式正在悄然变革。从字符到图像,再到复杂的多维度数据,我们正在步入一个深度理解、精准匹配的智能搜索新时代。此刻,阿里云推出的向量检索服务正以前沿技术之力,引领这一领域的创新潮流。 阿里云向量检索服务,内核采用自研的Proxima引擎,其强大之处在于能够实现水平拓展、全托管和云原生的高效向量检索。这就好比构建了一个可以无限延伸的“知识宇宙”,无论是大规模图像识别、语音识别模型生成的特征向量,还是复杂的大模型知识库结构化信息,都能通过向量化的形式被管理和高效检索。
|
CDN
CDN设置防盗链及使用鉴权功能——cdn鉴权功能开启
CDN设置防盗链及使用鉴权功能——cdn鉴权功能开启自制脑图
386 0
CDN设置防盗链及使用鉴权功能——cdn鉴权功能开启
|
缓存 安全 Java
【权限管理框架】一文看懂Shiro权限管理框架!1
【权限管理框架】一文看懂Shiro权限管理框架!

热门文章

最新文章