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

MySQL 索引详解与原理分析

MySQL 索引详解与原理分析

一、什么是索引?

索引(Index)是数据库表中一列或多列的值进行排序的一种数据结构,可以加快数据的检索速度。索引类似于书本的目录,通过目录可以快速定位到想要的内容,而不用全书翻找。


二、MySQL 索引的类型

1. 主键索引(PRIMARY KEY)

  • 唯一标识表中的每一行,不能为空。
  • 每个表只能有一个主键索引。

2. 唯一索引(UNIQUE)

  • 保证某一列的值唯一,可以有多个唯一索引,允许有空值。

3. 普通索引(INDEX/KEY)

  • 最基本的索引类型,仅加速查询,无唯一性约束。

4. 组合索引(联合索引,Composite Index)

  • 由多个字段组成的索引,适用于多条件查询。

5. 全文索引(FULLTEXT)

  • 主要用于大文本字段的全文检索(如文章内容)。

6. 空间索引(SPATIAL)

  • 用于地理空间数据类型。

三、索引的底层原理

1. B+Tree 索引

MySQL(InnoDB 引擎)默认使用 B+Tree 作为索引的数据结构。

  • B+Tree 特点

    • 多路平衡查找树,所有数据都存储在叶子节点,非叶子节点只存储键值。
    • 叶子节点之间有链表指针,便于范围查询。
    • 查询、插入、删除的时间复杂度为 O(log n)。
  • 主键索引(聚簇索引)

    • InnoDB 的主键索引是聚簇索引(Clustered Index),数据行实际存储在 B+Tree 的叶子节点上。
    • 一张表只能有一个聚簇索引。
  • 辅助索引(二级索引,Secondary Index)

    • 叶子节点存储的是主键值而不是实际数据,需要回表查询。

2. Hash 索引

  • MyISAM 引擎支持 Hash 索引,适合等值查询,不支持范围查询。
  • InnoDB 支持自适应哈希索引(Adaptive Hash Index),自动优化热点数据。

3. 全文索引

  • 通过倒排索引(Inverted Index)实现,适合大文本的关键词检索。

四、索引的创建与使用

1. 创建索引

-- 创建普通索引
CREATE INDEX idx_name ON table_name(column_name);-- 创建唯一索引
CREATE UNIQUE INDEX idx_unique_name ON table_name(column_name);-- 创建组合索引
CREATE INDEX idx_multi ON table_name(col1, col2);-- 创建全文索引
CREATE FULLTEXT INDEX idx_content ON articles(content);

2. 删除索引

DROP INDEX idx_name ON table_name;

3. 查看索引

SHOW INDEX FROM table_name;

五、索引的使用原理

1. 查询优化

  • MySQL 查询优化器会根据 SQL 语句自动选择最优的索引。
  • 使用 EXPLAIN 语句可以分析 SQL 是否走索引。

2. 回表与覆盖索引

  • 回表:辅助索引查到主键后,还需回到主键索引查找完整数据。
  • 覆盖索引:查询的字段都在索引中,无需回表,效率更高。

3. 最左前缀原则

  • 组合索引遵循最左前缀匹配原则,只有查询条件从最左列开始连续使用,索引才会生效。

    例如:INDEX(col1, col2, col3)

    • WHERE col1 = ?WHERE col1 = ? AND col2 = ? 可以用到索引
    • WHERE col2 = ? 无法用到索引

六、索引的优缺点

优点

  • 大幅提升查询速度,尤其是大表
  • 加速排序、分组、连接等操作

缺点

  • 占用磁盘空间
  • 插入、更新、删除时需要维护索引,影响写入性能
  • 索引过多会导致优化器选择不佳

七、索引的适用场景与优化建议

1. 适用场景

  • 经常作为查询条件的字段
  • 需要唯一性约束的字段
  • 需要排序、分组的字段
  • 连接表的外键字段

2. 不适合加索引的场景

  • 很少用作查询条件的字段
  • 频繁更新的字段
  • 数据量很小的表

3. 优化建议

  • 合理设计主键和唯一索引
  • 控制索引数量,避免冗余
  • 优先考虑覆盖索引
  • 定期分析和优化慢查询

八、实用案例

1. 单列索引

CREATE INDEX idx_email ON users(email);
SELECT * FROM users WHERE email = 'test@example.com';

2. 组合索引与最左前缀

CREATE INDEX idx_name_age ON users(name, age);
SELECT * FROM users WHERE name = 'Tom' AND age = 20;  -- 走索引
SELECT * FROM users WHERE age = 20;                   -- 不走索引

