MySQL | MySQL 为什么不推荐使用JOIN

MySQL 为什么不推荐使用JOIN

MySQL 不推荐使用 JOIN 的说法是过于简化的。实际上,在某些情况下使用 JOIN 是非常有用的,但在其他情况下可能会带来性能问题、复杂性和可维护性问题以及重复数据等问题。

首先我们需要知道JOIN语句是用于将多个表中的数据进行联合起来的操作。

JOIN 本质就是各个表直接数据循环匹配,嵌套查询。也就是从主表(驱动表)中取出一条数据,遍历从表(被驱动表),将匹配到的数据放到result。以次类推,主表中的每一条记录与从表记录进行判断。

  • 在关联查询的时候,那个表作为主表(驱动表),那个表作为从表(被驱动表),不是那个表在前边那个表就是主表,而是MySQL优化器决定谁是主表(除了STRAIGHT_JOIN),谁是从表,优化器会通过很多方面来决定例如索引
  • straight_join 是内连接查询 是那个表在前边 那个表就是主表,。使用straight_join一定要慎重,因为部分情况下人为指定的执行顺序并不一定会比优化引擎要靠谱。
比如A表 inner join B表查询 

create table a(f1 int,f2 int ,INDEX(f1));
create table b(f1 int,f2 int,index(f2));

内连接
EXPLAIN select * from a inner join b on a.f1=b.f1;#b作为主表
EXPLAIN select * from a inner join b on a.f1=b.f1 where a.f1 = 1;#a作为主表
EXPLAIN select * from a inner join b on a.f1=b.f1 where b.f2 = 1;#b作为主表

在小数据量的情况下可以使用JOIN 联合查询,一旦数据量很大效率就很难保证了。

分布式的分库分表。这种时候是不建议跨库join的。目前mysql的分布式中间件,跨库join表现不良。

数据库是最底层的,瓶颈往往是数据库。建议数据库只是作为数据store(存储)的工具,而不要添加业务上去

MySQL 为什么不推荐子查询

MySQL子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程。