1.优化count()的查询
count()是一个特殊的函数,有两种非常不同的作用,它可以统计某个列值的数量,也可以统计行数。在统计列值的要求列值是非空的(不统计NULL)。如果在count()的括号中指定了列或者表达式,则统计的就是这个表达式有值的结果数。Count()的另一个作用就是统计结果集的行数。当MYSQL确认括号内的表达式不可能为空的时候,实际上就是在统计行数。最简答的使用时使用count(*)的时候,这种情况下面通配符*不会像我想象的那样扩展成所有的列实际上他会忽略所有的列而直接统计所有的行数。例如:需要一个查询返回各个商品不同颜色的数量,sql语句可以写为:select count(color=’blue’ or NULL) as blue,count(color=’red’ or null) as red from items;2优化limit分页
-
改写如下的sql语句:
Select film_id,description from sakila.film order by title limit 50,5;
如果数据量特别大的话,这样的代价比较高,这时mysql将查询55条数据,最后只返回5条,前面的50条都将被抛弃。优化此类查询的一个最简单的方法就是尽可能的使用索引覆盖扫描,而不是查询所有的列。可将其改为如下的查询:
Select film.film_id,film.description from sakila.film inner join (
Select film_id from sakila.film order by title limit 50,5
) as lim USING(film_id)
这种延迟关联将大大的提升查询效率。
- 优化UNION查询
除非确实需要服务器消除重复的行,否则一定使用union all ,这一点很重要。如果没有ALL关键字,MYSQL会给临时表中加上DISTINCT选项,这样会对整个临时表的数据做唯一性检查。这样做的代价比较高,即使有ALL关键字,MYSQL也会使用临时表存储结果。事实上,MYSQL总是将结果放入临时表中,然后再读出,在返回给客户端。