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

【MySQL成神之路】MySQL索引相关介绍

1 相关理论介绍

一、索引基础概念

二、索引类型

1. 按数据结构分类

2. 按功能分类

三、索引数据结构原理

B+树索引特点:

哈希索引特点:

四、索引使用原则

1. 创建索引原则

2. 避免索引失效情况

五、索引优化策略

六、索引维护与管理

七、特殊索引注意事项

八、索引与存储引擎

2、代码操作示例

一、索引创建方法

1. 创建表时定义索引

 2. 在已有表上创建索引

二、索引使用方法

1. 基本查询使用索引

2. 覆盖索引查询

三、索引优化方法

1. 索引设计原则

2. 索引使用优化

3. 索引维护优化

四、综合示例


1 相关理论介绍

一、索引基础概念

索引是MySQL中用于加速查询的一种数据结构,类似于书籍的目录。它通过建立额外的数据结构来快速定位数据,避免全表扫描。索引本质上是一种有序的数据结构,MySQL主要使用B+树作为索引结构。

二、索引类型

1. 按数据结构分类

  • B+树索引:MySQL最常用的索引类型,适合范围查询和排序
  • 哈希索引:Memory引擎默认索引类型,适合等值查询但不支持范围查询
  • 全文索引:用于全文搜索,MyISAM和InnoDB都支持
  • 空间索引:用于地理空间数据,MyISAM支持

2. 按功能分类

  • 普通索引:最基本的索引类型,无特殊限制
  • 唯一索引:索引列值必须唯一但允许NULL值
  • 主键索引:特殊的唯一索引,不允许NULL值
  • 复合索引:多个列组合的索引
  • 前缀索引:对字符列前N个字符建立的索引

三、索引数据结构原理

B+树索引特点:

  1. 所有数据都存储在叶子节点,非叶子节点只存储键值
  2. 叶子节点通过指针连接形成链表,便于范围查询
  3. 树高度通常为3-4层,能支持千万级数据高效查询
  4. 查询时间复杂度为O(log n)

哈希索引特点:

  1. 基于哈希表实现,查询时间复杂度为O(1)
  2. 只支持等值查询(=, IN),不支持范围查询(>, <, BETWEEN)
  3. 不支持排序操作

四、索引使用原则

1. 创建索引原则

  • 为常用于WHERE条件的列创建索引
  • 为JOIN连接的列创建索引
  • 为ORDER BY、GROUP BY的列创建索引
  • 选择区分度高的列建立索引
  • 使用短索引,特别是对字符串列
  • 合理使用复合索引,遵循最左前缀原则

2. 避免索引失效情况

  • 在索引列上使用函数或运算
  • 使用!=或<>操作符
  • 使用OR连接条件(可改为IN)
  • 使用前导通配符LIKE '%xxx'
  • 隐式类型转换导致索引失效
  • 复合索引不遵循最左前缀原则

五、索引优化策略

  1. 覆盖索引:查询列都包含在索引中,避免回表操作
  2. 索引下推:MySQL5.6+特性,将WHERE条件下推到存储引擎层过滤
  3. MRR优化:Multi-Range Read优化,减少随机IO
  4. ICP优化:Index Condition Pushdown优化
  5. 使用EXPLAIN分析:查看SQL执行计划,优化索引使用

六、索引维护与管理

  1. 定期分析表(ANALYZE TABLE)更新索引统计信息
  2. 定期优化表(OPTIMIZE TABLE)减少碎片
  3. 监控索引使用情况,删除无用索引
  4. 避免过多索引,一般不超过表字段数的20%

七、特殊索引注意事项

  1. 自增主键:InnoDB推荐使用自增列作为主键
  2. 前缀索引:对长字符串列使用前N个字符建立索引
  3. NULL值处理:尽量避免NULL值,可为NULL的列需要额外空间
  4. 外键索引:线上OLTP系统慎用外键

八、索引与存储引擎

  1. InnoDB

    • 使用聚簇索引,主键作为聚簇索引
    • 二级索引存储主键值
    • 支持事务和行级锁
  2. MyISAM

    • 使用非聚簇索引,索引和数据分离
    • 只支持表级锁
    • 支持全文索引

