access如何查询两张表的内容_为什么可以的话,不要使用星号 *,而是相应的字段名来进行查询 MySQL内连接如何选择驱动表

参考:

掘金小册​juejin.im

首先要了解单表查询方法,也就是explain中出来的,ref,index,const,all之类的。

然后了解index查询方法,也就是在联合索引中,条件不是第一个索引,但是查询的刚好是这联合索引的几个列。这样就直接命中了这个联合索引产生的二级索引表,二级索引里面是索引和主键。

这样的话,我们可以直接通过遍历二级索引的叶子节点,根据后面的条件来把符合条件的列进行返回。

比如:建立联合索引 key_part1, key_part2, key_part3 ,然后进行下面的查询

SELECT key_part1, key_part2, key_part3 FROM single_table WHERE key_part2 = 'abc';

根据前面的方式进行查询,这样就不用回表了,也就是不需要到主键的聚族索引里再查一次了,这样就很快。这就是index的查询方法。

然后是:

为什么可以的话,不要使用星号 *,而是相应的字段名来进行查询

使用*号会把笛卡儿积全部返回,如果只使用字段的话,说不定可以刚好命中联合索引(感觉自己解释地差强人意,感觉还是看下面的别人的吧。。。)

还有一个是 基于块的嵌套循环连接(Block Nested-Loop Join)的 join buffer的使用中,使用buffer存储驱动表的列,这样被驱动表中的记录从硬盘中取出来后可以一次性匹配驱动表中的条件。而放在buffer中的列是查询的列和条件中的列,所以如果查询的是*,那么buffer的大小就会很大。所以只要把需要的列进行添加即可,尽量不使用*。

参考:https://www.cnblogs.com/juncaoit/p/7764184.html

  • 使用星号(*)可能会返回不使用的列的数据。 它在MySQL数据库服务器和应用程序之间产生不必要的I/O磁盘和网络流量。
  • 如果明确指定列,则结果集更可预测并且更易于管理。 想象一下,当您使用星号(*)并且有人通过添加更多列来更改表格数据时,将会得到一个与预期不同的结果集。(我觉得这个是比较关键的)
  • 使用星号(*)可能会将敏感信息暴露给未经授权的用户
https://www.csdn.net/gather_27/MtTaMgwsMTI2MC1ibG9n.html​www.csdn.net

这个也值得注意一下,就是MySQL在内连接时如何选择驱动表的问题,这里使用数据量小的为驱动表,我想着应该和前面的join buffer有关系,这样可以尽量一次把驱动表的数据一次性加载到内存里面。但是如果是 Nested-Loop Join的话,这样就类似与两个for循环的嵌套了。

https://blog.csdn.net/qq_20891495/article/details/93744495​blog.csdn.net

这里讲得挺好的。

主要是要理解

50a9282ce048d6da2079fb20c519cd82.png

这里面的连接是什么。程序上来看就是内循环的次数,实际表现就是访问被驱动表的次数。

外循环是访问驱动表,直接单表访问即可。内循环的次数就是访问被驱动表的次数,也就是上面说的连接数。

比较抽象,看不懂就别看了。

欢迎批评指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值