通常情况下,需要把子查询优化为 join 查询,但在优化时要注意关联建是否有一对多的关系,要注意重复数据。
(查询 sandra 出演的所有影片)
explain SELECT title, release_year, LENGTH FROM film WHERE film_id IN( SELECT film_id FROM film_actor WHERE actor_id IN SELECT actor_id FROM actor WHERE first_name = 'sandra'))
在子查询的优化中:
通常做法是把需要的子查询优化为join查询,但在优化时要注意是否有数据的重复,因为在关联语句中的可能存在一对多的关系,从而造成数据冗余。
join语句是相当于将多个表进行关联,在关联条件上一一进行条件匹配查询,因此返回值不仅取决于原始表中的数据个数,还取决于其他表中与之匹配的数据的个数。
所以要加上distinct
具体:3:08: select distinct t.id from t join t1 on t.id=t1.tid;
1.用连接的方式进行查询可能会导致数据重复,如:select t.id from t join t1 on t.id = t1.tid ,但是通过子查询就只有一条数据了:select * from t where t.id in (select ti.tid from ti);可以通过distinct去重;
1.数据表是按照行的方式进行存储的,一个数据表中包含了许多行,而每一行由不同的字段组成,这些字段称为列,这就是数据表的结构;
2.在查询的时候,如果没有指定索引,那么必须要对每一行都进行扫描,然后才能找到每行中被查询的字段,所以可以说,在没有索引的情况下,要扫描整个表才可以查询到需要的数据;
3.在添加了索引之后,那么会增加一个索引表,这个索引表记录了索引值 与 对应字段的关系,然后,以该字段进行的查询操作,将不再需要扫描原来的数据表的每一行,而是扫描这个建立的索引表,显然,这个索引表的IO的操作就比原来的数据表要小很多了,所以可以提升查询的速度,并且如果表的字段比较多的情况,那么建立索引的总用越明显;同时,因为要维护这个索引表,所以当进行增,删,改的时候,性能会相对下降;
4.覆盖索引,就是说 通过索引的值,在索引表中就可以找到需要的值
子查询优化 改为 join 连接查询时,关注两表之间 是否是一对多的关系,若有,则需要去重
子查询优化时,如果是一对多查询,使用join on时要用distinct去重