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

数据库索引详解:原理、设计原则与应用场景

一、什么是索引?

索引(Index) 是数据库中一种提高数据查询效率的数据结构。它的核心思想就类似于书籍的目录——当你需要查找某个内容时,可以快速定位到该内容所在的页码,而不是从第一页开始翻。

在数据库中,索引的底层通常使用 B+ 树哈希表 结构来加速数据的定位。最常见的是 B+ 树索引,因为它支持范围查询和有序遍历,适用于大多数业务场景。


二、索引的设计原则(解释+原因)

编号原则原因说明
1数据量大、查询频繁的表建立索引避免全表扫描,大大提升查询性能。小表不需要索引,因为扫描成本本身就低。
2WHERE、ORDER BY、GROUP BY字段上建立索引这些操作需要频繁遍历或排序,若无索引只能全表扫描或排序,效率低。
3选择区分度高的列建立索引区分度高 = 唯一性强,可以快速过滤掉大量无关行,提高查询效率。
4字符串字段可使用前缀索引长字符串全字段建索引浪费空间、性能差,前缀索引节省空间,牺牲一点查询准确率。
5优先考虑联合索引(覆盖索引)减少回表操作,同时避免多个单列索引带来的“索引失效”或“最左前缀限制”问题。
6控制索引数量索引越多,增删改操作的代价越高(需维护多个索引结构),影响写入性能。
7NOT NULL优化索引判断有 NULL 的列不利于优化器准确评估索引使用价值,NOT NULL 会更利于索引使用。

三、哪些字段适合建立索引?

适合建立索引的字段:

  1. WHERE条件中经常使用的字段

    • 例如:用户表中的 user_id、订单表中的 order_no
  2. JOIN操作中用作关联条件的字段

    • 如:外键字段 user_id, product_id
  3. ORDER BY / GROUP BY中出现频繁的字段

    • 如:文章表中的 created_at、评论表中的 article_id
  4. 区分度高的字段(例如唯一ID)

    • 如:email身份证号手机号
  5. 经常作为分页条件的字段

    • 如:按 idcreated_at 分页查询
  6. 联合索引覆盖查询所需字段

    • 如:创建 index(user_id, status) 可以用于 where user_id = ? and status = ? 的查询

四、哪些字段不适合建立索引?

不适合建立索引的字段:

  1. 频繁变更的字段

    • 每次更新都会引起索引的维护,如频繁变动的 last_login_time
  2. 区分度低的字段

    • 如:genderis_deletedstatus 等只有几个值,索引无法有效过滤数据
  3. 不参与查询/排序/分组的字段

    • 比如备注类字段 description, comment
  4. 很少查询的冷数据表字段

    • 如历史归档表的字段,使用频率低,没必要增加索引开销
  5. 长文本字段

    • 如:text, blob, json,这些字段即使能索引,性能也不会好,建议避免索引。

五、小结

类型举例是否适合索引
高频查询字段user_id、order_no适合
状态字段status(0/1/2)通常不适合(除非与其他字段联合)
排序字段created_at、updated_at适合
备注类字段description、comment不适合
外键字段product_id、user_id适合
低区分度字段gender、type(枚举类)不适合(可用于联合索引)

http://www.xdnf.cn/news/1191583.html

相关文章:

  • 渲染篇(二):解密Diff算法:如何用“最少的操作”更新UI
  • Word文档转HTML查看器(字体颜色、字体背景、超链接、图片、目录等全部转换为html),统计Word文档段落数量、图片数量、表格数量、列表数量
  • HTML5元素相关补充
  • 小架构step系列26:Spring提供的validator
  • CS231n-2017 Lecture7训练神经网络(二)笔记
  • 三防平板搭载2D扫描头:工业数据采集的革新利器
  • Vue3 学习教程,从入门到精通,Vue3 样式绑定语法详解与案例(17)
  • 零基础 “入坑” Java--- 十四、【练习】图书小系统
  • 一、Spring框架结构组成详解
  • Transformer:颠覆NLP的自注意力革命
  • C++___快速入门(上)
  • 图解网络-小林coding笔记(持续更新)
  • Creating Strings
  • [特殊字符] 嵌入式队列精要指南:数据流的艺术与实战
  • Java学习|黑马笔记|Day23】网络编程、反射、动态代理
  • 【动态规划-斐波那契数列模型】理解动态规划:斐波那契数列的递推模型
  • MongoDB数据库高并发商业实践优化·运行优化之不可使用root账户进行MongoDB运行-优雅草卓伊凡
  • 大型微服务项目:听书——12 数据一致性自定义starter封装缓存操作
  • MongoDB数据模型
  • 深度学习(鱼书)day03--神经网络(后两节)
  • 7月26日星期六今日早报简报微语报早读
  • Oracle 误删数据恢复
  • 服务器被网络攻击后该如何进行处理?
  • golang实现一个定时引擎,功能包括按照corntab的时间任务实时增加、修改、删除定时任务
  • C++11 -- emplace、包装器
  • C++ 类型萃取:深入理解与实践
  • MySQL 8.0 OCP 1Z0-908 题目解析(36)
  • pip, github 突然连不上?报错和解决方法如下
  • MyBatis-Plus 通用 Service
  • 基于MySQL实现基础图数据库