驱动表

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 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优化器对驱动表的选择发生了变化,进而出现索引失效的情况。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
Oracle Java 关系型数据库
什么是数据库驱动?有哪几种jdbc驱动
什么是数据库驱动?有哪几种jdbc驱动
|
5月前
驱动常用技巧
。。。未完,待续。。。
41 0
|
11月前
|
存储 Cloud Native Linux
C++ 表驱动方法代替if-else
C++ 表驱动方法代替if-else
|
敏捷开发 消息中间件 缓存
什么是领域驱动
领域驱动的概念
202 0
|
IDE 前端开发 数据可视化
ZenUML与服务驱动设计
ZenUML与服务驱动设计
ZenUML与服务驱动设计
|
测试技术 程序员
我的场景驱动设计
我的场景驱动设计
我的场景驱动设计
表驱动法
什么是表驱动法? 是一种编程模式,从表里查找信息而不使用逻辑语句(if 和case)。事实上,凡是能通过逻辑语句来选择的事物,都可以通过查表来选择。对简单的情况而言,使用逻辑语句更为容易和直白,但随着逻辑链的越来越复杂,查表法也就愈发显得更具有吸引力。
表驱动法
|
Linux ice Windows
V5.10 DebugServer中CKLINK驱动更新说明
V5.10 DebugServer中CKLINK驱动更新说明
V5.10 DebugServer中CKLINK驱动更新说明
|
关系型数据库 MySQL
mysql如何把一张表的数据移植到另外一张和其结构一样的表中
mysql如何把一张表的数据移植到另外一张和其结构一样的表中
200 0