3. 覆盖索引

SELECT name, age FROM users WHERE name = 'Tom';  -- 如果有 idx_name_age,则为覆盖索引

4. EXPLAIN 分析

EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';

九、总结

MySQL 索引是提升数据库查询性能的关键工具。理解索引的类型、原理和使用场景,合理设计和维护索引,可以极大提升系统的响应速度和扩展能力。
建议:

  • 结合实际业务场景,科学设计索引
  • 多用 EXPLAIN 分析 SQL 性能
  • 定期优化和清理无用索引

如有更深入的索引优化问题,欢迎留言交流!

相关文章:

MySQL 索引详解与原理分析

MySQL 索引详解与原理分析 一、什么是索引? 索引(Index)是数据库表中一列或多列的值进行排序的一种数据结构,可以加快数据的检索速度。索引类似于书本的目录,通过目录可以快速定位到想要的内容,而不用全书…...

游戏引擎学习第303天:尝试分开对Y轴和Z轴进行排序

成为我们自己的代码精灵α 所以现在应该可以正常使用了。不过,这两周我们没办法继续处理代码里的问题,而之前留在代码里的那个问题依然存在,没有人神奇地帮我们修复,这让人挺无奈的。其实我们都希望有个神奇的“代码仙子”&#…...

javaweb-html

1.交互流程: 浏览器向服务器发送http请求,服务器对浏览器进行回应,并发送字符串,浏览器能对这些字符串(html代码)进行解释; 三大web语言:(1)html&#xff1a…...

3.2.3

# 导入必要的库 import onnx import numpy as np from PIL import Image import onnxruntime as ort # 定义预处理函数,用于将图片转换为模型所需的输入格式 def preprocess(image_path): input_shape (1, 1, 64, 64) # 模型输入期望的形状,这里…...

Redis 8.0 GA,重回开源

在数字化浪潮的推动下,实时数据处理已成为现代应用的核心需求。作为全球广泛使用的 NoSQL 数据库,Redis 8.0 不仅通过 30 余项性能改进重新定义了实时数据处理的速度极限,更通过整合社区资源与开放授权模式,进一步巩固其在开源生态…...

心联网(社群经济)视角下开源AI智能名片、链动2+1模式与S2B2C商城小程序源码的协同创新研究

摘要:在心联网(社群经济)理论框架下,本文构建了开源AI智能名片、链动21模式与S2B2C商城小程序源码的技术协同体系,提出"情感连接-利益驱动-生态裂变"三维创新模型。通过实证分析与案例研究,验证该…...

【图像大模型】Hunyuan-DiT:腾讯多模态扩散Transformer的架构创新与工程实践

Hunyuan-DiT:腾讯多模态扩散Transformer的架构创新与工程实践 一、架构设计与技术创新1.1 核心架构解析1.2 关键技术突破1.2.1 多粒度训练策略1.2.2 动态路由MoE 二、系统架构解析2.1 完整生成流程2.2 性能对比 三、实战部署指南3.1 环境配置3.2 基础推理代码3.3 高…...

TASK04【Datawhale 组队学习】构建RAG应用

目录 将LLM接入LangChain构建检索问答链运行成功图遇到的问题 langchain可以便捷地调用大模型,并将其结合在以langchain为基础框架搭建的个人应用中。 将LLM接入LangChain from langchain_openai import ChatOpenAI实例化一个 ChatOpenAI 类,实例化时传入超参数来…...

YOLOv11旋转目标检测Hrsc2016

from ultralytics import YOLOmodel YOLO(/kaggle/input/model-v11-obb/yolo11n-obb.pt) model.train(data/kaggle/input/hrscobb4/HRSC-YOLO/data.yaml, epochs30) 1使用的训练平台为Kaggle 数据集:HRSC的三种形式 一级分类:船 有水平框版本&…...

Debian重装系统后

安装配置java环境 手动安装 下载openJDK:openJDK 设置替代项 sudo update-alternatives --install /usr/bin/java java /opt/jdk-21.0.2/bin/java 1 sudo update-alternatives --install /usr/bin/javac javac /opt/jdk-21.0.2/bin/javac 1 sudo update-alternat…...

野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(四)安装RKNN Toolkit Lite2

RKNN Toolkit Lite2 是瑞芯微专为RK系列芯片开发的NPU加速推理API。若不使用该工具,计算任务将仅依赖CPU处理,无法充分发挥芯片高达6TOPS的NPU算力优势。 按照官方文档先拉一下官方代码库,然后通过whl文件安装,因为我是python3.1…...

ElasticSearch导读

