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

五、数据库索引详解:作用、原理与使用指南

数据库索引详解:作用、原理与使用指南

一、索引的作用(为什么需要索引?)

1. 生活中的类比

想象你要在一本 500 页的书中快速找到「数据库索引」相关内容:

  • 没有目录:需要逐页翻找 → 全表扫描
  • 有目录:直接定位到第 320 页 → 索引查询

2. 数据库中的核心作用

  • 加速数据检索:减少磁盘 I/O 次数
  • 优化排序和分组:避免临时表排序
  • 强制唯一性:通过唯一索引保证数据唯一

3. 性能对比示例

数据量无索引查询耗时有索引查询耗时
10万条200ms5ms
1000万条20秒10ms

二、索引的工作原理

1. B-Tree 索引结构(最常用)

       [ 根节点 ]/     |     \
[分支节点][分支节点][分支节点]/  |  \          /  |  \[叶子节点]... [叶子节点]...

2. 查找过程演示(查找 id=25)

  1. 根节点判断 25 在 20-30 区间
  2. 进入第二个分支节点
  3. 找到叶子节点中的 id=25 记录
  4. 通过指针获取完整数据

3. 索引类型对比

索引类型特点适用场景
B-Tree支持范围查询、排序大多数场景(默认选择)
Hash精确匹配快,不支持范围内存表、等值查询
全文文本关键词搜索文章内容检索

三、索引的创建与使用

1. 创建索引的 SQL 语法

-- 基本语法
CREATE [UNIQUE] INDEX 索引名称 
ON 表名 (字段1, 字段2...);-- 创建普通索引
CREATE INDEX idx_user_name ON users(name);-- 创建联合索引
CREATE INDEX idx_user_age_city ON users(age, city);-- 创建唯一索引
CREATE UNIQUE INDEX idx_user_email ON users(email);

2. 最佳使用场景

使用场景示例 SQL推荐索引
WHERE 条件字段SELECT * FROM users WHERE age=25INDEX(age)
ORDER BY 排序字段SELECT * FROM products ORDER BY priceINDEX(price)
JOIN 关联字段SELECT * FROM orders JOIN users ON orders.user_id=users.idINDEX(user_id)
覆盖索引(查询字段全在索引中)SELECT name FROM users WHERE age>20INDEX(age, name)

四、索引使用注意事项

1. 创建原则

  • 高频查询字段优先
  • 高区分度字段优先(如身份证号比性别更适合)
  • 联合索引字段顺序:常用字段在前,区分度高的在前

2. 最左前缀原则

对于联合索引 (A,B,C)

  • ✅ 有效:WHERE A=1 AND B=2
  • ✅ 有效:WHERE A=1 ORDER BY B
  • ❌ 无效:WHERE B=2 AND C=3

3. 避免索引失效的常见情况

错误写法正确写法原因
WHERE YEAR(create_time)=2023WHERE create_time BETWEEN '2023-01-01' AND '2023-12-31'对索引列使用函数
WHERE name LIKE '%张'WHERE name LIKE '张%'前导通配符
WHERE age+10 > 30WHERE age > 20对索引列进行运算

五、索引的优缺点分析

优点

  • 提升查询速度(量级提升)
  • 加速表之间的连接
  • 减少排序和分组时间

缺点

  • 增加存储空间:索引通常占数据量的 10-30%
  • 降低写操作速度:每次 INSERT/UPDATE/DELETE 需要维护索引
  • 维护成本:需要定期优化重建索引

六、实战案例:电商系统索引优化

原始表结构

CREATE TABLE products (id INT PRIMARY KEY,name VARCHAR(255),category VARCHAR(50),price DECIMAL(10,2),stock INT,created_at DATETIME
);