2、代码操作示例

一、索引创建方法

1. 创建表时定义索引

-- 主键索引
CREATE TABLE employee_tbl (emp_id CHAR(9) NOT NULL PRIMARY KEY,emp_name VARCHAR(40) NOT NULL,emp_st_addr VARCHAR(20) NOT NULL,emp_city VARCHAR(15) NOT NULL,emp_st CHAR(2) NOT NULL,emp_zip NUMBER(5) NOT NULL
);-- 多列索引
CREATE TABLE sales (id INT NOT NULL,customer_id INT NOT NULL,amount DECIMAL(10,2),sale_date DATE,PRIMARY KEY (id),INDEX idx_customer_date (customer_id, sale_date)
);

 2. 在已有表上创建索引

-- 普通索引
CREATE INDEX idx_name ON employee_tbl(emp_name);-- 唯一索引
CREATE UNIQUE INDEX idx_zip ON employee_tbl(emp_zip);-- 前缀索引(针对字符串列)
CREATE INDEX idx_city_prefix ON employee_tbl(emp_city(5));

二、索引使用方法

1. 基本查询使用索引

-- 使用主键查询(自动使用索引)
SELECT * FROM employee_tbl WHERE emp_id = '12345';-- 使用普通索引列查询
SELECT * FROM employee_tbl WHERE emp_name = 'John Doe';-- 使用多列索引
SELECT * FROM sales WHERE customer_id = 100 AND sale_date = '2025-05-23';

2. 覆盖索引查询

-- 如果索引包含所有查询字段,可以避免回表
CREATE INDEX idx_covering ON sales(customer_id, sale_date, amount);-- 查询只使用索引列
SELECT customer_id, sale_date FROM sales 
WHERE customer_id = 100 AND sale_date BETWEEN '2025-05-21' AND '2025-05-23';

三、索引优化方法

1. 索引设计原则

优先使用数值类型索引:数值比较比字符串快

-- 不推荐
CREATE INDEX idx_bad ON table(phone_str);-- 推荐:将字符串转为数字
CREATE INDEX idx_good ON table(CAST(phone_str AS UNSIGNED));

合理使用ENUM/SET

-- 对于有限可能值的字段
ALTER TABLE employee_tbl 
ADD COLUMN gender ENUM('M','F') NOT NULL COMMENT '性别';

避免NULL字段

-- 不推荐
ALTER TABLE employee_tbl ADD COLUMN middle_name VARCHAR(20) NULL;-- 推荐
ALTER TABLE employee_tbl ADD COLUMN middle_name VARCHAR(20) NOT NULL DEFAULT '';

2. 索引使用优化

避免索引列运算

-- 不推荐(索引失效)
SELECT * FROM sales WHERE YEAR(sale_date) = 2025;-- 推荐
SELECT * FROM sales WHERE sale_date BETWEEN '2025-05-23' AND '2025-05-23';

合理使用前缀索引

-- 对长字符串列使用前缀索引
CREATE INDEX idx_name_prefix ON employee_tbl(emp_name(10));

多列索引顺序

-- 选择性高的列在前
CREATE INDEX idx_optimal ON sales(sale_date, customer_id);

3. 索引维护优化

定期分析表

ANALYZE TABLE employee_tbl;

删除未使用索引

-- 通过性能Schema或慢查询日志识别未使用索引
DROP INDEX idx_unused ON employee_tbl;

处理索引碎片

OPTIMIZE TABLE employee_tbl;

四、综合示例

