MySQL数据库优化返回列表
上传时间:2015-02-02 内容关键字:MySQL数据库优化
第二、子查询优化:
通常情况下,需要把子查询优化为join查询,但是优化时要注意关联键是否有一对多的关系,要注意重复数据。比如:
字查询:
mysql>select * from t where t.id in(select t1.id from t1);
连接查询:
mysql>select t.* from t left join t1 on t.id = t1.id;
如果连接查询出重复的数据,那么用distinct关键字去重复
mysql>select distinct t.id from left join t1 on t.id = t1.tid;
注意:如果t1中的id有相同值的时候,那么子查询只会查询出一条记录,而连接查询会查询出 所有的记录。
查询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'
)
) \G;
联合查询
explain SELECT film.title,film.release_year,film.length
FROM film
join film_actor on film.film_id = film_actor.film_id
join actor on film_actor.actor_id = actor.actor_id
where actor.first_name = 'sandra' \G;
总结:通过explain分析,联合查询比字查询检索的行数明细减少,效率更快。
第三、group by查询优化
优化前:
写法一:
explain SELECT actor.first_name, actor.last_name,COUNT(*)
FROM sakila.actor
inner join sakila.film_actor using(actor_id)
group by film_actor.actor_id;
写法二:
explain SELECT actor.first_name, actor.last_name,COUNT(*)
FROM sakila.film_actor
inner join sakila.actor using(actor_id)
group by film_actor.actor_id;
优化后:
Explain SELECT actor.first_name,actor.last_name,c.cnt
FROM sakila.actor INNER JOIN(
SELECT actor_id,COUNT(*) AS cnt FROM sakila.film_actor GROUP BY actor_id
)AS c USING(actor_id)
注意:使用group by就会出现临时表,而临时表就会破坏索引,增加查询的负担。