• 微信:
  • hai764003
  • QQ:
  • 511211014
  • E-mail:
  • jaquery@163.com

案例总数51

访问总数312392

收藏总数310923

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就会出现临时表,而临时表就会破坏索引,增加查询的负担。


 

小海哥推荐你看: 博客园  php教程分享网站  phpmywind  脚本之家