ElasticSearch 简介:ElasticSearch简称ES是一个开源的分布式搜素和数据分析引擎。是使用Java开发并且是当前最流行的开源的企业级搜索引擎,能够达到近实时搜索,它专门设计用于处理大规模的文本数据和实现高性能的全文搜索。它基于 Apache Luc…...

【STM32】自定义打印函数

STM32 学习笔记:理解 my_printf 与 va_start 在嵌入式开发中,我们常常需要实现类似标准 C 中 printf 的调试输出功能。为了支持“任意数量参数”的传递,C 语言提供了对 可变参数(variable arguments) 的支持。其中&am…...

基于 STM32 的 PC ARGB 风扇控制器设计与实现

一、项目背景 最近购入的 X99 系列主板,没有风扇的 ARGB 彩灯接口,并且在 Ubuntu 系统上 4pin 的风扇接口调速也是非常的难用,sensor 扫描不到传感器,于是决定手搓一个风扇控制器,来实现转速自定义和彩灯控制。 我控制…...

【软件设计师】计算机网络考点整理

以下是软件设计师考试中 ​​计算机网络​​ 的核心考点总结,帮助您高效备考: ​​一、网络体系结构与协议​​ ​​OSI七层模型 & TCP/IP四层模型​​ 各层功能(物理层-数据链路层-网络层-传输层-会话层-表示层-应用层)对应协…...

在 Qt 中实现动态切换主题(明亮和暗黑)

目录 步骤 1:准备主题文件步骤 2:将 QSS 文件加入资源系统步骤 3:创建主题管理类步骤 4:在应用程序中切换主题步骤 5:处理自定义控件和动态资源步骤 6:保存用户主题偏好步骤 7:处理图片资源切换…...

JavaEE 初阶文件操作与 IO 详解

一、文件操作基础:File 类 作用:操作文件或目录(创建、删除、获取信息)。 核心方法: exists():文件是否存在createNewFile():创建新文件mkdir():创建目录delete():删除…...

基于Qt的app开发第十天

写在前面 笔者昨天刚刚收到课设的截止时间要求,距离写这篇博客的时间还有一个月,我从申请自命题课设到今天已经27天了,先用两周时间学Qt,然后就开始做这个项目,现在已经快把基础功能全部实现了。 目前的打算是完成基础…...

QT中信号和事件的区别

好的,简单来说,Qt 的信号(Signal)和事件(Event)虽然都用于组件间通信和交互,但它们的机制和用途是不同的: 1. 信号(Signal) 概念:信号是对象发出的…...

AUTOSAR图解==>AUTOSAR_SRS_PWMDriver

AUTOSAR PWM驱动模块详解 基于AUTOSAR 4.4.0 SRS 规范文档 目录 1. PWM驱动概述2. PWM驱动架构3. PWM驱动配置4. PWM驱动API接口5. PWM驱动状态管理6. PWM驱动典型应用场景7. 总结1. PWM驱动概述 AUTOSAR PWM驱动是AUTOSAR基础软件中的一个重要组件,属于微控制器抽象层(MCAL)…...

SQL数据处理流程

一、数据处理 1、数据清洗 对空值处理:删除/填充为0 -- 用 0 填充 NULL SELECT COALESCE(sales, 0) AS sales FROM orders;-- 删除含 NULL 的记录 DELETE FROM users WHERE email IS NULL; COALESCE(bonus, 0) 相当于IF(bonus IS NULL, 0, bonus),当…...

Mysql差异备份与恢复

1.练习差异备份 差异备份:备份完全备份后,新产生的数据。 在192.168.88.50主机完成差异备份 步骤一:练习差异备份//周一完全备份 mysql> select * from test.one; --------------------- | name | age | sex | ------------------…...

目标检测 Lite-DETR(2023)详细解读