常见查询场景与索引方案

  1. 场景 1:按分类和价格筛选商品

    SELECT * FROM products 
    WHERE category='电子产品' AND price BETWEEN 1000 AND 5000
    ORDER BY created_at DESC;
    

    索引方案

    CREATE INDEX idx_category_price ON products(category, price);
    
  2. 场景 2:按名称搜索商品

    SELECT * FROM products 
    WHERE name LIKE '苹果%';
    

    索引方案

    CREATE INDEX idx_product_name ON products(name);
    
  3. 场景 3:统计库存紧张的热销商品

    SELECT category, COUNT(*) 
    FROM products 
    WHERE stock < 50 
    GROUP BY category;
    

    索引方案

    CREATE INDEX idx_stock_category ON products(stock, category);
    

七、索引管理命令

1. 查看索引

SHOW INDEX FROM products;

2. 删除索引

DROP INDEX idx_name ON products;

3. 索引维护

-- 重建索引(InnoDB)
ALTER TABLE products ENGINE=InnoDB;-- 分析索引使用情况
ANALYZE TABLE products;

最佳实践总结

  1. 不是越多越好:通常单表索引不超过 5 个
  2. 定期检查无用索引:通过慢查询日志分析
  3. 优先考虑联合索引:减少索引数量
  4. 监控索引效果:使用 EXPLAIN 验证

相关文章:

五、数据库索引详解:作用、原理与使用指南

数据库索引详解&#xff1a;作用、原理与使用指南 一、索引的作用&#xff08;为什么需要索引&#xff1f;&#xff09; 1. 生活中的类比 想象你要在一本 500 页的书中快速找到「数据库索引」相关内容&#xff1a; 没有目录&#xff1a;需要逐页翻找 → 全表扫描有目录&…...

vue使用a-table设置自定义合并字段实现某字段值相同则合并行

背景&#xff1a; 笔者前端使用ant-design-vue,二次开发了a-table,但a-table组件的属性方法都可以用&#xff1b; 业务需求&#xff1a;物资存放在不同的仓库&#xff0c;显示物资统计表格&#xff0c;以物资分组合并显示物资名称、总数量&#xff08;物资A在所有库房总数量&a…...

Docker容器日常维护常用命令大全

友情提示&#xff1a;本文内容由银河易创&#xff08;https://ai.eaigx.com&#xff09;AI创作平台deepseek-v3模型生成&#xff0c;文中所有命令未进行验证&#xff0c;仅供参考。请根据具体情况和需求进行适当的调整和验证。 引言 Docker作为当前最流行的容器化技术&#xf…...

《昇腾推理服务器+DeepSeek大模型》技术培训在图为科技成功举办

2月17日&#xff0c;华为政企业务团队受邀莅临图为科技深圳总部&#xff0c;并成功举办了一场聚焦于《昇腾推理服务器DeepSeek大模型》的专业知识培训。 此次培训活动不仅深化了双方的技术交流&#xff0c;更标志着昇腾AI与DeepSeek大模型的全面融合应用即将迈入实质性落地的新…...

【Java环境】配置极简描述

241220 241220 241220 Java环境配置 下载JDK 注意&#xff1a;最好下载 Long-Term SupportLTS&#xff0c;长期支持版本【目前是JDK21】 下载地址&#xff1a;Java Downloads | Oracle. 下载这个&#xff1a;x64 Installer 。 安装时&#xff0c;路径可改&#xff0c;其余无…...

DeepSeek开源周Day5: 3FS存储系统与AI数据处理新标杆

项目地址&#xff1a; GitHub - deepseek-ai/3FS: A high-performance distributed file system designed to address the challenges of AI training and inference workloads.GitHub - deepseek-ai/smallpond: A lightweight data processing framework built on DuckDB and…...

FastAPI系列:如何配置跨域访问(CORS)

默认情况下&#xff0c;FastAPI应用程序不允许来自不同来源的请求。当你有一个前端应用程序与后端API通信&#xff0c;并且它们托管在不同的域或端口上时&#xff0c;在FastAPI中允许来自不同来源的请求是一种常见的场景。这被称为CORS&#xff08;跨域资源共享&#xff09;&am…...

Flutter 学习之旅 之 flutter 在 Android 端进行简单的打开前后相机预览 / 拍照保存

Flutter 学习之旅 之 flutter 在 Android 端进行简单的打开前后相机预览 / 拍照保存 目录 Flutter 学习之旅 之 flutter 在 Android 端进行简单的打开前后相机预览 / 拍照保存 一、简单介绍 二、简单介绍 camera 三、安装 camera 四、简单案例实现 五、关键代码 一、简单…...

