1. 使用工具?
运维工具:skywalking,可以监测出哪个接口,然后找到对应的sql。
2. 在调试阶段使用mysql配置?
- 确保慢查询日志功能已经开启。
- 设置慢查询阈值(可选)。
- 分析慢查询日志。
在调试阶段中使用,是因为如果在生成中开启慢查询功能,会影响数据库的性能。
步骤1和2可以通过修改MySQL配置文件my.cnf(或my.ini在Windows上)来完成。
在my.cnf中添加或修改以下配置项:
[mysqld]
#为1开启慢查询日志
slow_query_log = 1
#指定慢查询日志文件路径
slow_query_log_file = /var/log/mysql/mysql-slow.log
#设置慢查询的阈值为2秒,超过2秒就回被记录在文件里
long_query_time = 2
步骤3通常涉及到分析慢查询日志文件。你可以使用MySQL提供的mysqldumpslow命令行工具来帮助你分析。
例如,要列出执行时间超过5秒的查询并按照执行的次数排序:
mysqldumpslow -s c -t 5 /var/log/mysql/mysql-slow.log
3. 优化
3.1 可能原因:
- 聚合查询
- 多表查询
- 表数据量过大查询
- 深度分页查询
3.2 分析:
命令:
explain select * from 表名 where 条件
explain select * from users where username = 'nacos';
举例:
type:sql连接的类型,性能有好到差 NULL、system、const、eq_ref、ref、range、index、all
- system:查询系统中的表
- const:根据主键查询
- eq_ref:主键索引查询或唯一主键查询
- ref:索引查询
- range:范围查询
- index:索引树扫描
- all:全表扫描
3.3 分析结果
- 通过possible_key和key检查是否命中了索引(索引本身是否存在失效的问题)
- 通过type字段,查看sql是否还有优化的空间(是否存在全索引扫码或全盘扫码的问题)
- 通过exira建议,是否出现了回表等情况,如果出现了,则通过添加索引或修改字段来解决