mysql先连接再筛选_mysql连表操作是先连表还是先查询条件

mysql连表操作是先连表还是先查询条件

一、总结

一句话总结:

连表操作时:先根据查询条件和查询字段确定驱动表,确定驱动表之后就可以开始连表操作了,然后再在缓存结果中根据查询条件找符合条件的数据

1、mysql连表中的驱动表如何选择?

在对最终结果集没影响的前提下,优先选择结果集最小的那张表作为驱动表。

2、mysql查询表的时候的预估结果集如何计算?

每行查询字节数 * 预估的行数 = 预估结果集

3、通过where预估结果行数,遵循哪些规则(每行查询字节数 * 预估的行数 = 预估结果集)?

如果where里没有相应表的筛选条件,无论on里是否有相关条件,默认为全表

如果where里有筛选条件,但是不能使用索引来筛选,那么默认为全表

如果where里有筛选条件,而且可以使用索引,那么会根据索引来预估返回的记录行数

4、a和c数据表如何,查询select a.*,c.* from a join c on a.a2=c.c2 where a.a1>5 and c.c1>5; 为何是以字段数多的c表做驱动表?

|||-begin

create table a(a1 int primary key, a2 int ,index(a2)); --双字段都有索引

create table c(c1 int primary key, c2 int ,index(c2), c3 int); --双字段都有索引

|||-end

用a做驱动表需要回查:因为通过已知的c.c2无法得到c.*,需要根据c表的主键再次回查c表

如果select的字段是a.*,c.c2的话就可以直接用a表做驱动表,此时不需要回查c表

如果用a作为驱动表,通过索引c2关联到c表,那么还需要再回表查询一次,因为仅仅通过c2获取不到c.*的数据,还需要通过c2上的主键c1再查询一次。而上一个sql查询的是c2,不需要额外查询。同时因为a表只有两个字段,通过a2索引能够直接获得a.*,不需要额外查询。

5、两表关联查询的内在逻辑是怎样的?

嵌套循环连接:mysql表与表之间的关联查询使用Nested-Loop join算法,顾名思义就是嵌套循环连接

在使用索引关联的情况下,有Index Nested-Loop join和Batched Key Access join两种算法;

在未使用索引关联的情况下,有Simple Nested-Loop join和Block Nested-Loop join两种算法;

mysql表与表之间的关联查询使用Nested-Loop join算法,顾名思义就是嵌套循环连接,但是根据场景不同可能有不同的变种:比如Index Nested-Loop join,Simple Nested-Loop join,Block Nested-Loop join, Betched Key Access join等。

6、驱动表一般怎么选(带索引)(人为的直观)?

where条件里的表:一般在where条件里面的那个表就是驱动表,where条件里面我们一般找的索引,所以会导致(每行查询字节数 * 预估的行数 = 预估结果集)公式里面的预估的行数非常小

7、连表(连接表的外键有索引)操作的具体操作步骤是怎样的(循环操作)?

1、从驱动表中取出一条符合要求的数据

2、回表:通过这条数据然后通过索引找到关联表中的数据(如果只需要where条件里面的字段就不需要这步回表操作)

3、数据加入缓存

8、连表操作的具体操作步骤给我们的启示是

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值