文章目录 迭代高级特征跨尺度融合高效的低层次特征跨尺度融合KDA:Key-aware Deformable Attention 论文翻译: CVPR 2023 | Lite DETR:计算量减少60%!高效交错多尺度编码器-CSDN博客 DINO团队的 (Lightweight Transfo…...

【Java学习方法】类变量

类变量 引出关键字:static 又名:静态变量,静态字段,类字段(字段又名属性,成员方法),类属性 是什么? 供该(同一个类)的所有对象共享的变量 &am…...

智能手表为什么需要做 EN 18031 认证?

EN 18031 是欧盟针对电磁兼容性(EMC)中人体暴露于电磁场的安全要求制定的标准,全称为 《Electromagnetic compatibility (EMC) - Standards for protective measures against electromagnetic fields with regard to human exposure》&#x…...

什么是 Agent 的 Message

Messages 2.4.1 概述 什么是 Agent 的 Message? 当你和朋友聊天、在网上搜索信息或是对手机语音助手说“帮我查一下天气”时,其实你都在向某个“代理者(Agent)”发送一条“信息(Message)”。这里的“代理者”既可以是一个人,也可以是一个能执…...

如何用JAVA手写一个Tomcat

一、初步理解Tomcat Tomcat是什么? Tomcat 是一个开源的 轻量级 Java Web 应用服务器,核心功能是 运行 Servlet/JSP。 Tomcat的核心功能? Servlet 容器:负责加载、实例化、调用和销毁 Servlet。 HTTP 服务器:监听端口…...

WebRTC与RTSP|RTMP的技术对比:低延迟与稳定性如何决定音视频直播的未来

引言 音视频直播技术已经深刻影响了我们的生活方式,尤其是在教育、医疗、安防、娱乐等行业中,音视频技术成为了行业发展的重要推动力。近年来,WebRTC作为一种开源的实时通信技术,成为了音视频领域的重要选择,它使得浏览…...

COMPUTEX 2025 | 广和通创新解决方案共筑AI交互新纪元

5月20日至23日,广和通携多领域创新解决方案亮相2025年台北国际电脑展(COMPUTEX 2025),台北南港展览馆#K0727a展位。此次展会,广和通围绕“Advancing Connectivity Intelligent Future”为主题,设置四大核心…...

COMPUTEX 2025 | 广和通率先发布基于MediaTek T930 平台的5G模组FG390

5月19日,全球领先的无线通信模组和AI解决方案提供商广和通率先发布基于MediaTek T930平台的5G模组FG390系列。FG390系列模组为以5G固定无线接入(Fixed Wireless Access,FWA)为代表的MBB终端产品而设计,将在CPE&#xf…...

Power Integrations 汽车电源管理方案:为汽车应用增加系统价值

在新能源汽车产业蓬勃发展的当下,高效的电源管理方案成为提升汽车性能与可靠性的关键。近期,Power Integrations 举办线上交流会,介绍了基于其 1700V InnoSwitch3-AQ 反激式开关 IC 的五款全新参考设计,旨在为 800V 纯电动汽车提供…...

汽车转向系统行业2025数据分析报告

汽车转向系统市场概况 2024年全球汽车转向系统市场规模约为2769.4亿元,预计到2031年将增长至3296.3亿元,年均复合增长率(CAGR)为2.5%。这一增长主要得益于汽车行业的持续发展以及转向系统技术的不断进步。 市场驱动因素 汽车转…...

Tiny C 编译器中,如何实现宏展开和头文件包含的预处理逻辑?

首先,预处理的主要功能包括宏展开、头文件包含、条件编译等。用户的问题主要集中在宏展开和头文件包含,所以需要分别考虑这两个部分。 关于宏展开,首先需要解析#define指令。编译器在预处理阶段需要维护一个符号表,用来存储宏的名…...

谈谈 Kotlin 中的构造方法,有哪些注意事项?

在 Kotlin 中,构造方法分为主构造方法(Primary Constructor)和次构造方法(Secondary Constructor)。 1 主构造方法 主构造方法是类的核心构造方法,直接在类头声明,位于类名之后。 1.1 基本语…...

Elasticsearch常用命令

以下是 Elasticsearch 查看集群状态配置和索引完整操作流程的详细命令: 一、查看集群状态与配置 1. 集群健康状态 curl -X GET "localhost:9200/_cluster/health?pretty" 关键参数: level=indices:显示每个索引的健康状态 level=shards:显示每个分片的详细状…...

深入解读RTP协议:RFC 3550的技术分析与应用

引言 实时传输协议(RTP),作为一项重要的技术规范,在多媒体通信中扮演着至关重要的角色。尤其在音视频传输中,RTP为媒体流提供了端到端的传输机制,能够支持高质量、低延迟的音视频数据流传输。随着互联网及…...

使用 electron-builder 打包与发布 Electron 应用

基于 electron-vite-vue 项目结构 本文将基于 electron-vite-vue 脚手架,详细介绍如何使用 electron-builder 实现: ✅ 多平台打包(Windows / macOS / Linux)✅ 自动更新发布配置✅ 常用构建脚本与输出结构 📁 项目结…...

命令行删除node_modules

文章目录 前言一、linux二、windows 前言 最近公司在重构项目,使用的monorepo,这就导致多个项目有多个node_modules。所以在主项目的package.json中写一个清除所有项目的node_modules。第一次研究命令行的代码,记录一下。但我感觉我写的不太…...

naive-ui切换主题

1、在App.vue文件中使用 <script setup lang"ts"> import Dashboard from ./views/dashboard/index.vue import { NConfigProvider, NGlobalStyle, darkTheme } from naive-ui import { useThemeStore } from "./store/theme"; // 获取存储的主题类…...

开源Vue表单设计器FcDesigner中组件联动的配置教程

在用FcDesigner表单开发中&#xff0c;经常需要实现组件之间的联动行为&#xff0c;例如当某个输入框的值满足特定条件时&#xff0c;动态显示或隐藏其他组件。FormCreate 提供了强大的组件联动功能&#xff0c;通过 control 配置项实现组件的加载、显示、禁用和必填等状态控制…...

使用 Shadcn UI 构建 Java 桌面应用

许多桌面应用程序&#xff0c;如 Slack、Notion、Microsoft Teams 和 Linear&#xff0c;都采用基于 Web 的用户界面。这已成为现代软件开发中的常见做法&#xff0c;开发者可以借助熟悉的 Web 技术构建应用&#xff0c;从而简化开发流程。 在本篇文章中&#xff0c;我们将向您…...

25_05_19Linux实战篇、第一章_01若依前后端部署之路(后端)

Linux_实战篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;若依前后端动静分离(后端 ) 版本号: 1.0,0 作者: 老王要学习 日期: 2025.05.20 适用环境: Rocky9.5 文档说明 本文围绕 Linux 实战展开&#x…...

Python慕课学习记录

中国大学MOOC&#xff08;慕课&#xff09;观看记录&#xff1a; Python123课后相应的练习、考试记录...

2025年渗透测试面试题总结-快手[实习]安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 快手[实习]安全工程师 一面问题分析与详细回答 1. 自我介绍 4. 项目问题与解决 7. 防止SQL注入&…...

【iOS(swift)笔记-10】利用类的继承来实现不同地区语言的显示

XCode项目原生开发有自带的可区分语言的功能体系&#xff0c;建议采用原生开发&#xff0c;此处利用类的继承来实现不同地区语言的显示是为了方便&#xff0c;而且在unity游戏开发中采用此法也挺灵活适用。 // 定义一个语言控制类 class LanguageController { // 根据系统切换…...

C语言中的弱符号 __attribute__((weak)) 的使用方法

以下是一个脱离 CallStack.h 的极简 C 语言示例&#xff0c;通过 弱符号覆盖 和 运行时检查 两个场景&#xff0c;展示 __attribute__((weak)) 的核心用法&#xff1a; 一、代码实现 1. 弱符号定义与覆盖&#xff08;weak_demo.c&#xff09; // weak_demo.c #include <st…...

禁止window安全中心乱删文件

将文件/文件夹添加到 Defender 排除列表 如果你确定文件安全&#xff0c;可以将其添加到 排除列表&#xff0c;防止 Defender 误删&#xff1a; Windows 安全中心 → “病毒和威胁防护” → “管理设置”。 下拉找到 “排除项” → “添加或删除排除项”。 点击 “ 添加排除…...

【JavaScript异步编程终极指南】从回调地狱到Async/Await的实战突围

目录 &#x1f30d; 前言&#xff1a;技术背景与价值&#x1f494; 当前技术痛点&#x1f6e0; 解决方案概述&#x1f465; 目标读者说明&#x1f50d; 一、技术原理剖析&#x1f9e0; 核心作用讲解&#x1f9e9; 关键技术模块说明⚖️ 技术选型对比 &#x1f4bb; 二、实战演示…...

【算法专题十五】BFS解决最短路问题

文章目录 1.最短路问题简介&#xff08;边权为1的最短路问题&#xff09;2.迷宫中离入口最近的出口2.1 题目2.2 思路2.3 代码 3.最小基因变化3.1 题目3.2 思路3.3 代码 4.单词接龙4.1 题目4.2 思路4.3 代码 5.为高尔夫比赛砍树5.1 题目5.2 思路5.3 代码 1.最短路问题简介&#…...

upload-labs通关笔记-第16关 文件上传之exif_imagetype绕过(图片马)

目录 一、exif_imagetype 二、开启exif模块 1、phpstudy设置勾选php_exif模块 2、php.ini文件配置开启php_exif模块 三、源码分析 四、图片马 1、图片马概念 2、图片马制作 五、渗透实战 1、上传图片马 2、利用文件包含访问图片马 &#xff08;1&#xff09;jpg …...