-- 创建优化后的表结构
CREATE TABLE optimized_employee (id INT UNSIGNED NOT NULL AUTO_INCREMENT,emp_code CHAR(8) NOT NULL COMMENT '员工编码',name VARCHAR(30) NOT NULL,department ENUM('IT','HR','Finance','Sales') NOT NULL,join_date DATE NOT NULL,salary DECIMAL(10,2) NOT NULL DEFAULT 0,status TINYINT NOT NULL DEFAULT 1 COMMENT '0-离职 1-在职',PRIMARY KEY (id),UNIQUE KEY uk_emp_code (emp_code),INDEX idx_department_status (department, status),INDEX idx_name (name(10)),INDEX idx_join_date (join_date)
) ENGINE=InnoDB;-- 查询示例(充分利用索引)
-- 1. 使用主键查询
SELECT * FROM optimized_employee WHERE id = 100;-- 2. 使用多列索引
SELECT id, name FROM optimized_employee 
WHERE department = 'IT' AND status = 1
ORDER BY join_date DESC;-- 3. 覆盖索引查询
SELECT department, COUNT(*) 
FROM optimized_employee
WHERE join_date > '2025-05-23'
GROUP BY department;

相关文章:

【MySQL成神之路】MySQL索引相关介绍

1 相关理论介绍 一、索引基础概念 二、索引类型 1. 按数据结构分类 2. 按功能分类 三、索引数据结构原理 B树索引特点&#xff1a; 哈希索引特点&#xff1a; 四、索引使用原则 1. 创建索引原则 2. 避免索引失效情况 五、索引优化策略 六、索引维护与管理 七、特殊…...

PPP 拨号失败:ATD*99***1# ... failed

从日志来看&#xff0c;主要有两类问题&#xff1a; 一、led_indicator_stop 报 invalid p_handle E (5750) led_indicator: …/led_indicator.c:461 (led_indicator_stop):invalid p_handle原因分析 led_indicator_stop() 的参数 p_handle &#xff08;即之前 led_indicator…...

PostgreSQL跨数据库表字段值复制实战经验分

场景需求 在实际工作中&#xff0c;我们经常需要将一个PostgreSQL数据库中的表字段值复制到另一个数据库中。最近我在处理两个ERP系统数据库&#xff08;A库和B库&#xff09;之间的数据同步时&#xff0c;就遇到了这样的需求&#xff1a;需要将B库中sale_order表的合同信息&a…...

【计网】五六章习题测试

目录 1. (单选题, 3 分)某个网络所分配到的地址块为172.16.0.0/29&#xff0c;能接收目的地址为172.16.0.7的IP分组的最大主机数是&#xff08; &#xff09;。 2. (单选题, 3 分)若将某个“/19”的CIDR地址块划分为7个子块&#xff0c;则可能的最小子块中的可分配IP地址数量…...

汇川EasyPLC MODBUS-RTU通信配置和编程实现

累积流量计算(MODBUS RTU通信数据处理)数据处理相关内容。 累积流量计算(MODBUS RTU通信数据处理)_流量积算仪modbus rtu通讯-CSDN博客文章浏览阅读219次。1、常用通信数据处理MODBUS通信系列之数据处理_modbus模拟的数据变化后会在原来的基础上累加是为什么-CSDN博客MODBUS通…...

从 CANopen到 PROFINET:网关助力物流中心实现复杂的自动化升级

使用 CANopen PLC 扩展改造物流中心的传送带 倍讯科技profinet转CANopen网关BX-601-EIP将新的 PROFINET PLC 系统与旧的基于 CANopen 的传送带连接起来&#xff0c;简化了物流中心的自动化升级。 新建还是升级&#xff1f;这些问题通常出现在复杂的内部物流设施中&#xff0c;…...

基于Yolov8+PyQT的老人摔倒识别系统源码

概述 ​​基于Yolov8PyQT的老人摔倒识别系统​​&#xff0c;该系统通过深度学习算法实时检测人体姿态&#xff0c;精准识别站立、摔倒中等3种状态&#xff0c;为家庭或养老机构提供及时预警功能。 主要内容 ​​完整可运行代码​​ 项目采用Yolov8目标检测框架结合PyQT5开发…...

wsl2 不能联网

wsl2 安装后用 wifi 共享是能联网&#xff0c;问题出在公司网络限制 wsl2 IP 访问网络&#xff0c;但是主机可以上网。 解决办法&#xff0c;在主机用 nginx 设置代理&#xff0c;可能需要开端口权限 server {listen 9000;server_name localhost;location /ubuntu/ {#…...

双击重复请求的方法

