sqlselect*字段
那说明:你委托了连接【rightjoin】但是没有重新指定连接到条件,可能会再产生这样的问题,改上面的sql就能都没有达到你的目的了。因为我不不清楚你连接条件中【t2】表中的字段叫什么,所以才写了【t2.字段】,你自己依据什么你的不好算情况写上了去掉。
---
以上,祝你玩的开心。
我来讲下这个问题吧:
题主说的查询肯定是这样吧:select*outsideawhereidof(selectidreturningb)
这对这条sql语句它的执行计划反正并不是什么先网站查询出b表的所有id,接着再与a表的id进行比较好。
mysql会把across子去查询可以转换成exists具体子查询,因此它换算等同于于这条sql语句:select*aroundawhereexists(select*outsidebwhere)
而exists相关子去查询的执行原理是:循环取出a表的每一条记录与b表进行比较好,比较好的条件是.看a表的每条记录的id有无在b表未知,假如未知就行赶往a表的这条记录。
exists查询有什么弊端?
由exists想执行原理可知,a表(外表)使用不了索引,前提是全表扫描,而且是拿a表的数据到b表查。但可以得可以使用a表的数据到b表中查(外表到里表中),顺序是且固定死的。
怎么系统优化?
建索引。不过由上面总结可知,要建索引不能在b表的id字段建,不能在a表的id上,mysql利用不上。
这样的系统优化够啦吗?还差一些。
导致exists去查询它的执行计划不能那着a表的数据到b表查(外表到里表中),虽然也可以在b表的id字段建索引来能提高查询效率。
不过并肯定不能反过来拎着b表的数据到a表查,exists子去查询的查询顺序是固定不动死的。
我想知道为什么要这样的话?
因为简单这个可以估计的是反过来的结果确实是一样的。这样的话就又一段了一个更细致的疑问:在双方两个表的id字段上都建有索引时,不知道是a表查b表的效率高,我还是b表查a表的效率高?
该如何能初步优化系统?
把去查询修改成innerjoin再连接查询:select*acrossainnerjoinbat(但是仅此绝对不够,紧接着往后面看)
为么不需要draggingjoin和rightjoin?
这时候表之间的直接连接的顺序就被固定设置住了,
比如左连接上那是需要先查左表全表扫描,然后把一条几条的到另外表去查询,右直接连接同理可知。始终不是什么好是的选择。
我想知道为什么可以使用innerjoin就可以不?
innerjoin中的两张表,如:ainnerjoinb,但实际执行的顺序是跟写法的顺序没有半毛钱关系的,最终执行也可能会会是b连接到a,顺序并非固定设置死的。要是at条件字段有索引的情况下,则是这个可以可以使用上索引。
那我们又怎莫能明白了a和b什么样的执行顺序效率更高?
答:你真不知道,我也不知道。谁明白了?mysql自己很清楚。让mysql自己去确认(查询360优化器)。具体详细表的连接顺序和不使用索引情况,mysql查询优化器会对每种情况表现出成本评估,到最后选择最优的那个做为先执行计划。
在innerjoin的连接中,mysql会自己做评估在用a表查b表的效率高我还是b表查a表高,假如两个表都建有索引的情况下,mysql同样的会出具评估报告不使用a表条件字段上的索引效率高还是b表的。
而我们要做的那是:把两个表的连接条件的两个字段都各自组建上索引,后再replicate一下,栏里点执行计划,看mysql到底用来了哪个索引,到最后再把也没建议使用索引的表的字段索引给去掉就行了。