当前位置: 首页 > 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

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

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

三、索引优化

文字版

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

示例版

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

相关文章:

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

Mysql高级篇&#xff08;中&#xff09;—— 索引优化 一、索引分析案例案例 1&#xff1a;单表查询案例 2&#xff1a;两表连接查询案例 3&#xff1a;三表连接查询 二、避免索引失效常见索引失效场景简述场景 1场景 2场景 3场景 4场景 5场景 6 三、索引优化文字版示例版 一、…...

electron: 将网址打包成exe桌面应用

项目场景&#xff1a; 在项目开发的过程中&#xff0c;需要将应用搭建在不同的硬件上。如需要在一个触屏显示器上展示企业相关的应用。 如果专门去开发一个这样的应用&#xff0c;不划算&#xff1b;这时候考虑将网址打包成exe应用&#xff0c;并安装触屏器上&#xff0c;就可…...

【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)

文章目录 PyQt5超详细教程前言第7部分&#xff1a;生成图表与数据可视化7.1 matplotlib 与 PyQt5 的结合7.2 在 PyQt5 中嵌入 matplotlib 图表示例 1&#xff1a;嵌入简单的 matplotlib 图表代码详解&#xff1a; 7.3 动态生成图表示例 2&#xff1a;动态更新图表代码详解&…...

2024/9/10 小型PLC典型应用1:含步进电机+变频器+触摸屏

主要是讲脉冲控制步进&#xff0c;因为etherCat是标准化的&#xff0c;直接通过轴控指令即可控制&#xff1b;canopen也涉及轴控指令&#xff0c;但配置稍微有点不一样。 控制本体端口的步进&#xff0c;通过发脉冲或者脉冲定位信号。 但这个4PM只有单独的轴控指令&#xff0c;…...

RGB与CMYK互转

先定义一个CMYK数据结构&#xff1a; typedef struct struCMYK {int m_nC;int m_nM;int m_nY;int m_nK; }CMYK;RGB转CMYK void CvtRGB2CMYK(COLORREF& clr, CMYK& cmyk) {double dR GetBValue(clr) / 255.0;double dG GetGValue(clr) / 255.0;double dB GetRValue…...

滴~“TOP期刊体验卡”已到期!公认水刊的尽头,还得是你MDPI

【SciencePub学术】本期&#xff0c;给大家介绍的是1本MDPI旗下的计算机类SCI——《Remote Sensing》。 优点VS缺点 • 期刊分区一直维持在较高水平 • 审稿速度极快&#xff0c;1-2个月录用见刊 • 年刊文量大&#xff0c;收稿多 • 期刊自引率较高 • 期刊系统初筛较难 • …...

ASUS华硕ROG幻16 Air 2024款锐龙AI版GA605WI,GA605WV工厂模式原厂Win11系统,含MyASUS WinRE恢复重置还原功能

适用型号&#xff1a;【GA605WI、GA605WV】&#xff0c;原装出厂Windows11系统工厂包下载 链接&#xff1a;https://pan.baidu.com/s/1IVolLwB7fddGKZY0IxOqaA?pwd62e2 提取码&#xff1a;62e2 华硕原装系统工厂安装包&#xff0c;带有MyASUS WinRE RECOVERY恢复功能、自带…...

想入行在线教育?你必须知道的十件事

在最近几年受新冠疫情和异常天气的影响&#xff0c;越来越多的教育活动被迫转移到线上。然而&#xff0c;在线课程的短板也很明显&#xff0c;大部分在线教育工作者难以有效地引导学生集中注意力&#xff0c;并且无法像线下授课一样进行同步考试。 那么&#xff0c;有什么办法…...

EasyExcel相关整理

一、实体类常用注解 1、字段注解ExcelProperty&#xff0c;一般常用value标明表头&#xff0c;index标明列 2、实体类注解&#xff08;导出样式设置&#xff09; 3、导出特殊类型转换 二、导出 1、导出多个sheet 2、导出数据量大导致内存溢出 三、导入 待更新...

2024年【汽车驾驶员(技师)】考试题及汽车驾驶员(技师)找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 汽车驾驶员&#xff08;技师&#xff09;考试题根据新汽车驾驶员&#xff08;技师&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将汽车驾驶员&#xff08;技师&#xff09;模拟考试试题进行汇编&#…...

