請問如下子查詢的優化,為什么性能變差。
如果是兩個表之間的連接查詢:
select film_id from film_actor where actor_id in (select actor_id from actor where first_name = 'sandra')
select film_id from film_actor join actor on (film_actor.actor_id = actor.actor_id and actor.first_name = 'sandra')
這里,join查詢性能優于子查詢,?比較好理解。性能如下:
子查詢:? ?Query_time: 0.008001? Lock_time: 0.000000 Rows_sent: 56? Rows_examined: 5462
join查詢: Query_time: 0.000996? Lock_time: 0.000996 Rows_sent: 56? Rows_examined: 256
但3個表的子查詢:
課件中的子查詢:
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'));
我自己寫的連接查詢:
select title, release_year, length from film join film_actor join actor on (film.film_id = film_actor.film_id and film_actor.actor_id = actor.actor_id and actor.first_name = 'sandra');
執行日志:
子查詢:? ? Query_time: 0.005999? Lock_time: 0.000000 Rows_sent: 56? Rows_examined: 1000
join查詢: Query_time: 0.008032? Lock_time: 0.000000 Rows_sent: 56? Rows_examined: 11924
請問,為什么這里,子查詢的性能要優于連接查詢?
2020-07-26
命中率低,因為film和actor是多對多關系吧(我沒看具體的表結構)?導致查詢的IO大,所以性能低