【deepseek第一课】从0到1介绍 采用ollama安装deepseek私有化部署,并实现页面可视化

【deepseek第一课】从0到1介绍 采用ollama安装deepseek私有化部署,并实现页面可视化 1. ollama安装1.1 linux安装1.2 windows安装2. deepSeek支持的7种蒸馏模型2.1 蒸馏模型介绍2.2 7种模型特点2.3 安装deepseek-r1:14b模型3. openwebui图形化页面安装4. java连接大模型的三…...

【Vue3 Teleport 技术解析:破解弹窗吸附与滚动列表的布局困局】

&#x1f31f; Vue3 Teleport 技术解析&#xff1a;破解弹窗吸附与滚动列表的布局困局 &#x1f30d; 背景&#xff1a;传统组件嵌套的布局之痛 在传统前端开发中&#xff0c;组件往往被严格限制在父级 DOM 结构中&#xff0c;这导致三大典型问题&#xff1a; 层级监禁 &…...

鸿蒙HarmonyOS 开发简介

鸿蒙开发入门教程 一、技术简介 鸿蒙操作系统&#xff08;HarmonyOS&#xff09;是面向万物互联时代的全场景分布式操作系统&#xff0c;具备分布式软总线、分布式数据管理、分布式任务调度等核心能力&#xff0c;能让设备间实现无缝连接与协同&#xff0c;为用户提供统一、流…...

VBA技术资料MF276:在集合中使用键

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…...

谈谈 Node.js 中的文件系统(fs)模块,如何进行文件读写操作?

Node.js 文件系统&#xff08;fs&#xff09;模块深度解析与实践指南 一、模块基础与核心能力 Node.js 的 fs 模块提供了完整的文件系统操作能力&#xff0c;涵盖 50 个方法&#xff0c;主要分为以下类型&#xff1a; 文件读写&#xff1a;基础 CRUD 操作目录操作&#xff1…...

Python Cookbook-2.18 从指定的搜索路径寻找文件

任务 给定一个搜索路径(一个描述目录信息的字符串)&#xff0c;需要根据这个路径和请求的文件名找到第一个符合要求的文件。 解决方案 需要循环指定的搜索路径中的目录: import os def search_file(filename,search path&#xff0c;pathsepos.pathsep): """…...

安装Git(小白也会装)

一、官网下载&#xff1a;Git 1.依次点击&#xff08;红框&#xff09; 不要安装在C盘了&#xff0c;要炸了&#xff01;&#xff01;&#xff01; 后面都 使用默认就好了&#xff0c;不用改&#xff0c;直接Next&#xff01; 直到这里&#xff0c;选第一个 这两种选项的区别如…...

工学一体化教育模式的核心内涵及实践意义探究

工学一体化是一种将理论教学与实践操作深度融合的教育模式&#xff0c;旨在通过工作过程与学习过程的有机结合&#xff0c;培养具备综合职业能力和创新能力的技能人才。 一、工学一体化的核心内涵 工学一体化教学模式强调“在工作中学习、在学习中工作”&#xff0c;其核心在于…...

前端正则表达式完全指南:从入门到实战

文章目录 第一章&#xff1a;正则表达式基础概念1.1 什么是正则表达式1.2 正则表达式工作原理1.3 基础示例演示 第二章&#xff1a;正则表达式核心语法2.1 元字符大全表2.2 量词系统详解2.3 字符集合与排除 第三章&#xff1a;前端常用正则模式3.1 表单验证类3.1.1 邮箱验证3.1…...

Chromium项目相关

Chromium项目相关 Chromium 是一个开源浏览器项目&#xff0c;旨在为所有用户构建一种更安全、更快速、更稳定的方式来体验 Web。 自 Google 在 2008 年宣布 Chromium 项目以来&#xff0c;他们一直很高兴能够在开源 Web 浏览器的良好基础上进行构建&#xff0c;并为富 Web 平…...

