MySQL索引详解(下)(SQL性能分析,索引使用)

索引是MySQL性能优化的核心,但如何精准分析查询瓶颈、合理设计索引,是开发者必须掌握的技能。本文结合实战案例,系统讲解SQL性能分析工具链索引使用技巧,帮助读者构建高性能数据库系统。

一、SQL性能分析:从宏观到微观的优化路径

1. 执行频次统计

通过SHOW STATUS命令监控高频操作,定位性能瓶颈:

SHOW STATUS LIKE 'Com_select'; -- 查询次数 
SHOW STATUS LIKE 'Handler_read_rnd_next'; -- 全表扫描次数
  • 核心指标
    • Slow_queries:慢查询次数,反映复杂查询问题。
    • Innodb_rows_read:数据读取量,判断索引有效性 。
2. 慢查询日志:精准定位低效SQL
  • 开启日志
    SET GLOBAL slow_query_log = 'ON'; 
    SET GLOBAL long_query_time = 2; -- 阈值设为2秒
  • 分析日志: 日志中记录执行时间超限的SQL,例如:
    SELECT * FROM orders WHERE user_id=12345 AND create_time > '2024-01-01';
    通过日志可发现全表扫描或未使用索引的查询 。
3. PROFILE分析:逐阶段耗时拆解
  • 启用与使用
    SET PROFILING = 1; 
    SELECT * FROM users WHERE age > 30; 
    SHOW PROFILE FOR QUERY 1; -- 查看各阶段耗时
  • 关键阶段
    • Sending data:数据传输耗时(可能与全表扫描相关)。
    • Sorting result:排序耗时(需优化索引) 。
4. EXPLAIN工具:执行计划深度解析

分析SQL执行计划的核心字段:

  • type:扫描类型(性能排序:const > ref > range > index > all)。
  • key_len:索引长度,数值类型效率高于字符串。
  • Extra
    • Using filesort:需优化排序字段索引。
    • Using temporary:使用临时表(常见于复杂GROUP BY) 。

二、索引使用技巧:从设计到失效场景

1. 联合索引与最左前缀原则
  • 设计原则
    • 高频查询字段靠左(如(user_id, create_time))。
    • 范围查询字段放右侧(避免中断索引使用) 。
  • 案例
    CREATE INDEX idx_user_time ON orders(user_id, create_time); 
    -- 有效场景:WHERE user_id=1 AND create_time > '2024-01-01' 
    -- 失效场景:WHERE create_time > '2024-01-01'(未命中左前缀)
2. 索引失效场景与规避
  • 常见失效原因
    • 隐式类型转换WHERE phone=13800138000(phone字段为VARCHAR)。
    • 前导模糊查询LIKE '%abc'无法命中索引。
    • OR条件未全索引:若OR中某字段无索引,全表扫描 。
  • 函数操作
    -- 失效:WHERE YEAR(create_time)=2024 
    -- 优化:对函数结果建索引或改写为范围查询
3. 覆盖索引与回表优化
  • 覆盖索引:SELECT字段全部在索引中,避免回表查询。
    -- 索引:idx_user_age_name(user_id, age, name) 
    SELECT user_id, age FROM users WHERE user_id=100; -- 无需回表
  • 回表代价:若需查询非索引字段(如address),需访问主键索引 。
4. 前缀索引:平衡空间与性能
  • 适用场景:长字符串字段(如VARCHAR(255))。
  • 设计方法
    -- 计算前缀长度 
    SELECT COUNT(DISTINCT LEFT(email,10))/COUNT(*) FROM users; 
    CREATE INDEX idx_email_prefix ON users(email(10));
    选择前缀长度时需保证区分度>90% 。
5. 单列索引 vs 联合索引
  • 单列索引:适合独立查询字段(如WHERE age=30)。
  • 联合索引
    • 优势:覆盖多条件查询及排序。
    • 劣势:占用更多存储,写操作开销增加10%-20% 。

三、实战优化案例

场景:电商订单表高频查询

SQL

