mysql——关于join的一些知识

1、select * from a join b,与select * from a,b

结果是相同的,都是两张表的笛卡尔积;笛卡尔积的作用,生成时间序列、模拟循环等。

 

2、jion、inner join 和cross join

在inner join 没有加on条件时,join、inner join 和cross join没有区别

xxx join xxx,就等于 xxx inner join xxx,也等于 xxx cross join xxx,得到的结果都是两张表数据量相乘的笛卡尔积。例如a表有10条数据,b表有100条数据,jion之后的结果就是1000条数据。

 

3、加上on条件之后,查询性能更好

inner join on,on语句的执行是在jion语句之前的,也就是说两张表数据行之间进行匹配的时候,会先判断数据行是否符合on语句后面的条件,再决定是否join

select * from a,b where xxx,会在内存中先生成一张数据量比较大的笛卡尔积表,增加了内存的开销

 

4、提高 inner join查询性能的方式

(1)以小表作为驱动表(inner join前面的为驱动表),大表作为被驱动表;

(2)为大表的条件字段创建索引;

(3)增大join_buffer_size。

 

5、一个简单的sql解析:

 首先看a表数据,只是添加了一个序列号:

 再看b表数据,同样也是添加序列号:

 然后使用了select * from a,b where xxx的方法,进行join,得到笛卡尔积,并进行了条件筛选:

 由此可知,该条sql是求,某个设备的power_level变化时间差,再将相同power_level的时间差进行求和。

 

 

 参考:

https://zhuanlan.zhihu.com/p/133539313

https://www.zhihu.com/question/34559578/answer/2287459774

https://blog.csdn.net/qq_19800265/article/details/103401272

posted @ 2023-04-18 14:43  hushuer  阅读(186)  评论(0编辑  收藏  举报