数据库往往会成为应用的最终瓶颈,而Mysql是被使用得最多的开源关系型数据库。如何分析执行Mysql数据库语句的性能就非常重要。但是很多开发人员并没有相关的意识与能力,但其实掌握了一些简单的常用手段,就可以让我们自己分析出数据库语句的问题。曾经看到过有对数据库查询语句中出现7个Select的语句,当时完全被震惊到了,这根本就是往系统里注入了一个大雷呀,数据量一旦增多,数据库挂,应用挂,服务挂,客户挂,公司挂。。。。还是不做破了一个鸡蛋就想着毁了一个养鸡场的推断了。我们收集下常见的数据库的分析手段。
- 查看当前数据库执行命令
mysql> select count(*) from information_schema.processlist where COMMAND != 'Sleep';
mysql> select * from information_schema.processlist where COMMAND != 'Sleep' limit 5;
- 慢查询
查看慢查询时间定义
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)
开启“慢查询”记录功能
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
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)
- explain输出执行计划对sql进行分析
mysql> explain select uid from user where mo=132342342 limit 0,1;
出现以下结果就需要优化了:
- 出现了Using temporary;
- rows过多,或者几乎是全表的记录数;
- key 是 (NULL);
- possible_keys 出现过多(待选)索引。
-
soar小米SQL分析工具
SOAR(SQL Optimizer And Rewriter)是一个对SQL进行优化和改写的自动化工具。 由小米人工智能与云平台的数据库团队开发与维护。
- 查看是否有锁表
mysql> show engine innodb status;