当前位置: 首页 > news >正文

Mysql高级篇(中)—— 索引优化

Mysql高级篇(中)—— 索引优化

  • 一、索引分析案例
    • 案例 1:单表查询
    • 案例 2:两表连接查询
    • 案例 3:三表连接查询
  • 二、避免索引失效
    • 常见索引失效场景简述
    • 场景 1
    • 场景 2
    • 场景 3
    • 场景 4
    • 场景 5
    • 场景 6
  • 三、索引优化
    • 文字版
    • 示例版

一、索引分析案例

使用 EXPLAIN 分析 SQL 查询性能是数据库优化的重要环节。EXPLAIN 能展示查询的执行计划,帮助我们找出潜在的性能瓶颈。我们可以从 EXPLAIN 输出中的多个列(如 type、rows、Extra、key 等)来分析查询的执行情况, 常见的优化手段包括 创建单列复合索引避免全表扫描减少排序操作以及充分利用数据库索引覆盖 等。以下我将详细分析单表、两表、三表查询案例,给出性能分析和优化建议。

案例 1:单表查询

场景描述

我们有一个 employees 表,包含员工的姓名年龄部门等信息,结构如下:

CREATE TABLE employees (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100),age INT,department_id INT,hire_date DATE,salary DECIMAL(10, 2),INDEX (department_id),INDEX (age)
);

查询要求:查找年龄在 30 岁以上的某部门的所有员工。

SELECT * FROM employees WHERE department_id = 1 AND age > 30;

使用 EXPLAIN 分析该查询:

EXPLAIN SELECT * FROM employees WHERE department_id = 1 AND age > 30;

在这里插入图片描述

案例 2:两表连接查询

场景描述

我们有两个表:employeesdepartments查询要求是找到所有在 "HR" 部门的员工,并按他们的薪水降序排列

SELECT e.name, e.salary FROM employees e 
JOIN departments d ON e.department_id = d.id 
WHERE d.name = 'HR' ORDER BY e.salary DESC;

使用 EXPLAIN 分析该查询:

EXPLAIN SELECT e.name, e.salary FROM employees e 
JOIN departments d ON e.department_id = d.id 
WHERE d.name = 'HR' ORDER BY e.salary DESC;

在这里插入图片描述

案例 3:三表连接查询

场景描述

假设我们有三个表:employees、departmentprojects,查询要求是查找所有参与某个项目员工姓名薪水所属部门

SELECT e.name, e.salary, d.name FROM employees e 
JOIN departments d ON e.department_id = d.id 
JOIN projects p ON e.id = p.employee_id 
WHERE p.project_name = 'Project A';

使用 EXPLAIN 分析该查询:

EXPLAIN SELECT e.name, e.salary, d.name FROM employees e 
JOIN departments d ON e.department_id = d.id 
JOIN projects p ON e.id = p.employee_id 
WHERE p.project_name = 'Project A';

在这里插入图片描述

二、避免索引失效

索引失效 问题是指数据库中的查询操作无法正确使用已有的索引,导致查询效率大幅下降。这通常发生在 SQL 语句的编写方式表结构的设计数据的变化未能与索引策略相匹配时。以下是几种常见的索引失效原因及避免方法,结合案例来说明。

常见索引失效场景简述

序号索引失效场景
1索引列上进行(计算、函数、类型转换)等操作
2使用 !=、<> 或者 NOT IN等操作
3is null,is not null也无法使用索引
4OR 条件
5like以通配符开头(‘%abc…’)的操作
6使用复合索引时 没有遵循最佳左前缀法则

上述场景示例解析:

场景 1

当查询条件 使用了函数或表达式 时,索引会失效。 例如对于表 users,如果在 name 字段上有索引,但执行以下查询:

SELECT * FROM users WHERE UPPER(name) = 'JOHN';

由于 UPPER(name) 使用了函数,MySQL 无法利用 name 字段上的索引。要避免这种情况,可以在插入或更新数据时将数据规范化为大写或小写,或者改用不依赖函数的查询方式:

SELECT * FROM users WHERE name = 'john';  -- 假设所有 name 都存储为小写

字段和查询条件的类型不一致 时,数据库会进行 隐式类型转换 ,这也会导致索引失效。例如,id 字段是整数类型,但查询时传入的是字符串

SELECT * FROM users WHERE id = '123';  -- id 为 INT

因为 id 字段是整数类型,数据库会尝试将 '123' 转换为数字,导致索引无法使用。正确做法是确保数据类型一致:

SELECT * FROM users WHERE id = 123;




场景 2

在使用 不等操作符 (!=、<>) 或者 NOT IN 时,索引通常不会生效。例如,以下查询可能无法使用索引:

SELECT * FROM users WHERE age != 30;

要避免这种情况,可以改用其他逻辑,如将查询拆分为多个条件(在特定情况下适用):

SELECT * FROM users WHERE age < 30 OR age > 30;




场景 3

在这里插入图片描述
在这里插入图片描述





场景 4

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述





场景 5

在这里插入图片描述
在这里插入图片描述





场景 6

最左前缀法则 是数据库中针对 复合索引 使用的一个原则。它指的是:在使用复合索引时,查询条件必须按照 索引中从左到右的顺序并且不跳过索引中间的列 使用,从第一个开始,逐步向右,才能有效利用索引。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、索引优化

文字版

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

示例版

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

http://www.lryc.cn/news/435358.html

相关文章:

  • electron: 将网址打包成exe桌面应用
  • 【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
  • 2024/9/10 小型PLC典型应用1:含步进电机+变频器+触摸屏
  • RGB与CMYK互转
  • 滴~“TOP期刊体验卡”已到期!公认水刊的尽头,还得是你MDPI
  • ASUS华硕ROG幻16 Air 2024款锐龙AI版GA605WI,GA605WV工厂模式原厂Win11系统,含MyASUS WinRE恢复重置还原功能
  • 想入行在线教育?你必须知道的十件事
  • EasyExcel相关整理
  • 2024年【汽车驾驶员(技师)】考试题及汽车驾驶员(技师)找解析
  • [C#学习笔记]接口的特性与用法
  • java发送邮件报错,Could not connect to SMTP host: smtp.exmail.qq.com, port: 465
  • 开放式耳机有哪些好处?性价比排行前十的四款蓝牙耳机推荐
  • FreeRTOS(速记版)
  • 解锁中东市场新蓝海:Bigo社交媒体如何赋能APP广告营销优势
  • 【网络】DNS
  • 如何使用ChatGPT,完成学术论文文献综述的编写?
  • 探索GPU算力在大模型和高性能计算中的无限潜能
  • 【信创】统信UOS图形界面登录闪退的解决方法
  • 排序(插入,希尔,选择,堆,冒泡,快速,归并,计数)
  • 【recast-navigation/源码解析】findStraightPath详解以及寻路结果贴边优化
  • ‌移动管家手机智能控制汽车系统
  • 828华为云征文|华为云Flexus X实例Redis性能加速评测及对比
  • 【OpenCV3】图像的翻转、图像的旋转、仿射变换之图像平移、仿射变换之获取变换矩阵、透视变换
  • 不要认为996是开玩笑
  • 精益工程师资格证书:2024年CLMP报名指南
  • 【Unity基础】如何选择脚本编译方式Mono和IL2CPP?
  • 写在OceanBase开源三周年
  • 【笔记】408刷题笔记
  • GitHub Star 数量前 13 的自托管项目清单
  • js实现生成随机数值的数组