SELECT order_id, amount, status FROM orders WHERE user_id=100 AND status='paid' ORDER BY create_time DESC;

优化步骤

  1. 分析执行计划:发现全表扫描(type=all)。
  2. 创建联合索引
    ALTER TABLE orders ADD INDEX idx_user_status_time(user_id, status, create_time);
  3. 验证效果
    • type=refkey_len缩短,避免filesort 。
       

四、工具推荐与总结

  • 性能分析工具
    • pt-index-usage:分析慢查询日志中的索引使用。
    • SHOW STATUS:监控索引命中率。
  • 设计原则总结
    • 必要性:只为高频查询建索引。
    • 选择性:高区分度字段优先。
    • 简洁性:数值类型优于字符串,前缀索引优化空间 。

通过精准的性能分析与科学的索引设计,可显著提升查询效率。建议结合业务场景动态调整,定期使用OPTIMIZE TABLE维护索引碎片,实现数据库性能的长期稳定。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/79463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

招行数字金融挑战赛数据赛道赛题一

赛题描述:根据提供的用户行为数据,选手需要分析用户行为特征与广告内容的匹配关系,准确预测用户对测试集广告的点击情况,通过AUC计算得分。 得分0.6120,排名60。 尝试了很多模型都没有能够提升效果,好奇大…

ORB-SLAM3和VINS-MONO的对比

直接给总结,整体上orbslam3(仅考虑带imu)在初始化阶段是松耦合,localmap和全局地图优化是紧耦合。而vins mono则是全程紧耦合。然后两者最大的区别就在于vins mono其实没有对地图点进行优化,为了轻量化,它一…

安装typescript时,npm install -g typescript报错

删除C:\Users\用户\下的.npmrc文件,如果你的没有,看是不是因为将隐藏的项目勾选上了,然后去掉勾选。 重新输入

[GESP202503 四级] 二阶矩阵c++

题目描述 小 A 有一个 n 行 m 列的矩阵 A。 小 A 认为一个 22 的矩阵 D 是好的,当且仅当 。其中 表示矩阵 D 的第 i 行第 j 列的元素。 小 A 想知道 A 中有多少个好的子矩阵。 输入 第一行,两个正整数 n,m。 接下来 n 行,每行 m 个整数…

基于flask+pandas+csv的报表实现

基于大模型根据提示词去写SQL执行SQL返回结果输出报表技术上可行的,但为啥还要基于pandas去实现呢? 原因有以下几点: 1、大模型无法满足实时性输出报表的需求; 2、使用大模型比较适合数据量比较大的场景,大模型主要…

Java学习笔记(对象)

