1
liprais 2020-07-06 15:13:45 +08:00
看执行计划就知道了
很大可能是没有的 |
2
binux 2020-07-06 15:19:16 +08:00 via Android
我觉得是 plan 是一样的
|
4
luxinfl OP @binux 感觉写的人以为 select a.coulmnA1 要比 select * 要快,所以以为连接的时候也是 select 出来最快??
|
5
fangcan 2020-07-06 15:27:10 +08:00
应该是一样的
|
6
liprais 2020-07-06 15:33:18 +08:00
@luxinfl
有个逻辑优化规则叫做 ColumnPruning,会把上面的改成下面的 https://github.com/apache/spark/blob/master/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/optimizer/ColumnPruningSuite.scala ^这是 spark sql 里面这个规则的测试用例 mysql 应该也有类似的,所以这俩应该是没啥大的区别 如果数据库没有这个优化,然后这个表里面有个特别大的字段 blob 之类的,这两种写法可能会有一些性能上的区别,因为 build join row 的时候没把不需要的字段去掉。 |
7
haozxuan001 2020-07-06 16:07:52 +08:00
第二个虚表(临时表)是不能使用索引的,我推测你的 sql 应该还有 where 条件,我实际测试下来计划如下
``` 1,PRIMARY,t,const,PRIMARY,PRIMARY,4,const,1,Using index 1,PRIMARY,<derived2>,ref,<auto_key0>,<auto_key0>,8,"const,const",10, 2,DERIVED,t_comment,ALL,,,,,301841, ``` |
8
haozxuan001 2020-07-06 16:08:52 +08:00
|
9
luxinfl OP @haozxuan001 我也试了一下,用虚表的话,会多一条用到索引的执行计划,其他两个 sql 是一样的,这样看的话,其实直接关联表的速度更快?
- SIMPLE a ALL 187 - SIMPLE b ALL 75 Using where; Using join buffer (Block Nested Loop) - - PRIMARY a ALL 187 - PRIMARY <derived2> ref <auto_key0> <auto_key0> 93 cgbs.a.CRDT_APPLY_SRL_NO 7 - DERIVED zl_use_credit_business ALL 75 |
11
haozxuan001 2020-07-06 17:21:40 +08:00
@luxinfl 理论上我在写 sql 的时候,会做 explain,尽可能减少 ALL,尽可能减少虚表这些,因为这些都是没办法用到索引的,没有用到索引的查询,会在后续系统庞大后带来很多问题。
|
12
hellofiora 2020-07-06 17:38:30 +08:00
第二个 如果 是 right,和虚拟表里面有查询条件的话, 我觉得才正常
|
13
hellofiora 2020-07-06 17:39:41 +08:00
譬如
select * from table1 a right join (select b.c1,b.c2 from table2 b where b.c1=*******) b on a.c1=b.c1 |