【MySQL】驱动表、被驱动表详解。—— 性能优化。

文章目录

我是一名立志把细节都说清楚的博主,欢迎【关注】🎉 ~

原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~

如有错误、疑惑,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持


什么是 驱动表 和 被驱动表?

在2个表或2个以上表的连接查询中(多数涉及关键字 JOIN ),才会涉及 驱动表被驱动表

在使用多表嵌套连接时,首先,会全表扫描该一个表作为查询条件,这个表叫做 驱动表 。然后用驱动表返回的结果集逐行去匹配的表,叫做 被驱动表


哪个表是驱动表?

  • 驱动表是由 MySQL 优化器选择的
  • 我们只能通过理解优化器的选择倾向,让某个表更接近优化器的选择标准,让这个表尽可能的成为驱动表。

优化器选择驱动表的原则是:让查询的性能更好。 基于这个原则,可以从以下几个方面考虑:

  • 小表优先: 因为驱动表会被全表扫描,所以优先选择小表作为驱动表。全表扫描的效率更高。
  • 有where条件的优先: 优化器优先选择有过滤条件的表作为驱动表,能够减少部分匹配操作。
  • 连接类型:
    • LEFT JOIN / LEFT OUTER JOIN:这两个关键字会返回左表中的所有的记录(符合驱动表全表扫描的特性),而右表的匹配记录是可选的。所以会优先选择左表为驱动表。
    • RIGHT JOIN / RIGHT OUTER JOIN:优先选择右表作为驱动表,原理同上。
    • INNER JOIN:优化器会评估执行计划中表的扫描次数,需要扫描次数更少的表优先作为驱动表。

性能优化建议:

我们应该有意识的调整驱动表更符合MySQL 优化器的选择标准。

  • 尽可能使用小表作为驱动表。驱动表因为要被全表扫描,所以我们在选择上,我们应该尽量选择小表作为驱动表(至少是相对小表)。
  • 更具需要增加筛选条件,减少部分匹配操作。
  • 根据连接类型的特点调整驱动表的位置。 让驱动表符合不同连接查询选择驱动表的倾向。
  • 被驱动表使用索引。 被驱动的表通常是大表,对于大表,我们可以使用索引优化查询效率。

我是一名立志把细节都说清楚的博主,欢迎【关注】🎉 ~

原创不易, 如果有帮助 ,记得【点赞】【收藏】 哦~ ❥(^_-)~

如有错误、疑惑 ,欢迎【评论】指正探讨,我会尽可能第一时间回复的,谢谢支持

相关推荐
十碗饭吃不饱25 分钟前
sql报错:java.sql.SQLSyntaxErrorException: Unknown column ‘as0‘ in ‘where clause‘
java·数据库·sql
我是Superman丶1 小时前
【优化】Mysql指定索引查询或忽略某个索引
数据库·mysql
程序定小飞1 小时前
基于springboot的在线商城系统设计与开发
java·数据库·vue.js·spring boot·后端
呆呆小金人1 小时前
SQL入门: HAVING用法全解析
大数据·数据库·数据仓库·sql·数据库开发·etl·etl工程师
LL_break1 小时前
Mysql数据库
java·数据库·mysql
野犬寒鸦1 小时前
从零起步学习Redis || 第十一章:主从切换时的哨兵机制如何实现及项目实战
java·服务器·数据库·redis·后端·缓存
倔强的石头_2 小时前
面向大数据架构的演进:为何 Apache IoTDB 是与生态无缝融合的理想之选?
数据库
Elastic 中国社区官方博客3 小时前
如何减少 Elasticsearch 集群中的分片数量
大数据·数据库·elasticsearch·搜索引擎·全文检索
Logintern093 小时前
只有通过Motor 获取 mongodb的collection,才能正常使用 async with collection.watch()监听集合变更
数据库·mongodb
huaqw003 小时前
Java17新特性解析深入理解SealedClasses的语法约束与设计哲学
数据库