一、对象本质 状态(State):通过成员变量(Field)描述 行为(Behavior):通过成员方法(Method)实现 class Person {String name;int age;void eat() {System.o…

Qt学习Day0:Qt简介

0. 关于Qt Qt是C的实践课,之前在C中学习的语法可以有具体的应用场景。Qt的代码量很大,不要死记硬背,学会查询文档的能力更加重要。 建议提升一下相关单词的储备量: 1. Qt是什么? Qt是一个基于C语言的图形用户界面&a…

React知识框架

一、核心概念 1. 组件化开发 核心思想:将 UI 拆分为独立、可复用的组件(函数组件/类组件)。组件特性:props(接收参数)、state(组件状态)、生命周期(类组件特有&#xf…

Django之账号登录及权限管理

账号登录及权限管理 目录 1.登录功能 2.退出登录 3.权限管理 4.代码展示合集 这篇文章, 会讲到如何实现账号登录。账号就是我们上一篇文章写的账号管理功能, 就使用那里面已经创建好的账号。这一次登录, 我们分为三种角色, 分别是员工, 领导, 管理员。不同的角色, 登录进去…

[学习]RTKLib详解:convkml.c、convrnx.c与geoid.c

本文是 RTKLlib详解 系列文章的一篇,目前该系列文章还在持续总结写作中,以发表的如下,有兴趣的可以翻阅。 [学习] RTKlib详解:功能、工具与源码结构解析 [学习]RTKLib详解:pntpos.c与postpos.c [学习]RTKLib详解&…

java 破解aspose.words 18.6 使用

资源包&#xff1a;https://download.csdn.net/download/qq_36598111/90787167 jar包是破解过的&#xff0c;直接可以使用。 引入jar&#xff0c;要引入本地的&#xff0c;不要直接引入仓库的 <dependency><groupId>com.aspose</groupId><artifactId>…

vue使用rules实现表单校验——校验用户名和密码

编写校验规则 常规校验 const rules {username: [{ required: true, message: 请输入用户名, trigger: blur },{ min: 5, max: 16, message: 长度在 5 到 16 个字符, trigger: blur }],password: [{ required: true, message: 请输入密码, trigger: blur },{ min: 5, max: 1…

宝塔服务安装使用的保姆级教程

宝塔介绍&#xff1a; 宝塔面板&#xff08;BT Panel&#xff09; 是一款 国产的服务器运维管理面板&#xff0c;主要用于简化 Linux/Windows 服务器的网站、数据库、FTP、防火墙等管理操作。它通过图形化界面&#xff08;Web端&#xff09;和命令行工具&#xff08;bt 命令&a…

数字化转型-4A架构之数据架构

4A架构系列文章 数字化转型-4A架构&#xff08;业务架构、应用架构、数据架构、技术架构&#xff09; 数字化转型-4A架构之业务架构 数字化转型-4A架构之应用架构 数字化转型-4A架构之数据架构 数字化转型-4A架构之技术架构 数据架构 Data Architecture&#xff08;DA&…

每日脚本 5.11 - 进制转换和ascii字符

前置知识 python中各个进制的开头 二进制 &#xff1a; 0b 八进制 &#xff1a; 0o 十六进制 : 0x 进制转换函数 &#xff1a; bin() 转为2进制 oct() 转换为八进制的函数 hex() 转换为16进制的函数 ascii码和字符之间的转换 &#xff1a; chr(97) 码转为字符 …

Vulnhub Lazysysadmin靶机攻击实战(一)

导语   靶机下载地址 https://download.vulnhub.com/lazysysadmin/Lazysysadmin.zip   靶机信息地址 https://www.vulnhub.com/entry/lazysysadmin-1,205/ 文章目录 信息收集扫描路径提权其他思路探索其他方式找密码总结下载安装好靶机之后启动虚拟机如下所示。 信息收集 我…

【DB2】DB2启动失败报错SQL1042C

在本地某次启动db2时报错SQL1042C&#xff0c;具体报错如下 [db2inst1standby ~]$ db2start 05/07/2025 16:32:53 0 0 SQL1042C An unexpected system error occurred. SQL1032N No start database manager command was issued. SQLSTATE57019在网上百度到说是需要…

Python中的re库详细用法与代码解析

目录 1. 前言 2. 正则表达式的基本概念 2.1 什么是正则表达式&#xff1f; 2.2 常用元字符 3. re库的适应场景 3.1 验证用户输入 3.2 从文本中提取信息 3.3 文本替换与格式化 3.4 分割复杂字符串 3.5 数据清洗与预处理 4. re库的核心功能详解 4.1 re.match()&#…

蓝桥杯2025年第十六届省赛真题-水质检测

C语言代码&#xff1a; #include <stdio.h> #include <string.h>#define MAX_LEN 1000000int main() {char a[MAX_LEN 1], b[MAX_LEN 1];// 使用 scanf 读取字符数组scanf("%s", a);scanf("%s", b);int ans 0;int pre -1;int state -1;i…

65.Three.js案例-使用 MeshNormalMaterial 和 MeshDepthMaterial 创建 3D 图形

65.Three.js案例-使用 MeshNormalMaterial 和 MeshDepthMaterial 创建 3D 图形 实现效果 在该案例中&#xff0c;Three.js 被用来创建一个包含多个 3D 对象的场景。其中包括&#xff1a; 圆环结&#xff08;TorusKnot&#xff09;立方体&#xff08;Box&#xff09;球体&…