1、限制点击次数 2、vue中 可以自定义一个属性指令 preventReClick.js中定义&#xff1a; import Vue from vue Vue.directive(preventReClick, {inserted: (el, binding) > {el.addEventListener(click, () > {if (!el.disabled) {el.disabled truesetTimeout(() >…...

Java[IDEA]里的debug

目录 前言 Debug 使用Debug 总结 前言 这里我说一下就是 java IDEA 工具里的debug工具 里的一个小问题 就是 当我们使用debug去查看内部文档 查看不到 是为什么 Debug 所谓 debug 工具 他就是用来调试程序的 当我们写代码 报错 出错时 我们就可以使用这个工具 因此这个工具…...

一条SQL语句的旅程:解析、优化与执行全过程研究

1、引言 在现代信息系统中,数据库是核心组件之一。SQL(结构化查询语言)作为与数据库交互的主要方式,其执行效率直接影响到整个系统的性能表现。虽然开发者常常只需编写一行简单的 SQL,但数据库内部却经历了一个复杂而精密的过程来完成这条 SQL 的处理。 本文将以一个完整…...

动态规划经典三题_完全平方数

279. 完全平方数 给你一个整数 n &#xff0c;返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数&#xff0c;其值等于另一个整数的平方&#xff1b;换句话说&#xff0c;其值等于一个整数自乘的积。例如&#xff0c;1、4、9 和 16 都是完全平方数&#xff0c;而…...

LVGL(lv_textarea文本框控件)

文章目录 一、lv_textarea 是什么&#xff1f;二、基本用法1. 创建 lv_textarea 对象2. 设置提示文字&#xff08;占位符&#xff09;3. 设置最大长度4. 设置密码模式&#xff08;显示为\*号&#xff09;5. 获取和设置内容6. 配合虚拟键盘使用&#xff08;常用于触摸屏&#xf…...

蓝桥杯国14 互质

问题描述 请计算在 [1,2023的2023次幂] 范围内有多少个整数与 2023 互质。由于结果可能很大&#xff0c;你只需要输出对 1097 取模之后的结果。 答案提交 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一个整数&#xff0c;在提交答案时只填写这个…...

DAO模式

1. 持久化 简单来说&#xff0c;就是把代码的处理结果转换成需要的格式进行储存。 2. JDBC的封装 3. DAO模式 4. Properties类与Properties配置文件 添加 读取 5. 使用实体类传递数据 6. 总结 附录&#xff1a; BaseDao指南 BaseDao指南-CSDN博客...

ECharts图表工厂,完整代码+思路逻辑

Echart工厂支持柱状图&#xff08;bar&#xff09;折线图&#xff08;line&#xff09;散点图&#xff08;scatter&#xff09;饼图&#xff08;pie&#xff09;雷达图&#xff08;radar&#xff09;极坐标柱状图&#xff08;polarBar&#xff09;和极坐标折线图&#xff08;po…...

Logback 在 Spring Boot 中的详细配置

1. Logback 配置文件 Spring Boot 默认会加载 classpath 下的 logback-spring.xml&#xff08;推荐&#xff09;或 logback.xml 作为 Logback 的配置文件。 ​推荐使用 logback-spring.xml&#xff0c;因为 Spring Boot 提供了扩展支持&#xff08;例如基于 Profile 的配置&am…...

写起来比较复杂的深搜题目

年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车&#xff0c;但他没想到的是那辆车属于警察局&#xff0c;并且车上装有用于发射车子移动路线的装置。 那个装置太旧了&#xff0c;以至于只能发射关于那辆车的移动路线的方向信息。 编写程序&#xff0c;通过使用一张小镇的地图…...

MySQL强化关键_016_存储引擎

目 录 一、概述 二、MySQL 支持的存储引擎 三、指定存储引擎 四、修改存储引擎 五、常用存储引擎及适用场景 一、概述 MySQL 存储引擎决定了数据在磁盘上的存储方式和访问方式&#xff1b;不同的存储引擎实现了不同的存储和检索算法&#xff1b;MySQL 常见的存储引擎&…...

CSS:margin的塌陷与合并问题

文章目录 一、margin塌陷问题二、margin合并问题 一、margin塌陷问题 二、margin合并问题...

