1、包含优化 count
没有任何where 条件的count(*) 具有神话般的速度,原因是 mysql 通过存储引擎 直接获取这个取值;
所以如下代码 会很慢:
SELECT count(*) from usertb from usertb WHERE id > 2;
优化以后 :
SELECT (SELECT count(*) from usertb) - count(*) from usertb WHERE id < 2 ;
问题1:如何在同一个查询中统计同一个列的不同值的数量,用来减少查询的语句量;
SQL: SELECT COUNT(uname = '用户1' or NULL) from usertb;
可以用逗号隔开 多个条件;
SELECT COUNT(uname = '用户1' or NULL) as user1,COUNT(uname = '用户2' or NULL) as user2 from usertb;
问题2:某些情况可使用近似值;(某些需求下可用,比如 获取当前活跃人数)
explain 查询近似值 得到的就是 成本比较低;
问题3:更加复杂的优化;
a、修改应用架构,增加汇总表;
b、外部缓存系统, 例如:memcached ;
2、优化关联查询
3、优化子查询
https://my.oschina.net/u/3630550/blog/1492130 ON子句 和 USING子句 区别;
a、确保 on 或者 using 子句中的列上面 有索引;创建索引的时候就要考虑 关联的顺序问题;
一般来说,只需要在关联顺序的第二个表的相应列上面创建索引;
b、确保group by 和 order by 中的表达式只涉及到一个表中的列,这样mysql 才有可能使用索引来
优化这个过程;
4、优化group by distinct
group by 分组的g时候,通常采用查找列的标识 比其他列的 效率高很多;
例如:
select actor.firstname,actor.lastname from film_actor inner join actor using (actor_id) group by
actor.firstname,actor.lastname;
优化后:
select actor.firstname,actor.lastname from film_actor inner join actor using (actor_id) group by
film_actor.actor_id
5、优化limit分页
6、优化union查询
7、优化sql_calc_found_rows
8、静态查询分析