[C#学习笔记]接口的特性与用法

视频地址&#xff1a;一期视频看透C#接口的全部特性及用法_哔哩哔哩_bilibili 强烈推荐学习C#和WPF的朋友关注此UP&#xff0c;知识点巨多&#xff0c;讲解透彻&#xff01; 一、总览 public interface IOverall {/// <summary>/// 最普通的方法/// </summary>v…...

java发送邮件报错,Could not connect to SMTP host: smtp.exmail.qq.com, port: 465

发现问题 我使用的 docker 运行的 jdk 环境&#xff0c;服务调用发送邮件报错 javax.mail.MessagingException: Could not connect to SMTP host: smtp.exmail.qq.com, port: 465;nested exception is:javax.net.ssl.SSLHandshakeException: No appropriate protocol (protoc…...

开放式耳机有哪些好处?性价比排行前十的四款蓝牙耳机推荐

开放式耳机有以下好处&#xff1a; 佩戴舒适&#xff1a;开放式耳机不入耳&#xff0c;不堵塞耳道&#xff0c;长时间佩戴耳朵不易感到闷热和疼痛&#xff0c;相比传统入耳式耳机&#xff0c;能减少对耳道的压迫感和摩擦&#xff0c;让耳朵更舒适。 更健康卫生&#xff1a;不入…...

FreeRTOS(速记版)

第一章 初识 FreeRTOS 1.1 FreeRTOS简介 FreeRTOS 采用了 MIT 开源许可&#xff0c;这允许将 FreeRTOS 操作系统用于商业应用&#xff0c;并且不需要公开源代码。此外&#xff0c;FreeRTOS 还衍生出了另外两个操作系统&#xff1a;OpenRTOS 和 SafeRTOS&#xff0c;其中 OpenR…...

解锁中东市场新蓝海:Bigo社交媒体如何赋能APP广告营销优势

解锁中东市场新蓝海&#xff1a;Bigo社交媒体如何赋能APP广告营销优势 在全球数字化浪潮的推动下&#xff0c;中东地区以其独特的文化背景、高速的经济增长以及庞大的年轻消费群体&#xff0c;成为了众多品牌与APP开发者竞相争夺的市场高地。作为该地区颇具影响力的社交媒体平…...

【网络】DNS

definition DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;服务器是互联网上的重要基础设施之一&#xff0c;它的主要作用是将人们易于记忆的域名&#xff08;如www.example.com&#xff09;转换成计算机可以直接识别的IP地址&#xff08;如192.0.2.1&am…...

如何使用ChatGPT,完成学术论文文献综述的编写?

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术研究中&#xff0c;文献综述是了解研究现状、辨识研究空白并为自己的研究奠定理论基础的关键环节。ChatGPT 可以在文献综述的编写过程中提供有效的支持&#xff0c;从文献搜集、批…...

探索GPU算力在大模型和高性能计算中的无限潜能

在当今科技领域&#xff0c;大模型和高性能计算正以惊人的速度发展。大模型如语言模型、图像识别模型等&#xff0c;规模越来越大&#xff0c;精度越来越高&#xff0c;能够处理复杂的任务和生成逼真的结果。高性能计算则凭借强大的计算能力&#xff0c;推动着科学研究、工程设…...

【信创】统信UOS图形界面登录闪退的解决方法

原文链接&#xff1a;【信创】统信UOS图形界面登录闪退的解决方法 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于统信UOS 1070桌面操作系统中&#xff0c;图形界面登录时出现闪退或输入正确的用户名和密码后又跳转回登录界面问题的解决方法的文章。这种问题可能…...

排序(插入,希尔,选择,堆,冒泡,快速,归并,计数)

本文中的Swap()函数都是下面这段代码 // 交换 void Swap(int* p1, int* p2) {int tmp *p1;*p1 *p2;*p2 tmp; }文章目录 常见排序&#xff1a;一.插入排序1.直接插入排序&#xff1a;2.希尔排序&#xff1a; 二.选择排序1.选择排序&#xff1a;2.堆排序&#xff1a; 三.交换排…...

【recast-navigation/源码解析】findStraightPath详解以及寻路结果贴边优化

说在前面 recast-navigation版本&#xff1a;1.6.0 叉积cross product 正常来讲&#xff0c;叉乘为&#xff1a; ∣ A ⃗ B ⃗ ∣ ∣ x A y A x B y B ∣ x A ⋅ y B − x B ⋅ y A |\vec{A} \times \vec{B}|\begin{vmatrix} x_A & y_A \\ x_B & y_B \end{vmatrix…...

‌移动管家手机智能控制汽车系统

‌ 手机可以通过下载特定的应用程序来控制汽车系统&#xff0c;实现远程启动、锁/解锁车门、调节车内温度等功能。‌ ‌ 手机智能控制汽车系统主要通过下载并安装特定的APP来实现。‌ 首先&#xff0c;用户需要确定自己的手机系统是安卓还是苹果版&#xff0c;然后前往应用…...

828华为云征文|华为云Flexus X实例Redis性能加速评测及对比

目录 前言 一、华为云Flexus X加速Redis购买 1.1 Flexus X实例购买 1.2 Redis加速镜像选择 1.3 重置密码 1.4 登录Flexus X实例 1.5 Flexus X实例Redis验证 二、Redis测评工具介绍 三、华为云Flexus X实例加速Redis测评 3.1 string类型 3.2 hash类型 3.3 list类型 3.4 set类型 …...

【OpenCV3】图像的翻转、图像的旋转、仿射变换之图像平移、仿射变换之获取变换矩阵、透视变换

1 图像的放大与缩小 2 图像的翻转 3 图像的旋转 4 仿射变换之图像平移 5 仿射变换之获取变换矩阵 6 透视变换 1 图像的放大与缩小 resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) src: 要缩放的图片dsize: 缩放之后的图片大小, 元组和列表表示均可.dst: 可选参数, 缩…...

