mysql小表驱动大表

这篇具有很好参考价值的文章主要介绍了mysql小表驱动大表。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要:
小表驱动大表是优化器从成本考虑后做出的选择
判断谁做小表时,是比较算上过滤条件后的字段+条数的总大小
小表驱动大表在执行计划中体现,第一行是小表第二行是大表。不是在show warnings体现
left join时右表过滤条件在where,优化器会转为inner join小表驱动大表。
left join时右表过滤条件在on,优化器不会优化成小表驱动大表,因为无法转为inner join,所以要自己把小表放左边,大表放右边
inner join时优化器会自动小表驱动大表

course–100条数据
student_info–100w条数据
优化器会选择小表驱动大表(这里表指的是算上过滤条件的表)

`EXPLAIN
SELECT a.*,b.* FROM `course` a JOIN `student_info` b ON a.`course_id`=b.`course_id`

mysql小表驱动大表

EXPLAIN SELECT a.* FROM `student_info` a JOIN `course` b ON a.`course_id`=b.`course_id`

mysql小表驱动大表

加上过滤student_info的条件

EXPLAIN
SELECT a.*,b.* FROM `course` a JOIN `student_info` b ON a.`course_id`=b.`course_id` WHERE b.`student_id`=1

执行计划改变,由小表student_info驱动大表course,得出优化器先走where后join的结论。
mysql小表驱动大表
查看优化器优化后的sql
show warnings

from atguigudb1.course a join atguigudb1.student_info b where ((atguigudb1.a.course_id = atguigudb1.b.course_id) and (atguigudb1.b.student_id = 1))

left join时右表过滤条件在where,优化器会转为inner join小表驱动大表。

EXPLAIN
SELECT a.*,b.* FROM `course` a LEFT JOIN `student_info` b ON a.`course_id`=b.`course_id` WHERE b.`student_id`=1

mysql小表驱动大表查看优化器优化后的sql
show warnings

FROM atguigudb1.course a JOIN atguigudb1.student_info b WHERE ((atguigudb1.a.course_id = atguigudb1.b.course_id) AND (atguigudb1.b.student_id = 1))文章来源地址https://www.toymoban.com/news/detail-482168.html

到了这里,关于mysql小表驱动大表的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL大表优化方案(应该是最完整最全的了)

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑、部署、运维的各种复杂度,一般以整型值为主的表在 千万级 以下,字符串为主的表在 五百万 以

    2024年04月28日
    浏览(32)
  • 面试官:Mysql千万级大表如何进行深度分页优化?

    假如有一张千万级的订单表,这张表没有采用分区分表,也没有使用ES等技术,分页查询进行到一定深度分页之后(比如1000万行后)查询比较缓慢,我们该如何进行优化? 订单表结构如下: 其中 Mysql 版本为8.0。我们使用Python脚本向表中插入2000万条数据。 导出数据时我们需

    2024年02月19日
    浏览(47)
  • 浅述Oracle和Mysql两种库分别在join时大表的归宿

    突然想起这么一个问题,Oracle 和 Mysql 在各自关联大表的时候,要想性能高点,大表放的位置是不是一样的,针对这个问题,我查找了一些资料,并确定的该问题的结果。 在Oracle和MySQL中,对于JOIN语句,将大表放在JOIN语句的左侧或右侧都可以, 但是 由于查询优化器的不同实

    2024年02月04日
    浏览(40)
  • NineData支持制定安全、可靠的SQL开发规范_mysql大表风险治理举措

    生产环境规范-结构 INNODB表的主键(聚簇索引)保存了索引和数据行,并且二级索引的叶子节点也保存了主键值。如果没有定义主键,则会优先使用非空唯一索引来代替,如果没有唯一索引,则会使用内部隐藏的主键。所以新增表j建议有主键。 随着业务的快速发展,数据表存

    2024年04月16日
    浏览(37)
  • 【用Percona Toolkit给mysql大表在不锁表的情况下建索引】

    共分为两步骤: 配置仓库 安装文档1 安装 安装文档2 由于mysql8默认使用的是caching_sha2_password,认证方式,而Percona Toolkit在centos7中使用的perl-dbd-mysql版本目前是4.023,暂时不支持这种认证方式,因此需要在mysql中新建一个以mysql_native_password认证的用户 建立索引 根据提示输入密码

    2024年02月07日
    浏览(40)
  • NineData支持制定安全、可靠的SQL开发规范_mysql大表风险治理举措(1)

    在MySQL 8.0中,默认已经不包含任何MyISAM表,所以在创建表的时,可以限制表的引擎,在高并发和高性能的场景下,推荐使用INNODB(支持事务、行锁),并且也需要设置各个列和表的备注,保证表的可读性。 线上数据库常常面临着持续的、不断变化的表结构修改(DDL),如增加

    2024年04月12日
    浏览(49)
  • Oracle 如何给大表添加带有默认值的字段

    你是否遇到过开发人员添加字段,导致数据库锁表问题? 但是令开发疑惑的事,他们添加字段,有的时候很快,有的时候很慢? 为什么呢? 询问得知,**加的慢时候是带上了default默认值,如果表的数据量很大,那么会花费很长时间。在加字段期间,表上还会加6级锁,连se

    2024年02月11日
    浏览(39)
  • 大数据开发之Hive案例篇10-大表笛卡尔积优化

    需求描述: 表概述: 需要实现的需求 SQL代码: 运行日志: 从日志可以看到,数据倾斜了,redcue一直卡在99%不动,过一段时间就被断开了。 web页面日志: 从web页面可以看到,reduce被kill的原因是Container被ApplicationMaster给kill掉了 过一段时间整个Job都被kill掉了 因为reduce卡在了99%,所以

    2024年02月09日
    浏览(84)
  • MySQL的驱动表与被驱动表

    在MySQL中进行多表联合查询时,MySQL会通过驱动表的结果集作为基础数据,在被驱动表中匹配对应的数据,匹配成功合并后的临时表再作为驱动表或被驱动表继续与第三张表进行匹配合并,直到所有表都已匹配完毕,最后将结果返回出来。匹配算法:Nested-Loop Join(嵌套循环连

    2024年02月08日
    浏览(28)
  • Python MySQL - mysql-connector 驱动

    在Python中,MySQL连接池是一种管理数据库连接的技术。它的作用是预先创建一定数量的数据库连接,并将其保存在一个连接池中,以便在需要时可以快速获取可用的连接,避免了频繁地创建和销毁连接所带来的性能开销。 MySQL连接池的优点包括: 提高性能:通过复用已建立的

    2024年02月05日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包