谈到MySQL不得不说的就是你们都会遇到的性能问题,今天就记录一下SQL优化相关的技巧。php
经过检查SQL语句的状态有助于MySQL的优化,首先介绍 show status命令sql
//检查当前会话的状态 SHOW SESSION STATUS; //检查全局状态 SHOW GLOBAL STATUS;
这个命令能够查看到MySQL中sql语句的执行状态,具体的以下:json
参数 | 说明 |
---|---|
Com_select | SELECT查询次数 |
Com_insert | INSERT操做次数 |
Com_update | update更新次数 |
Com_delete | delete操做次数 |
innodb_rows_read性能 innodb_rows_inserted优化 innodb_rows_updatedspa innodb_rows_deletedcode |
select查询返回行数orm update、insert、delete操做次数索引 |
Connections | MySQL累计链接次数 |
Slow_queries | 慢查询次数 |
Handler_read_key | 索引查询数 |
Handler_read_rnd_next | 读取下一行的次数 |
经过以上的数据,能够检查出MySQL链接数量,决定是否使用连接池,索引利用率。ci
根据读写情况,能够了解到选择什么样的存储引擎更加合适。
相信你们都不陌生多explain命令,用于检查SQL语句的执行计划,在索引优化的时候必不可少。
每次项目前都会开着SlowLog去压测,而后把满查询经过explain去分析。
首先介绍一下这个命令的经常使用用法:
//检查SQL语句执行计划 explain select * from user where username = 'fuckphp'; //查询MySQL优化后但语句执行计划 explain extended select * from user where username = 'fuckphp'; //查询MySQL分区信息的执行计划 explain partitions select * from user where username = 'fuckphp';
字段 | 描述 | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
id | 每一个SELECT分配的ID | ||||||||||||||
select_type |
|
||||||||||||||
table | 表名 | ||||||||||||||
type |
|
||||||||||||||
possible_keys | 可能用到的索引 | ||||||||||||||
key | 查询用到的索引 | ||||||||||||||
key_len | 索引长度 | ||||||||||||||
rows | 检索行数 | ||||||||||||||
Extra | 补充信息 | ||||||||||||||
ref | 与key一同检索的字段或常数 |
除了explain还有show profile这个神器,来帮咱们分析SQL语句的执行过程。
//查看是否支持 show @@have_profiling; //在会话中开启profile set profiling=1; //查询当前会话执行过的SQL 包含queryid 查询时间、查询语句 show profiles; //根据queryid查询执行过程当中的时间 show profile for query queryid; //查询所有执行信息 show profile all for query queryid; //查询source、cpu、block io、context、page faults等信息 更多查看help profile; show profile cpu for query queryid;
这个神器会在将来版本中被MySQL废除掉,已经不建议使用,官方建议在performance_schema的PROFILING表中进行查询。
MySQL5.6之后,可使用strace命令对SQL语句进行追踪。
//开启strace SET OPTIMIZER_TRACE="enabled=on"; //设置strace 输出格式为json SET END_MARKERS_IN_JSON=on; //查询SQL信息 select * from information_schema.OPTIMIZER_TRACE\G
在这个结果中能够查看到MySQL对条件的优化,恒等条件的优化等信息,便于查询出性能瓶颈。