自动驾驶测试场景相关概念

自动驾驶测试场景 一、概念二、分类2.1、按照场景的抽象程度可分为&#xff1a;功能场景、逻辑场景、具体场景。2.2.、​按功能划分2.3、 ​按环境复杂度2.3、按场景类型 三、要素四、挑战与趋势4.1、长尾场景覆盖​4.2、伦理决策测试​4.3、车路协同测试​4.4、联邦学习驱动​…...

给小白的oracle优化工具,了解一下

有时懒得分析或语句太长&#xff0c;可以尝试用oracle的dbms_sqldiag包进行sql优化&#xff0c; --How To Use DBMS_SQLDIAG To Diagnose Query Performance Issues (Doc ID 1386802.1) --诊断SQL 性能 SET ECHO ON SET LINESIZE 132 SET PAGESIZE 999 SET LONG 999999 SET SER…...

DMA发送全部历史记录数据到串口

背景 博主参与的项目中&#xff0c;有个读取全部历史记录的功能&#xff0c;如果下位机在主程序中将全部历史记录单纯地通过串口传输会比较占用cpu资源&#xff0c;影响主程序中别的功能。最后商量得出以下实现方案&#xff1a; 定义两个发送缓冲区DMATxbuf1和DMATxbuf2&…...

基因型—环境两向表数据分析——品种生态区划分

参考资料&#xff1a;农作物品种试验数据管理与分析 用于品种生态区划分的GGE双标图有两种功能图&#xff1a;试点向量功能图和“谁赢在哪里”功能图。双标图的具体模型基于SD定标和h加权和试点中心化的数据。本例中籽粒产量的GGE双标图仅解释了G和GE总变异的53.6%&#xff0c;…...

电路中如何计算电容容值大小

一个例题&#xff1a; 【电路中电容容值是怎么算出来的&#xff1f;】https://www.bilibili.com/video/BV1RQ4y1c7i1?vd_source3cc3c07b09206097d0d8b0aefdf07958...

c++中迭代器和指针有什么区别?

在 C 中&#xff0c;迭代器和指针虽然在某些场景下有相似的行为&#xff0c;但它们在设计目的、功能和使用场景上有本质区别。以下是详细对比和最佳实践&#xff1a; 一、核心区别对比表 特征指针迭代器本质原生数据类型&#xff0c;直接存储内存地址类对象&#xff0c;抽象容…...

GPT大语言模型与搜索引擎:技术本质与应用场景的深度解析

引言 在人工智能和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;GPT&#xff08;Generative Pre-trained Transformer&#xff09;大语言模型和搜索引擎是两个备受关注的技术。尽管它们都涉及到信息检索和生成&#xff0c;但它们在技术原理、应用场景和用户体验上…...

FreeRTOS-中断管理

实验目的 创建一个队列及一个任务&#xff0c;按下按键 KEY1 触发中断&#xff0c;在中断服务函数里向队列里发送数据&#xff0c;任务则阻塞接 收队列数据。 实验代码 实验结果 这样就实现了&#xff0c;使用中断往队列的发送信息&#xff0c;用任务阻塞接收信息...

计算机毕业设计SpringBoot+Vue.js音乐网站(源码+文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

更换k8s容器运行时环境为docker

更换k8s容器运行时环境为docker k8s-V1.24之后容器运行时默认是containerd&#xff0c;若想改为熟悉的docker作为运行时&#xff0c;需要做以下操作 在每个节点安装containerd、docker; 每个节点安装cri-docker&#xff1b; 调整kubelet配置并重启验证。 1.安装docker、con…...

知识图谱-资源网

知识图谱-资源网 http://openkg.cn/datasets-type/https://www.ownthink.com/knowledge.html...

CTF-web: Rust 的过程宏

Rust 的过程宏&#xff08;Procedural Macros&#xff09;是一种强大的元编程工具&#xff0c;允许你在编译时对代码进行操作和生成。与属性宏和派生宏不同&#xff0c;过程宏可以接收并处理任意 Rust 代码&#xff0c;生成新的代码片段。这里有一个简单的例子来说明 Rust 的过…...