MySQL 数据库索引详解

一、索引是什么?能干嘛?

类比理解:索引就像书的目录。比如你想查《哈利波特》中 “伏地魔” 出现的页数,不用逐页翻书,直接看目录找关键词就行。数据库里的索引就是帮你快速找到数据的 “目录”。

核心作用:

  • 提速查询:把 “全表扫描”(逐行找数据)变成 “精准定位”,查询速度从 “翻完整本书” 变成 “查目录找页码”。
  • 约束数据:比如主键索引能保证数据不重复(像身份证号唯一)。
  • 加速排序:索引本身是有序的,排序时不用临时整理数据。

二、索引的 4 种主要类型(附通俗例子)

1. BTree 索引(最常用的 “万能索引”)

  • 原理:像字典的拼音目录,按顺序排列(如 a-b-c...),支持范围查询(如查 “年龄> 18”)和精准查询。
  • 适用场景:90% 的场景都能用,比如:
    CREATE INDEX idx_age ON users(age);  -- 给年龄字段建索引
    
  • 类比:查字典时,知道 “张三” 的拼音,直接按字母顺序翻到对应页。

2. Hash 索引(“快速匹配器”)

  • 原理:把数据变成 “哈希值”(类似快递单号),查数据时直接 “对单号”,速度极快(O (1))。
  • 限制:只能精准匹配(如WHERE id=1),不能查范围(如id>100),且仅内存表(MEMORY 引擎)可用。
  • 类比:快递柜取件,输入单号直接开门,无法 “找所有单号大于 100 的快递”。

3. 全文索引(“文本搜索神器”)

  • 原理:专门针对文章、评论等长文本,把关键词拆分成 “词条” 存储(类似搜索引擎的关键词索引)。
  • 适用场景:查 “包含‘MySQL’的文章”,用MATCH AGAINST语句:
    CREATE FULLTEXT INDEX idx_article ON articles(content);
    
  • 注意:MySQL 5.7 + 优化后性能更好,别用 LIKE '% 关键词 %'(太慢)。

4. 空间索引(“地图专用索引”)

  • 原理:存储地理坐标(如经纬度),支持 “查找附近 5 公里的咖啡店” 这类查询。
  • 适用场景:外卖 APP 找附近商家、地图软件标地点。
  • 限制:字段必须是 GEOMETRY 类型(如点、线、面),InnoDB 引擎从 5.7 开始支持。

三、啥时候该建索引?啥时候别建?

✅ 建议建索引的情况:

  1. 经常用来查询的字段:比如WHERE name='张三'中的 name 字段。
  2. 表关联字段:多表 JOIN 时的关联字段(如订单表的 user_id 关联用户表)。
  3. 唯一性字段:主键(id)、邮箱(唯一不重复)。
  4. 频繁排序的字段:如ORDER BY create_time,索引自带顺序,不用额外排序。

❌ 不建议建索引的情况:

  1. 数据重复率高的字段:比如 “性别”(只有男 / 女),建索引还不如直接全表扫描快。
  2. 频繁更新的字段:比如 “在线状态”,每次修改都要更新索引,影响性能。
  3. 小表数据:表只有 100 行数据,全表扫描比查索引更快(索引本身也占空间)。
  4. 不参与查询的字段:建了索引也用不上,纯属浪费空间。

四、复合索引:多个字段 “组队” 加速查询

1. 什么是复合索引?

  • 给多个字段一起建索引,比如(name, age),相当于 “组合目录”。
  • 语法:
    CREATE INDEX idx_name_age ON users(name, age);
    

2. 最左前缀原则(必须掌握!)

  • 规则:查询条件必须从左到右使用索引中的字段,不能跳过。
  • 示例:索引是(name, age),支持:
    WHERE name='张三' AND age=18;  -- 正确,用全索引
    WHERE name='张三';  -- 正确,用name部分
    

    不支持:
    WHERE age=18;  -- 错误,跳过了name,索引失效
    WHERE name='张三' AND age=18 AND address='北京';  -- 正确,address不影响,前两个字段用上索引
    
  • 类比:索引像 “省 - 市 - 区” 的地址,你必须先指定 “省”,才能用索引快速定位,直接查 “区” 无法用索引。

五、索引优化:让查询飞起来的技巧

1. 覆盖索引:“不回表” 的高效查询

  • 定义:查询的所有字段都在索引里,不用再回表查数据(类似查目录时直接拿到所有需要的信息,不用翻书)。
  • 示例
    -- 表结构:users(id, name, age)
    CREATE INDEX idx_name_age ON users(name, age);  -- 索引包含name和age
    SELECT name, age FROM users WHERE name='张三';  -- 直接从索引取数据,不用回表
    

2. 索引失效场景(避坑指南)

  • 用了函数或表达式
    WHERE UPPER(name)='ZHANGSAN';  -- 对name做了大写转换,索引失效
    
  • 类型不匹配
    WHERE id='123';  -- id是数字类型,传字符串可能导致索引失效
    
  • 模糊查询以通配符开头
    WHERE name LIKE '%张三';  -- 无法用索引(不知道从哪开始查)
    
  • OR 条件分隔无关联字段
    WHERE id=1 OR name='张三';  -- 若id和name没有共同索引,可能失效
    

