【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;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/84777.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五、web安全--XSS漏洞(1)--XSS漏洞利用全过程

本文章仅供学习交流&#xff0c;如作他用所承受的法律责任一概与作者无关1、XSS漏洞利用全过程 1.1 寻找注入点&#xff1a;攻击者首先需要找到目标网站中可能存在XSS漏洞的注入点。这些注入点通常出现在用户输入能够直接输出到页面&#xff0c;且没有经过适当过滤或编码的地方…

使用 Shell 脚本实现 Spring Boot 项目自动化部署到 Docker(Ubuntu 服务器)

使用 Shell 脚本实现 Spring Boot 项目自动化部署到 Docker&#xff08;Ubuntu 服务器&#xff09; 在日常项目开发中&#xff0c;我们经常会将 Spring Boot 项目打包并部署到服务器上的 Docker 环境中。为了提升效率、减少重复操作&#xff0c;我们可以通过 Shell 脚本实现自动…

高考加油(Python+HTML)

前言 询问DeepSeek根据自己所学到的知识来生成多个可执行的代码&#xff0c;为高考学子加油。最开始生成的都会有点小问题&#xff0c;还是需要自己调试一遍&#xff0c;下面就是完整的代码&#xff0c;当然了最后几天也不会有多少人看&#xff0c;都在专心的备考。 Python励…

HTTP协议接口三种测试方法之-JMeter(保姆教程)

在当今 API 驱动的开发世界中&#xff0c;高效、可靠的 HTTP 接口测试是保障应用质量的关键。作为开源性能测试工具中的王者&#xff0c;Apache JMeter 不仅擅长压力测试&#xff0c;更是进行功能性和回归测试的利器。本文将手把手教你如何用 JMeter 构建强大的 HTTP 测试计划&…

聊聊JVM怎么调优?(实战总结)

JVM 核心配置与调优指南 一、堆内存与年轻代配置&#xff08;影响最大&#xff09; 堆内存大小&#xff1a; 在资源允许的前提下&#xff0c;堆内存应尽可能设置得更大。关键点&#xff1a; 必须将堆内存的最大值 (-Xmx) 和最小值 (-Xms) 设置为相同值。动态扩容会触发 Full G…

开疆智能Profinet转Profibus网关连接费斯托阀岛总线模块配置案例

本案例是通过开疆智能Profibus转Profinet网关将费托斯阀岛接入到西门子1200PLC的配置案例。 首先我们先了解一下Profibus报文以及他的通讯原理。 除了起始符 SD 和结束符 ED 这些固定数值之外&#xff0c;还有功能码&#xff08;Function Code, FC&#xff09;和服务访问点&…

ARM内核一览

经常看介绍某某牛批芯片用的又是ARM什么核&#xff0c;看的云里雾里&#xff0c;所以简单整理整理。&#xff08;内容来自官网和GPT&#xff09; 1 ARM 内核总体分类 系列特点应用场景Cortex-M超低功耗、低成本、实时性嵌入式系统、微控制器、IoTCortex-R高可靠性、硬实时汽车…

RT Thread Nano V4.1.1 rtconfig.h 注释 Configuration Wizard 格式