不要认为996是开玩笑

996 预防针 随着秋招进程的不断推进&#xff0c;有部分同学已经 OC&#xff0c;有部分同学还在苦苦挣扎&#xff0c;并不断降低自己的预期&#xff0c;包括在和 HR 沟通过程中&#xff0c;主动说出自己愿意接受加班&#xff0c;愿意接受 996&#xff0c;以此来博得企业方面的加…...

精益工程师资格证书:2024年CLMP报名指南

随着全球对精益管理的需求日益增长&#xff0c;精益管理专业人士资格认证&#xff08;CLMP&#xff09;正成为越来越多精益工程师和精益管理人员提升职业竞争力的首选。作为一种注重管理而非生产的认证&#xff0c;CLMP不仅适用于制造业的专业人士&#xff0c;也吸引了各行业的…...

【Unity基础】如何选择脚本编译方式Mono和IL2CPP?

Edit -> Project Settings -> Player 在 Unity 中&#xff0c;Scripting Backend 决定了项目的脚本编译方式&#xff0c;即如何将 C# 代码转换为可执行代码。Unity 提供了两种主要的 Scripting Backend 选项&#xff1a;Mono 和 IL2CPP。它们之间的区别影响了项目的性能、…...

写在OceanBase开源三周年

我收获的深刻感触get 感触1&#xff1a;解决问题才有生存价值 [产品力] 感触2&#xff1a;永无止境的“易用性” [易用性] 感触3&#xff1a;立下“双赢”的flag 感触4&#xff1a;社区建设离不开用户和开发者参与 感触5&#xff1a;从易用到用户自助 [自助能力] 当时想法很简…...

【笔记】408刷题笔记

文章目录 三对角三叉树求最小带权路径UDP报文首部和TCP报文首部IP报文首部TCP报文首部UDP报文首部 刷新和再生的区别地址译码 为了区分队空队满&#xff0c;可以使用三种处理方式 1&#xff09;牺牲一个单元 队头指针在队尾指针的下一位置作为队满的标志 队满条件&#xff1a;(…...

GitHub Star 数量前 13 的自托管项目清单

一个多月前&#xff0c;我们撰写并发布了这篇文章《终极自托管解决方案指南》。在那篇文章里我们深入探讨了云端服务与自托管方案的对比、自托管的潜在挑战、如何选择适合自托管解决方案&#xff0c;并深入介绍了五款涵盖不同场景的优秀自托管产品。 关于自托管的优势&#xf…...