关于数据库调优有很多方面,核心思想是"通过调优工具先找到慢查询语句,然后进行分析"。
具体调优的方法请看 https://www.cnblogs.com/monkey-xuan/p/15858689.html
1.定位执行慢的SQL:慢查询日志。
- show variables like '%slow_query_log'; //查看慢查询日志是否开启
- set global slow_query_log = 'ON'; //开启慢查询日志(默认不开启,在优化的时候手动开启)
- set global long_query_time = 1; //设置临界时间为1s
- show variables like '%slow_query_log%'; //查看慢查询日志文件位置
- show status like 'slow_queries'; //查看有多少个慢查询
过命令行修改就是临时的,服务器重启就会恢复,也可以通过配置文件修改,就是永久的
2.慢查询日志分析工具mysqlDumpSlow
- mysqldumpslow /日志文件的位置 //查看到慢查询的SQL语句
3.查看SQL的执行成本show profile
- show profile 是MySQL提供的可以在当前会话中查看,SQL都做了什么,执行的资源消耗情况等。
- show variables like 'profiling'; //查看是否开启
- set profiling = 'ON'; //开启show profile
4.分析查询语句:explain
explain工具可以打印出执行计划,这个执行计划就是MySQL优化器选择的一个执行计划。
- id:在一个大的查询中,每一个select关键字都对应一个位置的id,id值越大,优先级越高,越先执行。id一样,从上到下顺序执行。
- select_type:确定select对应的id查询的类型,也可以说该小查询在大查询中扮演的角色。
- table:每一个查询对应的表名
- partitions:分区表中的命中情况,非分区表,该值为null。
- type:执行查询时的访问方式。由上到下,效率逐渐递减
- system:表中只有一条记录,相当于系统表。或者Myism中count(*)也是这个类型
- const:通过索引一次命中,匹配一行数据。比如:where id = 759 这种情况
- eq_ref:唯一性索引扫描,等号右边是唯一的值,但是这个值是其他表查询的结果。如:select * from s1 inner join s2 on s1.id=s2.id;
- ref:非唯一性索引扫描,等号右边是' '匹配。如:select * from s1 where key = 'a';
- range:范围查询,一般用在between,< >.
- index:遍历所有的索引树
- All:全表扫描,完全不走索引
- possible_keys:表示可能用到的索引
- key:实际用到的索引
- key_len:实际使用到的索引长度,越长越好,说明越精准匹配
- ref:当使用索引列进行等值查询时,表示等号右边对象的信息。比如:select * from s1 inner join s2 on s1.id=s2.id;ref的值为:数据库名.s2.id。
- rows:预估需要读取的记录数
- filtered:表示rows中有百分之多少是有用的。越大越好
- Extra:更精准的理解MySQL到底如何执行给定的查询语句。有几十个,列举重要的
- Using temporary:使用了临时表
- Using index:使用覆盖索引
- Using where:使用where 过滤
explain的四种输出格式:
- 传统格式
- JSON格式:explain format = JSON select...
- TERR格式:explain format=tree select...
- 可视化输出:使用软件工具MySQL Workbench
5.其他工具:
- trace:可以跟踪优化器做出的各种决策
- MySQL监控分析视图:sys schema
寄语:我从来不相信什么懒洋洋的自由,我向往的自由是通过勤奋和努力实现的更广阔的人生,那样的自由才是珍贵的、有价值的