了解查询的整个生命周期,清楚每一个阶段的时间消耗状况html
参考
慢查询日志是优化很重要的手段,可是开启慢查询日志对性能的影响并不大,因此能够考虑在线上打开慢查询日志mysql
select @@profiling:查看profiling是否打开
set profiling=1:打开profiling
show profiles:查看每条查询的性能
show profile for query id:查看query id的详细时间花费
information_schema.profiling:该表存储了每一个query的详细时间花费
show status:查看会话级别的计数器
show global status:查看全局的计数器
show status where variable_name like '%handler%':查看某些变量的计数sql
查询由多个子任务组成,优化查询也就是优化子任务数据库
不要请求不须要的数据缓存
mysql衡量查询开销的指标:性能优化
访问类型
explain语句中的type指明了访问类型,包括:全表扫描,索引扫描,范围扫描,惟一索引查询,常数引用,从左到右扫描的行数从多到少,速度从慢到快
查询语句中where条件的使用,性能从好到坏是:服务器
优化器只关心随机页面的读取函数
mysql提供了一些选项来干涉优化器的行为,可是建议通常状况下不要使用,由于通常干涉优化器带来的收效较小,反而给版本升级的时候带来一些问题性能
count(col):查询该列值得个数(不包含null)
count(星号):查询行数优化
使用关联查询代替子查询,在mysql5.6和mariadb不须要考虑
group by的结果默认会按照分组字段进行排序,若是不须要排序能够去掉排序,指定order by NULL
当页码比较多的时候须要扫描的数据较大,这个时候能够使用覆盖索引进行优化,先使用索引覆盖查询出limit的分页数据,而后join该表,查询其余字段,这样就减小了扫描的行数
select * from user_order inner join (select order_id from user_order order by buy_date limit 50, 5) as lim on lim.order_id=user_order.order_id;
或者能够记下该分界行的标识列(该列最好有索引),好比主键id,而后查询基于该分界的记录
select * from user_order where order_id > 500 order by order_id limit 5;
对于总记录数,若是不那么精确的话能够使用explain的rows
除非有消除重复行的必要,不然使用union all,由于使用union会在临时表上加distinct,致使对整个临时表作惟一性校验