1.善于使用expain
explain的使用清晰度展示了一些需要添加索引以及其它的一些性能信息,可以根据查看explain的结果对语句进行优化
2.切分查询
感觉计算机里面分而治之的思想无处不在,这里切分查询既是这个思想的一次展示,如果我们想删除一年的数据,如果一次性删除的话对数据库,会占用大量资源,可能造成阻塞,对正常的服务器运行产生波动影响,
策略:将一次性删除改为每次删除1-3万行数据(这里可根据自己的服务器性能进行变动,使用工具找到影响最小的),在每次删除后最好暂停一下,这样能将整个数据操作分散到更长的时间线中,对服务影响更小
3.特定类型优化查询
(1).count()简单优化
常见误解:count函数在MyISAM中非常快
答:只有在没有where条件的情况下才能非常快
select count(*) from world.city where id > 5;
通过explain可以看出这个sql语句在我的数据库中扫描了5000行左右代码,那么如何进行优化,可以倒过来查询啊
select (select count(*) from world.city) - count(*) from world.city where id < 5
这样从小的开始排查大大减少了查询行数,是个不错的查询方式。
(2) group by优化
最好优化策略:
◆ GROUP BY 条件字段必须在同一个索引中最前面的连续位置;
◆在使用GROUP BY 的同时,只能使用 MAX 和 MIN 这两个聚合函数;
◆如果引用到了该索引中 GROUP BY 条件之外的字段条件的时候,必须以常量形式存在
(3) limit优化
limit 在数据量不大的情况下非常适合分页,再加上索引,相当方便,
但是在数据量便宜很大的情况下就不是很合适了,这里我们引入mysql的一种查询方法。
延迟查询:通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。
再说白点就是先查主键,在关联到数据,来看例子:
select film_id, description from sakila.film order by title limit 50000, 5;
查询五万条之后的五条数据
优化:
select film.film_id, film.discription from sakila.film inner join (
select film_id, description from sakila.film order by title limit 50000, 5
) as lim using(film_id);
这里我们通过子查询先查询了符合条件的id,然后在关联到表中,查询效率提升好几倍
-------------------------------------暂时到这里,后续对文章进行继续补充