3. 索引管理命令(常用)

  • 创建索引
    CREATE INDEX idx_name ON users(name);  -- 普通索引
    CREATE UNIQUE INDEX idx_email ON users(email);  -- 唯一索引
    
  • 删除索引
    DROP INDEX idx_name ON users;
    
  • 查看索引
    SHOW INDEX FROM users;
    
  • 分析查询是否用索引
    EXPLAIN SELECT * FROM users WHERE name='张三';  -- 看执行计划中的Key列
    

六、不同引擎的索引差异(简单了解)

引擎支持的索引类型特点
InnoDBBTree、全文、空间数据和索引存一起(聚簇索引),适合事务
MyISAMBTree、全文、RTree索引和数据分开存,不支持事务
MemoryHash、BTree数据在内存,查询极快,但重启数据丢失

七、实战案例:电商订单表索引优化

场景:

查询 “近 30 天内,已支付(status=2)且金额> 1000 的订单”,按时间倒序。

表结构:

CREATE TABLE orders (id BIGINT PRIMARY KEY,user_id BIGINT,order_time DATETIME,status TINYINT,amount DECIMAL(10,2)
);

优化方案:

  1. 创建联合覆盖索引
    CREATE INDEX idx_status_time_amount ON orders(status, order_time, amount);
    
  2. 查询语句
    SELECT id, user_id, amount FROM orders 
    WHERE status=2 AND order_time >= NOW() - INTERVAL 30 DAY AND amount > 1000
    ORDER BY order_time DESC;
    

优化原理:

  • 联合索引(status, order_time, amount)满足最左前缀原则,先按状态筛选,再按时间和金额过滤。
  • order_time在索引中是有序的,查询时直接按倒序取,不用额外排序。
  • 查询字段id, user_id, amount都在索引中(id是主键,默认在索引里),实现覆盖索引,不回表。

八、索引使用的核心原则(必记!)

  1. 少而精:单表索引不超过 5 个,避免过度索引(每个索引都增加写入开销)。
  2. 联合索引优先:多个字段频繁一起查询时,建联合索引比多个单列索引更高效。
  3. 覆盖索引优先:让查询字段尽量在索引中,减少 “回表” 操作。
  4. 定期维护:用ANALYZE TABLE更新索引统计信息,用EXPLAIN分析慢查询是否用了索引。
  5. 避免坑点:不用函数处理字段、不写SELECT *(只查需要的字段)、模糊查询用LIKE '关键词%'(别以通配符开头)。

通过合理设计索引,MySQL 查询性能能提升 10-100 倍!但记住:索引不是越多越好,要在 “查询速度” 和 “写入速度” 之间找平衡哦~

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

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

相关文章

【620公司工作记录】

已有数据汇总 好的,完全同意。在编写新代码之前,清晰地盘点我们手中已有的“弹药”是至关重要的一步。 根据您提供的 test/20250610_88_100mm_frame_000.csv 文件头,我来为您完整地解析一下我们当前拥有的全部数据字段。我们的数据是以“行”为单位组织的,每一行都代表一…

SpringBoot 集成Caffeine实现一级缓存

SpeingBoot 集成Caffeine实现一级缓存使我们经常遇到的场景。今天我们具体分享一下: 首先 Caffeine 作为一级缓存,它是 Spring 5.x 默认的本地缓存实现,性能优于 Guava Cache,且支持过期时间设置。缓存执行的流程图如下&#xff…

中科米堆3D自动扫描检测系统三维数字化智能解决方案

3D自动扫描检测系统基于先进的光学、激光或结构光等测量技术,能够快速、准确地获取工件的三维几何数据。在检测过程中,系统通过向被测工件投射特定的光模式,利用高分辨率相机捕捉工件表面的反射光信息,再经过复杂的算法处理&#…

Unity3d中使用Mirror进行自定义消息通信

