首页 > 数据库 >Mysql高级篇(中)—— 索引优化

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

时间:2024-09-15 10:52:30浏览次数:3  
标签:场景 name WHERE 查询 索引 Mysql 优化 id

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

一、索引分析案例

使用 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

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

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

三、索引优化

文字版

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

示例版

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

标签:场景,name,WHERE,查询,索引,Mysql,优化,id
From: https://blog.csdn.net/weixin_44666786/article/details/142028622

相关文章

  • 亚马逊、Shopee如何通过自养号测评优化排名打造爆款商品
    亚马逊作为全球领先的跨境电商平台,每年吸引着大量新商家入驻。对于新入驻的卖家而言,在激烈的市场竞争中脱颖而出,有效提升流量并转化为订单,是亟待解决的关键问题。以下是一些实用的策略和建议:一、如何增加亚马逊新店的流量?1.精准关键词优化:深入研究市场和竞争对手,筛选出与产......
  • Can't connect to local MySQL server through socket
    mysql-urootERROR2002(HY000):Can'tconnecttolocalMySQLserverthroughsocket'/tmp/mysql.sock'(2)这是mysql登录时找不到套接字的问题。首先需要明白的是,Linux端的mysqlserver启动时会开启一个socket,Linux上的MySQL的客户端在不使用IP连接时mysqlserver时,默认......
  • 【67种改进策略】优化算法改进再也不用担心了-matlab代码
    仅需一行代码,学会从入门到创新改进所有群智能优化算法   目录  引言一.佳点集初始化二.21种混沌初始化三.21种混沌参数化四.13种变异策略五.10种飞行/分布函数六.单纯形Nelder‑Mead单纯形法(Nelder‑Meadsimplex)Matlab代码下载点击链接跳转:引言根据“......
  • 优化批处理流程:自定义BatchProcessorUtils的设计与应用
    优化批处理流程:自定义BatchProcessorUtils的设计与应用| 原创作者/编辑:凯哥Java                    | 分类:个人小工具类在我们开发过程中,处理大量的数据集是一项常见的任务。特别是在数据库操作、文件处理或者任何需要对大量数据进行分......
  • Python Web 开发中的性能优化策略(一)
    PythonWeb开发中的性能优化策略(一)......
  • Python Web 开发中的性能优化策略(二)
    PythonWeb开发中的性能优化策略(二)......
  • python+django+mysql 教师培训反馈系统05141-计算机毕业设计项目选题推荐(赠源码)
       目   录摘  要Abstract第1章  前  言1.1 研究背景1.2 研究现状1.3 系统开发目标第2章  系统开发环境62.1HTTP协议62.2HTML网页技术62.3B/S结构62.4django脚本语言72.5MySQL数据库72.6Apache简介8第3章  需求分析......
  • (赠源码)java+Springboot+mysql全省中小学师生共建习题交流与指导平台031619-计算机毕业
    摘 要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于全省中小学师生共建习题交流与指导平台当然也不能排除在外,随着网络技术的不断成熟,带动了全省中小学师生共建习题交流与指导平台,它彻底改变了过去传统的管理方式,不仅使服务管理......
  • InnoDB索引与底层原理
    InnoDB索引与底层原理索引介绍索引:一颗B+树,除了叶子节点外,其余的节点都作为目录项,且都是有序排列的在目录项page里面,一条记录对应着下层的一个page一条记录至少有两个列:列1作为主键记录该page最小的主键值;列2记录该page的页号在叶子节点才真正地存放数据聚簇索引:以......
  • MySQL 慢查询日志:解锁数据库性能优化的关键
    在MySQL数据库的使用过程中,性能优化是一个持续的挑战。而慢查询日志就是我们手中的一把利器,能够帮助我们发现和解决性能瓶颈。那么,MySQL中的慢查询日志究竟是什么呢?又该如何使用它来优化性能呢?让我们一起来深入了解。一、慢查询日志的定义与作用慢查询日志是MySQL数据库用来......