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:两表连接查询
场景描述
我们有两个表:
employees和departments。查询要求是找到所有在"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、department和projects,查询要求是查找所有参与某个项目的员工姓名、薪水和所属部门。
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等操作 |
| 3 | is null,is not null也无法使用索引 |
| 4 | OR 条件 |
| 5 | like以通配符开头(‘%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高级篇(中)—— 索引优化 一、索引分析案例案例 1:单表查询案例 2:两表连接查询案例 3:三表连接查询 二、避免索引失效常见索引失效场景简述场景 1场景 2场景 3场景 4场景 5场景 6 三、索引优化文字版示例版 一、…...
electron: 将网址打包成exe桌面应用
项目场景: 在项目开发的过程中,需要将应用搭建在不同的硬件上。如需要在一个触屏显示器上展示企业相关的应用。 如果专门去开发一个这样的应用,不划算;这时候考虑将网址打包成exe应用,并安装触屏器上,就可…...
【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)
文章目录 PyQt5超详细教程前言第7部分:生成图表与数据可视化7.1 matplotlib 与 PyQt5 的结合7.2 在 PyQt5 中嵌入 matplotlib 图表示例 1:嵌入简单的 matplotlib 图表代码详解: 7.3 动态生成图表示例 2:动态更新图表代码详解&…...
2024/9/10 小型PLC典型应用1:含步进电机+变频器+触摸屏
主要是讲脉冲控制步进,因为etherCat是标准化的,直接通过轴控指令即可控制;canopen也涉及轴控指令,但配置稍微有点不一样。 控制本体端口的步进,通过发脉冲或者脉冲定位信号。 但这个4PM只有单独的轴控指令,…...
RGB与CMYK互转
先定义一个CMYK数据结构: 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学术】本期,给大家介绍的是1本MDPI旗下的计算机类SCI——《Remote Sensing》。 优点VS缺点 • 期刊分区一直维持在较高水平 • 审稿速度极快,1-2个月录用见刊 • 年刊文量大,收稿多 • 期刊自引率较高 • 期刊系统初筛较难 • …...
ASUS华硕ROG幻16 Air 2024款锐龙AI版GA605WI,GA605WV工厂模式原厂Win11系统,含MyASUS WinRE恢复重置还原功能
适用型号:【GA605WI、GA605WV】,原装出厂Windows11系统工厂包下载 链接:https://pan.baidu.com/s/1IVolLwB7fddGKZY0IxOqaA?pwd62e2 提取码:62e2 华硕原装系统工厂安装包,带有MyASUS WinRE RECOVERY恢复功能、自带…...
想入行在线教育?你必须知道的十件事
在最近几年受新冠疫情和异常天气的影响,越来越多的教育活动被迫转移到线上。然而,在线课程的短板也很明显,大部分在线教育工作者难以有效地引导学生集中注意力,并且无法像线下授课一样进行同步考试。 那么,有什么办法…...
EasyExcel相关整理
一、实体类常用注解 1、字段注解ExcelProperty,一般常用value标明表头,index标明列 2、实体类注解(导出样式设置) 3、导出特殊类型转换 二、导出 1、导出多个sheet 2、导出数据量大导致内存溢出 三、导入 待更新...
2024年【汽车驾驶员(技师)】考试题及汽车驾驶员(技师)找解析
题库来源:安全生产模拟考试一点通公众号小程序 汽车驾驶员(技师)考试题根据新汽车驾驶员(技师)考试大纲要求,安全生产模拟考试一点通将汽车驾驶员(技师)模拟考试试题进行汇编&#…...
[C#学习笔记]接口的特性与用法
视频地址:一期视频看透C#接口的全部特性及用法_哔哩哔哩_bilibili 强烈推荐学习C#和WPF的朋友关注此UP,知识点巨多,讲解透彻! 一、总览 public interface IOverall {/// <summary>/// 最普通的方法/// </summary>v…...
java发送邮件报错,Could not connect to SMTP host: smtp.exmail.qq.com, port: 465
发现问题 我使用的 docker 运行的 jdk 环境,服务调用发送邮件报错 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…...
开放式耳机有哪些好处?性价比排行前十的四款蓝牙耳机推荐
开放式耳机有以下好处: 佩戴舒适:开放式耳机不入耳,不堵塞耳道,长时间佩戴耳朵不易感到闷热和疼痛,相比传统入耳式耳机,能减少对耳道的压迫感和摩擦,让耳朵更舒适。 更健康卫生:不入…...
FreeRTOS(速记版)
第一章 初识 FreeRTOS 1.1 FreeRTOS简介 FreeRTOS 采用了 MIT 开源许可,这允许将 FreeRTOS 操作系统用于商业应用,并且不需要公开源代码。此外,FreeRTOS 还衍生出了另外两个操作系统:OpenRTOS 和 SafeRTOS,其中 OpenR…...
解锁中东市场新蓝海:Bigo社交媒体如何赋能APP广告营销优势
解锁中东市场新蓝海:Bigo社交媒体如何赋能APP广告营销优势 在全球数字化浪潮的推动下,中东地区以其独特的文化背景、高速的经济增长以及庞大的年轻消费群体,成为了众多品牌与APP开发者竞相争夺的市场高地。作为该地区颇具影响力的社交媒体平…...
【网络】DNS
definition DNS(Domain Name System,域名系统)服务器是互联网上的重要基础设施之一,它的主要作用是将人们易于记忆的域名(如www.example.com)转换成计算机可以直接识别的IP地址(如192.0.2.1&am…...
如何使用ChatGPT,完成学术论文文献综述的编写?
学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 在学术研究中,文献综述是了解研究现状、辨识研究空白并为自己的研究奠定理论基础的关键环节。ChatGPT 可以在文献综述的编写过程中提供有效的支持,从文献搜集、批…...
探索GPU算力在大模型和高性能计算中的无限潜能
在当今科技领域,大模型和高性能计算正以惊人的速度发展。大模型如语言模型、图像识别模型等,规模越来越大,精度越来越高,能够处理复杂的任务和生成逼真的结果。高性能计算则凭借强大的计算能力,推动着科学研究、工程设…...
【信创】统信UOS图形界面登录闪退的解决方法
原文链接:【信创】统信UOS图形界面登录闪退的解决方法 Hello,大家好啊!今天给大家带来一篇关于统信UOS 1070桌面操作系统中,图形界面登录时出现闪退或输入正确的用户名和密码后又跳转回登录界面问题的解决方法的文章。这种问题可能…...
排序(插入,希尔,选择,堆,冒泡,快速,归并,计数)
本文中的Swap()函数都是下面这段代码 // 交换 void Swap(int* p1, int* p2) {int tmp *p1;*p1 *p2;*p2 tmp; }文章目录 常见排序:一.插入排序1.直接插入排序:2.希尔排序: 二.选择排序1.选择排序:2.堆排序: 三.交换排…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...