一、服务端: 1.创建服务端脚本MyServer.cs 继承自NetworkManager类 using Mirror; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class MyServer : NetworkManager {[Header(&quo…

Odoo 18 固定资产管理自动化指南

如何在Odoo 18中实现资产管理自动化 1. 创建资产模型实现资产管理自动化 使用 Odoo 18 的会计模块,资产的创建和确认可轻松实现自动化。这将使资产管理变得更加简单高效。使用资产自动化功能,一旦验证相关产品的供应商账单,Odoo将自动生成并…

如何轻松地将音乐从 iPhone 传输到 Mac?

想把音乐从 iPhone 传输到 Mac 吗?这很常见,无论你是想更换设备、备份收藏,还是只想在更大的屏幕上欣赏喜爱的歌曲。幸运的是,有 6 种有效的方法可以完成这项工作,具体取决于你喜欢使用的工具。让我们开始吧。 第 1 部…

人工智能——解读AI智慧课堂系统解决方案【附全文阅读】

该文档是 AI 智慧课堂系统解决方案,聚焦教育信息化需求,通过 AI 技术与教学深度融合,解决传统课堂考勤效率低、资源管理难、分析不精准等问题。 方案以课堂为核心,构建 “背景分析 - 方案设计 - 优势价值” 框架,技术架构涵盖教师摄像机、学生抓拍机、智能录播主机等设备,…

使用Nginx的RTMP模块进行直播流转HLS时,处理和预防`.ts`文件过多

当使用Nginx的RTMP模块进行直播流转HLS时,如果长时间运行或处理大量流媒体内容,可能会遇到.ts文件累积过多的问题。这不仅会占用大量的磁盘空间,还可能影响系统性能。以下是一些处理和预防.ts文件过多的方法: 1. 配置HLS清理 Nginx RTMP模块允许配置HLS片段的过期时间,这…

结构体解决冒泡排序

设计英雄的结构体 //1、设计结构体 struct Hero {string name;//姓名int age;//年龄string sex;//性别 };创建英雄的数组 //2、创建数组存放英雄 struct Hero Array[5] {{"刘备", 34 ,"男"},{"关羽", 45 ,"男"},{"张飞",…

spring-webmvc @RequestParam 典型用法

典型用法 基本使用 HTTP请求参数绑定到方法参数 GetMapping("/users") public String getUsers(RequestParam String name) {return "Hello, " name; }请求:/users?nameJohn 输出:Hello, John-----GetMapping("/filter&qu…

AntDesignPro前后端权限按钮系统实现

目录 Ant Design Pro 后端接口权限按钮系统 系统架构图 前端实现 权限按钮组件 (AuthButton.tsx) 权限钩子 (useAccess.ts) 权限服务 (permission.ts) 产品列表页面 (ProductList.tsx) 后端接口设计 (Node.js Express 示例) 权限接口控制器 (permissionController.js…

RAG工程落地:处理文档中表格数据

在 RAG(Retrieval-Augmented Generation)工程落地过程中,处理文档中的表格数据 是一个非常重要但复杂的问题,特别是针对技术文档、报告、论文等结构化强的资料。比如PDF文档里的表格数据,如下: RAG处理表格…

大模型在肺癌预测及个性化诊疗方案中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 国内外研究现状 二、大模型预测肺癌的原理与方法 2.1 大模型概述 2.2 数据收集与预处理 2.3 特征工程 2.4 模型训练与优化 三、术前预测与方案制定 3.1 病情评估 3.1.1 肿瘤大小、位置及分期预测 3.1.…

如何高效分享WordPress博客文章

在当今信息过载的时代,写好一篇优秀的 WordPress 博客文章只是起点,如何有效地分享给更多读者才是成功的关键所在。对于新手用户而言,选择合适的工具和平台尤为重要。现在许多服务器提供商支持一键安装WordPress功能,比如 Hosteas…

以孝治家有机农业生态文明考察组赴邯郸心田农场考察学习

按照2025年中共中央、国务院印发了关于《乡村全面振兴规划(2024—2027年)》的战略部署。根据《乡村全面振兴规划》提出的“坚持人与自然和谐共生。牢固树立和践行绿水青山就是金山银山的理念,落实节约优先、保护优先、自然恢复为主的方针&…

解决el-input无法输入的问题 vue2+element el-input

问题描述: 在el-dialog中el-form组件来做表单提交 中文输入模式: 在初次输入的时候能输入内容 但是再次输入无法更改内容 英文输入模式: 只能输入一个英文 很多文章都是说 是双向绑定的问题 但是我仔细看了 变量的双向绑定确实没毛病 直到我发现了是因为我el-input中的图…

16_集成学习

描述 集成学习(Ensemble Learning)是一种通过结合多个模型的预测结果来提高整体性能的技术。集成学习的核心思想是通过多个弱学习器的组合,可以构建一个强学习器。 sklearn中常见的集成学习算法: Bagging:通过自助采…

学习STC51单片机43(芯片为STC89C52RCRC)智能小车9(语音识别小车)

每日一言 不必与他人比较速度,你走的每一步都在书写自己的传奇。 案例:语音识别小车 这个是最后一个功能了,其实就是用语音功能让小车自己切换各种模式,当然了我们需要先学习一下语音模块 硬件:SU-03T 这个叫做非特定…

Android 中 解析 XML 字符串的几种方式

在 Android 开发中,解析 XML 文件有多种方式,每种方式都有其特点和适用场景。常见的 XML 解析方式有 DOM 解析、SAX 解析 和 XmlPullParser 解析。 1、DOM 解析 DOM(Document Object Model)解析是一种基于树结构的解析方式&#…

云端算力革命:川翔云电脑如何重新定义创作自由

在设计与科技深度融合的时代,高性能硬件的桎梏正成为创意释放的最大障碍。川翔云电脑以云端算力为支点,通过弹性算力、高效存储、多端接入三大核心优势,让顶级 GPU 资源触手可及。 一、核心优势:突破物理极限的云端工作站 弹性算…