Mysql 优化特定的查询

September 14, 2016 3:14 PM

声明

文章内容出自《高性能Mysql第三版》

优化count

如果想知道数据的行数,最佳使用count(*) * 并不是所有的列,而是会忽略所有的列。直接返回行数

优化关联查询

  • 确保ON或者USING字句中的列上有索引.在创建索引的时候要考虑关联的顺序。当A和B用列c关联的时候。如果优化器的关联顺序是B,A,那么就不需要在B表上建立对应列上建立索引,一般来说,只需要在关联顺序中的第二表的相关列上创建索引

  • 确保任何的group by和order by中的表达式只涉及到一个表中的列, 这样MySQL才有可能使用索引来优化这个过程

优化子查询

尽量使用关联查询来替代子查询。但不是绝对的。如果是高版本的的MySQL5.6 此点可忽略

优化union查询

手工将where,limit,order by等字句下推至各个子查询中。

除非需要消除重复的行,不然都需要使用union all ,因为union会添加distinct

避免在in中使用子查询

select * from table where id in(select t_id  from table1 where ...)

这样的SQL语句MySQL并不是先执行in中的select,mysql会将相关的外层表压到子查询中,它会认为这样可以更高效地查询到数据行,也就是说,MySQL会将上列的sql改写下面的样子:

SELECT  * FROM TABLE exists
( SELECT *
   FROM table1
   WHERE ....
     AND TABLE.id=table1.t_id
)