MySQL索引详解(上)(结构/分类/语法篇)

一、索引概述

索引本质是帮助MySQL高效获取数据的排序数据结构(类似书籍目录),通过减少磁盘I/O次数提升查询效率。其核心价值体现在大数据量场景下的快速定位能力,但同时带来存储和维护成本。

核心特点

  • 优点
    • 减少数据检索量(时间复杂度从O(n)降至O(log n))
    • 加速排序和分组操作(ORDER BY/GROUP BY)
    • 保证数据唯一性(唯一索引)
  • 缺点
    • 占用额外磁盘空间(索引文件独立存储)
    • 降低写操作性能(INSERT/UPDATE/DELETE需维护索引树)
    • 不恰当的索引设计可能引发性能劣化
二、索引结构
1. B+Tree(主流结构)
  • 层级结构:非叶子节点仅存索引键(Key),叶子节点存储数据指针且形成双向链表 。
  • 优势
    • 树高可控(一般3-4层支撑千万级数据)
    • 范围查询高效(叶子节点链表直接遍历)
    • 适合磁盘存储(节点大小=磁盘页大小,减少I/O)
2. Hash索引
  • 基于哈希表实现,O(1)时间复杂度的等值查询 。
  • 局限性
    • 不支持范围查询和排序
    • 哈希冲突影响性能(链表或红黑树处理)
    • 仅Memory引擎原生支持,InnoDB提供自适应哈希(AHI)
3. 全文索引(Full-Text)
  • 基于倒排索引实现,针对TEXT类型字段进行关键词搜索 。
  • 支持自然语言查询(MATCH...AGAINST语法)
  • 仅InnoDB/MyISAM引擎支持
三、索引分类
按数据结构划分
类型特点适用场景
B+Tree支持范围查询、排序,磁盘友好90%以上的索引场景
Hash等值查询极快,不支持范围操作内存表、精确匹配场景
Fulltext文本关键词搜索文章内容检索
按物理存储划分
类型特点示例
聚集索引数据行存储在叶子节点(InnoDB主键索引)PRIMARY KEY
非聚集索引叶子节点存储主键值或数据地址,需二次查找普通单列/组合索引
按字段特性划分
类型特点语法示例
主键索引唯一且非空,InnoDB的表数据按主键顺序存储PRIMARY KEY (id)
唯一索引列值唯一,允许NULLUNIQUE INDEX (email)
普通索引无唯一性约束,加速查询INDEX (name)
全文索引文本内容分词检索FULLTEXT (content)
按字段数量划分
类型特点优化规则
单列索引单字段索引INDEX (age)
联合索引多字段组合索引,遵循最左前缀原则INDEX (name,age)

特殊类型

  • 覆盖索引:索引包含查询所需全部字段,避免回表 
     (如SELECT id,name FROM users WHERE name='A',若索引是(name,id)
  • 前缀索引:对长字符串前N字符创建索引,节省空间 
    (如INDEX (title(10))
四、索引语法
1. 通用操作
-- 创建索引 
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name ON table_name (col1 [ASC|DESC], ...); 
-- 修改表添加索引 
ALTER TABLE table_name ADD [UNIQUE|FULLTEXT] INDEX index_name (col1, ...); 
-- 删除索引 
DROP INDEX index_name ON table_name;
2. 分类示例

主键索引

-- 建表时指定 
CREATE TABLE users (
id INT AUTO_INCREMENT, 
name VARCHAR(50), 
PRIMARY KEY (id) -- 聚集索引 ); 
-- 修改添加 
ALTER TABLE orders ADD PRIMARY KEY (
order_id);

联合索引

-- 优化多条件查询 
CREATE INDEX idx_name_age ON employees (
last_name, hire_date);

全文索引

-- 支持文本搜索 
CREATE FULLTEXT INDEX ft_content ON articles (content); 
SELECT * FROM articles WHERE MATCH(content) AGAINST('数据库');

前缀索引

-- 长字段优化 
CREATE INDEX idx_city_prefix ON customers (city(10));
五、设计原则
  1. 高频查询字段优先(WHERE/JOIN/ORDER BY)
  2. 区分度高字段前置(如性别字段不宜单独建索引)
  3. 避免过度索引(超过5个索引需谨慎评估)
  4. 联合索引左前缀匹配INDEX(a,b,c)适用a=1 AND b>2,不适用b>2
  5. 长文本使用前缀/全文索引

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

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

相关文章

数据集-目标检测系列- 烟雾 检测数据集 smoke >> DataBall

数据集-目标检测系列- 消防 浓烟 检测数据集 smoke>> DataBall 数据集-目标检测系列- 烟雾 检测数据集 smoke >> DataBall * 相关项目 1)数据集可视化项目:gitcode: https://gitcode.com/DataBall/DataBall-detections-10…

docker + K3S + Jenkins + Harbor自动化部署

最近公司在研究自动化部署的一套流程,下面记录一下配置流程 需要提前准备好Jenkins Harbor Git(其他管理工具也可以) 我这里的打包编译流程是Jenkins上配置打包任务-->自动到git目录下找打包文件---->项目编译后打镜像包------>打完镜像包将镜像上传到…

《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-《打砖块:向量反射与实时物理模拟》MATLAB教程

《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇(2D图形交互)-《打砖块:向量反射与实时物理模拟》MATLAB教程 🎮 文章目录 《用MATLAB玩转游戏开发:从零开始打造你的数字乐园》基础篇&#xff08…

Redisson 看门狗机制

何为看门狗 看门狗机制的主要作用是自动续期锁,确保在节点完成任务之前,锁不会过期。具体来说,当一个节点获取到锁后,看门狗会定期检查该锁的过期时间,并在必要时延长锁的过期时间,确保节点可以顺利完成任…

[架构之美]linux常见故障问题解决方案(十九)

[架构之美]linux下常见故障问题解决方案 一,文本文件忙 问题一:rootwh-VMware-Virtual-Platform:/home/hail# cp /root/containerd/bin/* /usr/bin/ cp: 无法创建普通文件 ‘/usr/bin/containerd’: 文本文件忙 在Linux系统中遇到“文本文件忙”错误时…

QT实现曲线图缩放、拖拽以及框选放大

.h文件 protected: void saveAxisRange();void wheelEvent(QWheelEvent *event) override;void mousePressEvent(QMouseEvent *event) override;void mouseMoveEvent(QMouseEvent *event) override;void mouseReleaseEvent(QMouseEvent *event) override;private:QPoint m_…

【Pandas】pandas DataFrame corr

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.any(*[, axis, bool_only, skipna])用于判断…

青藏高原七大河流源区径流深、蒸散发数据集(TPRED)

时间分辨率 月空间分辨率 1km - 10km共享方式 开放获取数据大小 83.27 MB数据时间范围 1998-07-01 — 2017-12-31元数据更新时间 2024-07-22 数据集摘要 通过构建耦合积雪、冻土、冰川等冰冻圈水文物理过程的WEB-DHM模型(Water and Energy Budget-based Distribute…

window环境下,如何通过USB接口控制打印机

虽然说大多数情况下,我们可以非常便利的通过打印机驱动来控制打印机,但还是有一些特殊情况,导致无法通过打印机驱动来完成我们预想的任务,比如,打印机只是一个系统设备中的一部分,需要协调其它设备一起工作…

CDGP数据治理主观题评分标准与得分策略

1.数据模型题目评分标准 1)准确理解题目中所描述的业务逻辑和需求得[1分] 2)正确使用模型设计方法,使用信息工程、信息建模集成定义、巴克符号、陈氏符号等其中一种得[1分] 3)正确设计实体和属性,题目中涉及的实体数量为25-30个,10个以内得[2分],10-20个得[3分],25个…

