1.MySQL 性能指标都有哪些?如何得到这些指标?
MySQL 的性能指标如下:
① TPS(Transaction Per Second) 每秒事务数,即数据库每秒执行的事务数。
MySQL 本身没有直接提供 TPS 参数值,如果我们想要获得 TPS 的值,只有我们自己计算了,可以根据 MySQL 数据库提供的状态变量,来计算 TPS。需要使用的参数:
a.Com_commit :表示提交次数,通过命令 show global status like 'Com_commit'; 获取;
b.Com_rollback:表示回滚次数,通过命令 show global status like 'Com_rollback'; 获取。
我们定义第一次获取的 Comcommit 的值与 Comrollback 值的和为 c_r1,时间为 t1;
第二次获取的 Comcommit 的值与 Comrollback 值的和为 cr2,时间为 t2,t1 与 t2 单位为秒。 那么 TPS = ( cr2 - c_r1 ) / ( t2 - t1 ) 算出来的就是该 MySQL 实例在 t1 与 t2 生命周期之间的平均 TPS。
② QPS(Query Per Second) 每秒请求次数,也就是数据库每秒执行的 SQL 数量,包含 INSERT、SELECT、UPDATE、DELETE 等。 QPS = Queries / Seconds Queries 是系统状态值—总查询次数,可以通过 show status like 'queries'; 查询得出,如下所示:
Seconds 是监控的时间区间,单位为秒。 比如,采样 10 秒内的查询次数,那么先查询一次 Queries 值(Q1),等待 10 秒,再查询一次 Queries 值(Q2),那么 QPS 就可以通过,如下公式获得:QPS = (Q2 - Q1) / 10
③ IOPS(Input/Output Operations per Second) 每秒处理的 I/O 请求次数。
IOPS 是判断磁盘 I/O 能力的指标之一,一般来讲 IOPS 指标越高,那么单位时间内能够响应的请求自然也就越多。理论上讲,只要系统实际的请求数低于 IOPS 的能力,就相当于每一个请求都能得到即时响应,那么 I/O 就不会是瓶颈了。
注意:IOPS 与磁盘吞吐量不一样,吞吐量是指单位时间内可以成功传输的数据数量。可以使用 iostat 命令,查看磁盘的 IOPS,命令如下:
yum install sysstat iostat -dx 1 10 ,IOPS = r/s + w/s 其中:r/s:代表每秒读了多少次;w/s:代表每秒写了多少次。
2.什么是慢查询?
慢查询是 MySQL 中提供的一种慢查询日志,它用来记录在 MySQL 中响应时间超过阀值的语句,具体指运行时间超过 longquerytime 值的 SQL,则会被记录到慢查询日志中。longquerytime 的默认值为 10,意思是运行 10S 以上的语句。默认情况下,MySQL 数据库并不启动慢查询日志,需要我们手动来设置这个参数,如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会给 MySQL 服务器带来一定的性能影响。慢查询日志支持将日志记录写入文件,也支持将日志记录写入数据库表。
使用 mysql> show variables like '%slow_query_log%'; 来查询慢查询日志是否开启,slowquerylog 的值为 OFF 时,表示未开启慢查询日志。
3.如何开启慢查询日志?
开启慢查询日志,可以使用如下 MySQL 命令:mysql> set global slowquerylog=1 ,不过这种设置方式,只对当前数据库生效,如果 MySQL 重启也会失效,如果要永久生效,就必须修改 MySQL 的配置文件 my.cnf,配置如下:slowquerylog =1 slowquerylogfile=/tmp/mysqlslow.log
4.如何定位慢查询?
使用 MySQL 中的 explain 分析执行语句,比如:explain select * from t where id=5;
id — 选择标识符。id越大优先级越高,越先被执行。select_type — 表示查询的类型。table — 输出结果集的表partitions — 匹配的分区type — 表示表的连接类型possible_keys — 表示查询时,可能使用的索引key — 表示实际使用的索引key_len — 索引字段的长度ref— 列与索引的比较rows — 大概估算的行数filtered — 按表条件过滤的行百分比Extra — 执行情况的描述和说明其中最重要的就是 type 字段,type 值类型如下all — 扫描全表数据index — 遍历索引range — 索引范围查找index_subquery — 在子查询中使用 refuniquesubquery — 在子查询中使用 eqrefrefornull — 对 null 进行索引的优化的 reffulltext — 使用全文索引ref — 使用非唯一索引查找数据eq_ref — 在 join 查询中使用主键或唯一索引关联const — 将一个主键放置到 where 后面作为条件查询, MySQL 优化器就能把这次查询优化转化为一个常量,如何转化以及何时转化,这个取决于优化器,这个比 eq_ref 效率高一点