rtcomfig.h 以下是对 [rtconfig.h](file://c:\Users\admin\Downloads\rtthread-nano-master\rt-thread\bsp\stm32f407-msh\RT-Thread\rtconfig.h) 文件中每一个配置项的详细注释说明: 基本配置(Basic Configuration) [RT_THREAD_PRIORITY_MAX](file://c:\Users\admin\Downl…

UniApp网页版集成海康视频播放器

注意&#xff1a;本人全部集成好后使用最新的海康平台下载插件进行替换后就不能预览视频 使用Uni插件进行集成&#xff1a;海康视频H5播放器组件 - DCloud 插件市场 CSDN资源下载&#xff1a;https://download.csdn.net/download/wangdaoyin2010/90910975 注意&#xff1a;初…

WPF【10_2】数据库与WPF实战-示例

客户预约关联示例图 MainWindow.xaml 代码 <Window x:Class"WPF_CMS.MainWindow" xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d"ht…

理解 Kubernetes 的架构与控制平面组件运行机制

文章目录 K8s架构K8s核心组件控制平面组件&#xff08;部署在 Master 节点&#xff09;1. 查看组件运行情况2. 查看组件 help 命令 Node端组件&#xff08;部署在每个工作节点&#xff09; K8s内部工作原理 Kubernetes&#xff08;也称为 K8s&#xff09;是一个开源的容器编排和…

Express+MySQL后台开发实战:从模块化到错误处理的全链路解析

ExpressMySQL后台开发实战&#xff1a;从模块化到错误处理的全链路解析 摘要&#xff1a;本文将以Node.jsExpress框架为基础&#xff0c;结合MySQL数据库实战&#xff0c;深度剖析后台系统中数据库模块化设计、安全查询、错误处理等核心开发要点。 一、项目环境与技术栈 ├─…

Spring AI 智能体代理模式(Agent Agentic Patterns)

AgentAgenticPatterns 简介 在最近的一篇研究报告《构建高效代理》 中&#xff0c;Anthropic分享了关于构建高效大语言模型&#xff08;LLM&#xff09;代理的宝贵见解。这项研究特别有趣的地方在于&#xff0c;它强调简单性和可组合性&#xff0c;而非复杂的框架。让我们来探…

基于 Vue3 与 exceljs 实现自定义导出 Excel 模板

在开发中&#xff0c;我们需要常常为用户提供更多的数据录入方式&#xff0c;Excel 模板导出与导入是一个常见的功能点。本文将介绍如何使用 Vue3、exceljs 和 file-saver 实现一个自定义导出 Excel 模板&#xff0c;并在特定列添加下拉框选择的数据验证功能。 技术选型 excelj…

git 命令之-git cherry-pick

今天得到一个通知&#xff0c;这个业务版本里面部分已经开发但还没测试的内容要新开一个分支提交&#xff0c;但是我已经有几个提交上去了&#xff0c;难道只能一个一个文件复制到新的分支吗&#xff1f;我不&#xff0c;我找到了这个git命令&#xff0c;可以解决我的困惑&…

浙大版《Python 程序设计》题目集6-3,6-4,6-5,6-6列表或元组的数字元素求和及其变式(递归解法)

目录 6-3 输入格式: 输出格式: 输入样例: 输出样例: 6-4 输入格式: 输出格式: 输入样例: 输出样例: 6-5 输入格式: 输出格式: 输入样例: 输出样例: 6-6 输入格式: 输出格式: 输入样例: 输出样例: 6-3 第6章-3 列表或元组的数字元素求和 分数 20 全屏浏览 切换布局 作者 陈春晖 …

【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter2 小程序核心

1 尺寸单位和样式 1.1 创建小程序项目-纯净环境 // 该删的删掉。 1.2 尺寸单位 # 小程序内 手机屏幕大小可能不一样&#xff0c;使用px像素就会出现样式问题 --> 小程序统一了整个宽度&#xff0c;即750rpx&#xff0c;屏幕一半则是375rpx -->因此不管什么手机都可以…

攻防世界逆向刷题笔记(新手模式9-1?)

bad_python 看样子是pyc文件损坏了。利用工具打开&#xff0c;发现是MAGIC坏了。搜下也没有头绪。 攻防世界-难度1- bad_python - _rainyday - 博客园 python Magic Number对照表以及pyc修复方法 - iPlayForSG - 博客园 看WP才知道36已经提示了pyc版本了。参考第二个文章&am…

mysql ACID 原理

序言&#xff1a;ACID 是一组数据库设计原则&#xff0c;他是业务数据和关键业务程序的可靠性保障。 1、atomicity&#xff08;原子性&#xff09; 依赖如下能力 autocommit commit rollback2、一致性 2.1 double write buffer 1、定义&#xff1a;double write buffer 是…

WebStorm 高效快捷方式全解析

作为前端开发的黄金搭档&#xff0c;WebStorm 凭借强大的功能和高度可定制的快捷键体系&#xff0c;成为众多开发者提升编码效率的利器。本文基于 IntelliJ IDEA 的快捷键体系&#xff08;WebStorm 作为 JetBrains 家族成员&#xff0c;快捷键逻辑高度一致&#xff09;&#xf…