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.堆排序: 三.交换排…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...