請(qǐng)問(wèn)如下子查詢的優(yōu)化,為什么性能變差。
如果是兩個(gè)表之間的連接查詢:
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查詢性能優(yōu)于子查詢,?比較好理解。性能如下:
子查詢:? ?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個(gè)表的子查詢:
課件中的子查詢:
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');
執(zhí)行日志:
子查詢:? ? 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
請(qǐng)問(wèn),為什么這里,子查詢的性能要優(yōu)于連接查詢?
2020-07-26
命中率低,因?yàn)閒ilm和actor是多對(duì)多關(guān)系吧(我沒(méi)看具體的表結(jié)構(gòu))?導(dǎo)致查詢的IO大,所以性能低