防护等级IPxx含义 -雨天充电需要防护盖吗

指标快要到期&#xff0c;新买的电车&#xff0c;第一次碰到雨天充电的问题&#xff0c;有点担心漏电。然后电商平台上一查&#xff0c;果然有卖防护罩的&#xff0c;但是真的需要吗&#xff1f; 下面从充电口防护等级&#xff0c;国标要求、注意事项等几个方面分析。 一、防护…...

【设计模式】责任链+模板+工程模式使用模板

前言 方便写出优雅&#xff0c;解耦&#xff0c;高内聚&#xff0c;高复用的代码。 Demo // 1. 定义验证器接口&#xff08;责任链模式&#xff09; public interface Validator {Validator setNext(Validator next);boolean validate(Data data); }// 2. 创建抽象验证器&am…...

探索服务网格(Service Mesh):云原生时代的网络新范式

文章目录 一、引言二、什么是服务网格基本定义形象比喻 三、服务网格解决了哪些问题微服务通信复杂性可观察性安全性 四、常见的服务网格实现IstioLinkerdConsul Connect 五、服务网格的应用场景大型微服务架构混合云环境 六、服务网格的未来发展与其他技术的融合标准化和行业规…...

SQL SERVER中实现类似LEAST函数的功能,返回多列数据中的最小值

使用 LEAST&#xff08;&#xff09;函数可以简洁地在一行SQL语句中找出多个值中的最小值&#xff0c;但在SQLServer数据库中&#xff0c;没有内置的LEAST函数。 我们可以使用values子句创建临时的数据集的办法&#xff0c;返回多列数据中的最小值。 创建表 CREATE TABLE stu…...

SymPy | 获取表达式自由变量方法与因式分解

SymPy 是 Python 中强大的符号计算库&#xff0c;广泛应用于数学建模、公式推导和科学计算。本文将从两个核心功能展开&#xff1a;表达式中自由变量的获取与因式分解的实现&#xff0c;通过完整代码示例和深入分析&#xff0c;帮助读者掌握其使用方法。 第一部分&#xff1a;获…...

深度剖析并发I/O模型select、poll、epoll与IOCP核心机制

核心概要&#xff1a;select、poll、epoll 和 IOCP 是四种用于提升服务器并发处理能力的I/O模型或机制。前三者主要属于I/O多路复用范畴&#xff0c;允许单个进程或线程监视多个I/O流的状态&#xff1b;而 IOCP 则是一种更为彻底的异步I/O模型。 一、引言&#xff1a;为何需要这…...

单片机——实现交通信号灯管理

随便写写&#xff0c;汇总一下&#xff0c;就一个单片机&#xff0c;没有模拟软件&#xff0c;什么都没有~ 点阵、数码管、led同时点亮 #include <reg52.h>sbit ADDR0 P1^0; sbit ADDR1 P1^1; sbit ADDR2 P1^2; sbit ADDR3 P1^3; sbit ENLED P1^4;// 交通灯控制引…...

数据结构 -- 交换排序(冒泡排序和快速排序)

冒泡排序 基于“交换”的排序&#xff1a;根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置 //交换 void swap(int &a,int &b){int temp a;a b;b temp; }//冒泡排序 void BubbleSort(int A[],int n){for(int i0;i<n-1;i){bool flag false; …...

【算法】: 前缀和算法(利用o(1)的时间复杂度快速求区间和)

前缀和算法&#xff1a;高效处理区间求和的利器 目录 引言什么是前缀和前缀和的基本实现前缀和的作用前缀和的典型应用场景前缀和的优缺点分析实战例题解析 引言 区间求和问题的普遍性暴力解法的时间复杂度问题前缀和算法的核心思想 什么是前缀和 前缀和的数学定义 通俗来…...

macOS 安装 PostgreSQL

文章目录 安装安装信息 验证GUI 工具下载 安装 最简单的方式是通过 brew 安装 brew install postgresql17该版本在 brew 上的详情页&#xff1a;https://formulae.brew.sh/formula/postgresql17 你也可以根据需要&#xff0c;搜索 安装更新版本 如果你没有安装 brew&#xf…...