【MySQL10】进阶篇 | 索引_#2性能优化
前言SQL 优化重心优先优化查询语句调优排查流程查看 SQL 执行频次 → 开启慢查询日志捕获慢 SQL → profile 定位耗时阶段 →explain分析执行计划最后针对性建立索引、改写 SQL。一、查看 SQL 各类语句执行频率可以判断数据库业务压力是以查询、新增、更新还是删除为主查询占比高就重点做查询优化语法sql-- session 当前会话级别global 全局服务器级别 SHOW GLOBAL STATUS LIKE Com_____;Com_select查询次数Com_insert插入次数Com_update更新次数Com_delete删除次数根据返回数值判断业务模型查询请求居多 → 重心优化 select、建立合适索引增删改频繁 → 考虑索引不宜过多、事务优化、分表二、慢查询日志抓取执行超时的 SQL作用记录执行耗时超过阈值的 SQL用来自动捕获线上慢 SQL。MySQL 默认关闭慢查询日志默认超时阈值为 10s1. 查看慢日志开启状态sqlshow variables like slow_query_log;2. 修改 my.cnf 配置Linux 路径/etc/my.cnfini# 开启慢查询日志 1开启 0关闭 slow_query_log 1 # 慢SQL触发阈值单位秒超过2秒就记录 long_query_time 2配置完成重启 MySQL 服务生效之后所有耗时2s 的 SQL 都会写入慢日志文件。三、profiling 精准定位 SQL 耗时分布当 SQL 逻辑简单但是查询耗时很长使用 profile 查看时间消耗在哪一步1. 检查数据库是否支持 profilesqlSELECT have_profiling;2. 开启会话分析sqlset profiling 1;3. 执行业务 SQLsqlselect count(*) from tb_sku;4. 查看所有已执行 SQL 的耗时列表sqlshow profiles;5. 查看指定 Query 详细阶段耗时填入 query_idsqlshow profile for query 16;可以看清初始化、索引查找、拷贝数据、排序等每一步耗时。四、explain /desc 执行计划SQL 优化最核心工具explain用来解析 select 执行方案查看表连接顺序、索引命中、扫描行数找到索引失效、全表扫描问题使用语法sqlEXPLAIN SELECT 字段列表 FROM 表名 WHERE 查询条件; --简写 desc select *from tb_user where id 1;explain 返回字段详解1. idselect 查询序列号代表多表 / 子查询的执行顺序id 值不同数值越大优先执行id 值相同从上往下顺序执行示例三表联查sqlexplain select s.*, c.* from student s, course c, student_course sc where s.id sc.studentid and c.id sc.courseid;子查询案例查询选修 MySQL 课程的学生sqlexplain select *from student s where s.id in ( select studentid from student_course sc where sc.courseid ( select id from course c where c.name MySQL ) );2. select_type查询类型区分普通查询、子查询、关联查询3. type最关键连接匹配类型性能从优到劣排序NULL system const eq_ref ref range index allall全表扫描需要优先优化4. possible_key本次查询理论上可以用到的候选索引多个索引都会列出5. key查询实际命中、真正使用到的索引null 代表索引失效、全表扫描6. key_len索引使用到的字节长度可以判断复合索引命中了几个字段7. rowsInnoDB 预估需要扫描读取的数据行数数值越小越好8. filtered返回有效数据行数 / 扫描读取行数 的百分比数值越高代表扫描后无效数据越少查询效率越好五、整体 SQL 优化排查流程总结show global status判断业务读写比例开启慢查询日志捕获超时慢 SQLprofiling 定位 SQL 内部耗时瓶颈explain 分析执行计划观察 type、key、rows根据执行计划新建索引、优化复合索引顺序、改写子查询、避免索引失效语法