这里写自定义目录标题
一、MySQL SQL的执行基本流程
二、导致慢SQL原因总结
1、SQL语句问题
(1)SQL没有加索引或索引失效
(2)limit分页太深
(3)join、子查询、in太多
(4)查询了很多无用的字段
(5)查询使用了临时表
(6)锁竞争问题
2、数据库连接问题
(1)原因
连接数过小
(2)产生原理
MySQL的连接管理模块作用是管理客户端和MySQL之间的长连接,如果两者之间只有一个长连接。如果在并发执行SQL的情况下产生阻塞,只能等待上一个SQL执行完成。
(3)解决方案
在应用端使用连接池。在MySQL端默认连接数为100,最大连接数为16384。可以通过一下命令修改MySQL的最大连接数:
set global max_connections = 500
3、数据库配置不合理问题
(1)Buffer Pool太小
InnoDB里有一层内存Buffer Pool,会缓存内存数据加速查询,通过如下命令设置Buffer Pool大小:
set global innodb_buffer_pool_size=
(2)如何确认是不是Buffer Pool太小导致的
通过show status like 'innodb_buffer_pool_%'查询Buffer Pool的缓存命中率,buffer pool命中率 = 1 - (Innodb_buffer_pool_reads / Innodb_buffer_pool_read_requests) * 100%
- Innodb_buffer_pool_reads:表示从物理磁盘中读数据的次数。
- Innodb_buffer_pool_read_requests:表示读请求的次数。
一般情况下命中率都在99%以上。
4、系统资源问题
需要检查服务器性能有没有存在瓶颈,如果服务器资源使用率比较高例如:CPU、硬盘,这些会导致访问变慢。
4、网络问题
5、数据库数据量太大问题
需要考虑分库分表
三、如何排查慢SQL
1、show processlist;
通过该命令可以实时查看SQL的执行时长
2、开启慢查询日志
通过show variables like '%query%'查看query相关的配置:
- long_query_time: 用于设置慢查询记录的阈值,单位秒,默认值为10。
- show_query_log: 是否启用慢查询日志记录,默认为OFF。
- slow_query_log_file: 配置慢查询日志信息记录路径。
通过如下命令启用慢查询:
set global slow_query_log = ON;
四、参考
- https://www.bilibili.com/video/BV1s1steVEkR/?spm_id_from=333.1007.tianma.1-1-1.click&vd_source=cd03889ff27e1a185b3e97e3ed96d260