工业设计破局密码:3D 可视化技术点燃产业升级引擎

3D可视化是一种将数据、信息或抽象概念以三维图形、模型和动画的形式呈现出来的技术。3D可视化技术通过构建三维数字孪生体,将设计思维转化为可交互的虚拟原型,不仅打破了传统二维设计的空间局限,更在效率、精度与用户体验层面开创了全新维度…

Qt中在子线程中刷新UI的方法

Qt中在子线程中刷新UI的方法 在Qt中UI界面并不是线程安全的,意味着在子线程中不能随意操作UI界面组件(比如按钮、标签)等,如果强行操作这些组件有可能会导致程序崩溃。那么在Qt中如何在子线程中刷新UI控件呢? 两种方…

为了摸鱼和吃瓜,我开发了一个网站

平时上班真的比较累,摸鱼和吃瓜还要跳转多个平台的话,就累上加累了。 所以做了一个聚合了全网主流平台热搜的网站。 目前市面上确实有很多这种网站了,所以目前最主要有两点和他们不同: 给热搜列表增加了配图,刷的时候…

操作系统学习笔记第2章 (竟成)

第 2 章 进程管理 【考纲内容】 1.进程与线程: (1) 进程 / 线程的基本概念; (2) 进程 / 线程的状态与转换; (3) 线程的实现:内核支持的线程;线程库支持的线程; (4) 进程与线程的组织与控制; (5)…

77.评论日记

房间要经常搞卫生,不然会很多灰,很多头发,很多垃圾。 当然,即使一直搞卫生,在一些看不到的角落也是会慢慢囤积垃圾。 想要把那些角落也打扫干净,没别的办法,只有把那个角落上所有的东西都移开&a…

语音合成之十二 TTS声学编解码器的演进

TTS声学编解码器的演进 1 引言:声码器/声学编解码器在现代TTS中的关键作用2 奠定基石:从早期声码器到神经合成的曙光3. HiFi-GAN: 革新高效高保真波形生成4. 新的疆域:面向富语义TTS的先进声学编解码器5. XCodec2.0: 统一声学与语义信息6.BiC…

大学之大:悉尼科技大学2025.5.10

悉尼科技大学:从技术先驱到全球创新枢纽的百年征程 一、历史沿革:从技工培训到世界百强名校的蜕变 1. 工业革命的技术火种(1843-1945) 悉尼科技大学的历史可追溯至1843年成立的悉尼机械学院(Sydney Mechanics’ Scho…

安装阿里云的yum源并且下载软件(CentOS7版本)

目录 1. 进入root模式: 2. 进入yum.repos.d文件下 3.备份 4. 安装阿里云的yum源 5. 安装dnf 6. 安装epel-release 7. 清除缓存,并新建缓存 8. 安装智能拼音软件包 8.1安装 8.2 进入应用程序 -- 系统工具 -- 设置 8.3重启后就可以打中文啦~ (需要重新启动才能)…

Discriminative and domain invariant subspace alignment for visual tasks

用于视觉任务的判别性和域不变子空间对齐 作者:Samaneh Rezaei,Jafar Tahmoresnezhad 文章于2018年12月4日收到,2019年5月24日被接受,2019年6月3日在线发表于Iran Journal of Computer Science期刊,DOI: 10.1007/s42…

用jsp简单实现C语言标准化测试系统

C语言标准化测试系统 在Web编程技术的学习过程中,我们小组为了深入理解相关技术原理,提升实践能力,开发了一个基于动态Web工程框架的C语言标准化考试系统。现在,就来和大家分享一下我们的项目经历。 一、实验目的剖析 这个项目…