文章内容出自《高性能Mysql第三版》
如果想知道数据的行数,最佳使用count(*) * 并不是所有的列,而是会忽略所有的列。直接返回行数
确保ON或者USING字句中的列上有索引.在创建索引的时候要考虑关联的顺序。当A和B用列c关联的时候。如果优化器的关联顺序是B,A,那么就不需要在B表上建立对应列上建立索引,一般来说,只需要在关联顺序中的第二表的相关列上创建索引
确保任何的group by和order by中的表达式只涉及到一个表中的列, 这样MySQL才有可能使用索引来优化这个过程
尽量使用关联查询来替代子查询。但不是绝对的。如果是高版本的的MySQL5.6 此点可忽略
手工将where,limit,order by等字句下推至各个子查询中。
除非需要消除重复的行,不然都需要使用union all ,因为union会添加distinct
例
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
)