赞
踩
参考:掘金小册juejin.im
首先要了解单表查询方法,也就是explain中出来的,ref,index,const,all之类的。
1.可以尽量使用index,这样不用回表。但是index还是要扫描全部记录,只能说是择优选择吧。
2.基于块的嵌套查询当中,joinbuffer 只存储查询的列和条件过滤的列,如果全部查询的话,join buffer就会很大,需要分配更多的内存。
3.假如字段很多,那么每次查出来到内存中都会很大。
然后了解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的大小就会很大。所以只要把需要的列进行添加即可,尽量不使用*。
使用星号(*)可能会返回不使用的列的数据。 它在MySQL数据库服务器和应用程序之间产生不必要的I/O磁盘和网络流量。
如果明确指定列,则结果集更可预测并且更易于管理。 想象一下,当您使用星号(*)并且有人通过添加更多列来更改表格数据时,将会得到一个与预期不同的结果集。(我觉得这个是比较关键的)
使用星号(*)可能会将敏感信息暴露给未经授权的用户
https://www.csdn.net/gather_27/MtTaMgwsMTI2MC1ibG9n.htmlwww.csdn.net
这个也值得注意一下,就是MySQL在内连接时如何选择驱动表的问题,这里使用数据量小的为驱动表,我想着应该和前面的join buffer有关系,这样可以尽量一次把驱动表的数据一次性加载到内存里面。但是如果是 Nested-Loop Join的话,这样就类似与两个for循环的嵌套了。https://blog.csdn.net/qq_20891495/article/details/93744495blog.csdn.net
这里讲得挺好的。
主要是要理解
这里面的连接是什么。程序上来看就是内循环的次数,实际表现就是访问被驱动表的次数。
外循环是访问驱动表,直接单表访问即可。内循环的次数就是访问被驱动表的次数,也就是上面说的连接数。
比较抽象,看不懂就别看了。
欢迎批评指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。