数据库往往会成为应用的最终瓶颈,而Mysql是被使用得最多的开源关系型数据库。如何分析执行Mysql数据库语句的性能就非常重要。但是很多开发人员并没有相关的意识与能力,但其实掌握了一些简单的常用手段,就可以让我们自己分析出数据库语句的问题。曾经看到过有对数据库查询语句中出现7个Select的语句,当时完全被震惊到了,这根本就是往系统里注入了一个大雷呀,数据量一旦增多,数据库挂,应用挂,服务挂,客户挂,公司挂。。。。还是不做破了一个鸡蛋就想着毁了一个养鸡场的推断了。我们收集下常见的数据库的分析手段。

  1. 查看当前数据库执行命令
    1
    2
    mysql> select count(*) from information_schema.processlist where COMMAND != 'Sleep';
    mysql> select * from information_schema.processlist where COMMAND != 'Sleep' limit 5;
  2. 慢查询
    查看慢查询时间定义
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mysql> show variables like "long%";
    +-----------------+----------+
    | Variable_name | Value |
    +-----------------+----------+
    | long_query_time | 10 |
    +-----------------+----------+
    1 row in set (0.00 sec)

    mysql> set long_query_time=1;
    Query OK, 0 rows affected (0.00 sec)
    开启“慢查询”记录功能
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    mysql> show variables like "slow%";
    +---------------------+------------------------------------+
    | Variable_name | Value |
    +---------------------+------------------------------------+
    | slow_launch_time | 2 |
    | slow_query_log | OFF |
    | slow_query_log_file | /opt/mysql/data/localhost-slow.log |
    +---------------------+------------------------------------+
    3 rows in set (0.00 sec)

    mysql> set global slow_query_log=ON;
    Query OK, 0 rows affected (0.01 sec)
    设置慢日志导出方式为Table或者File
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    mysql> show variables like "log_output";
    +---------------------+------------------------------------+
    | Variable_name | Value |
    +---------------------+------------------------------------+
    | log_output | FILE |
    +---------------------+------------------------------------+
    3 rows in set (0.00 sec)

    mysql> set global log_output=TABLE
    Query OK, 0 rows affected (0.01 sec)
  3. explain输出执行计划对sql进行分析
    1
    mysql> explain select uid from user where mo=132342342 limit 0,1;
    出现以下结果就需要优化了:
  • 出现了Using temporary;
  • rows过多,或者几乎是全表的记录数;
  • key 是 (NULL);
  • possible_keys 出现过多(待选)索引。
  1. soar小米SQL分析工具
    SOAR(SQL Optimizer And Rewriter)是一个对SQL进行优化和改写的自动化工具。 由小米人工智能与云平台的数据库团队开发与维护。

  1. 查看是否有锁表
    1
    mysql> show engine innodb status;