本文整理自网络,侵删。
目录
- join算法
- 驱动表和非驱动表的区别
- 1、Simple Nested-Loop Join,简单嵌套-无索引的情况
- 2、Index Nested-Loop Join-有索引的情况
- 3、Block Nested-Loop Join ,join buffer缓冲区
- 缓冲区大小
- 数据量大的表和数据量小的表如何选择连接顺序
- 细节
join算法
mysql只支持一种join算法:Nested-Loop Join(嵌套循环连接),但Nested-Loop Join有三种变种:
- Simple Nested-Loop Join,简单嵌套
- Index Nested-Loop Join,索引嵌套
- Block Nested-Loop Join ,join buffer缓冲区嵌套(临时表)
驱动表和非驱动表的区别
驱动表就是主表,非驱动表就是从表,看以下sql就知道了,A就是驱动表,B就是非驱动表。
select * from A left join B
A join B 连表时,一定先查A表再查B表吗?
答案是不一定,因为mysql内部有一个优化器,它会根据你查询语句做一些优化,先查哪张表也是由优化器决定的,但可以肯定的是,先查询的那张表就是驱动表,反之就是非驱动表;关于是那张表先查的问题,我们通过看执行计划来得出结果;在前面加上explain关键字即可;
explain select * from A join B;
1、Simple Nested-Loop Join,简单嵌套-无索引的情况
A left join B: ,每次都是全表匹配,A表的每行数据都全表匹配一次B表,也就是说,假如我A表有10条数据,B表有1000条数据,那么查询的时候扫描次数就是10*1000,也就说查询时需要扫描10000遍才能得出数据;
2、Index Nested-Loop Join-有索引的情况
select * from A join B on A.id=B.id where A.id = 1:在查询时,驱动表A会根据关联字段的索引进行查找,当在索引上找到符合的值,在回表进行查询,也就是说得匹配到索引后才会才会进行回表查询;
如果非驱动表B的关联关联字段B.id是主键的话,性能会非常高,如果不是主键,会进行多次回表查询,先关联索引,然后根据二级索引的主键id进行回表查询,性能上比主键要慢;
相关阅读 >>
更多相关阅读请进入《mysql》频道 >>
数据库系统概念 第6版
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » 浅谈mysql join底层原理
标签:mysql
相关推荐
评论
管理员已关闭评论功能...