🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

🔎 深入理解数据库索引

🌲 详解B+树索引

⚡️ 详解哈希索引

💡 如何选择与使用索引?


img

理解数据库索引,尤其是B+树和哈希索引的区别,是进行数据库性能优化的核心知识。下面这张表格能让你快速抓住它们的主要特点。

​特性​

​B+树索引​

​哈希索引​

​核心数据结构​

多路平衡搜索树

哈希表

​查询效率​

近似 O(log n),稳定

理想情况下 O(1),等值查询极快

​是否支持范围查询​

​支持​​(如 BETWEEN, ><

​不支持​

​是否支持排序​

​支持​​(ORDER BY效率高)

​不支持​

​数据组织方式​

数据有序存储(如按主键)

数据无序存储

​适用场景​

​通用场景​​,特别是范围查询、排序、模糊匹配(前缀匹配)

​等值查询​​(如键值查询)、内存表

🔎 深入理解数据库索引

你可以把数据库索引想象成​​一本书的目录​​。如果没有目录,你要查找某个特定内容,只能一页一页地翻遍整本书,这就是“全表扫描”,效率极低。而目录(索引)通过预先按顺序记录所有章节标题和对应的页码,让你能快速定位到所需信息的位置。

数据库索引的本质是一种​​用空间换时间​​的优化策略。它会额外占用存储空间来保存索引数据,但目的是为了极大地加快数据检索速度。当你在表上创建索引后,数据库会生成一个独立的、用于快速查找的数据结构(如B+树或哈希表)。这个数据结构存储了索引字段的值以及指向对应数据行的指针。

🌲 详解B+树索引

B+树是为磁盘或其他直接存取设备设计的一种平衡多路搜索树,它很好地考虑了磁盘读取的特性(按页读取,减少I/O次数)。

  • ​工作原理​​:

    • B+树将数据都存储在​​叶子节点​​上,并且所有叶子节点之间通过指针相连,形成一个有序链表。

    • ​非叶子节点​​只存储键值(索引字段的值)和指向子节点的指针,起到导航作用。

    • 这种结构使得B+树非常适合范围查询。例如,要查找年龄在20到30岁之间的所有用户,数据库只需找到20对应的叶子节点,然后顺着链表扫描直到30即可,效率非常高。

  • ​优点​​:

    • ​支持范围查询和排序​​:这是B+树最核心的优势,使其成为联机事务处理(OLTP)和联机分析处理(OLAP)系统的首选。

    • ​查询性能稳定​​:由于是平衡树,从根节点到任何叶子节点的路径长度基本相等,保证了查询时间的稳定性。

    • ​更适合磁盘I/O​​:树的高度较低,且每次磁盘I/O可以读取一个包含多个键值的大节点(页),从而减少访问磁盘的次数。

  • ​缺点​​:

    • ​维护成本​​:在进行数据插入、删除和更新时,为维持树的平衡,可能需要进行复杂的节点分裂、合并等操作,带来额外开销。

    • ​空间占用​​:非叶子节点只存储键值和指针,整个索引结构会占用额外的存储空间。

  • ​典型应用场景​​:

    • 数据库的​​主键索引​​、​​唯一索引​​、​​普通索引​​通常默认使用B+树。

    • 需要​​范围查询​​的字段,如日期、金额、年龄等。

    • 需要​​排序​​或​​分组​​(ORDER BY, GROUP BY)的字段。

    • 需要​​模糊查询​​(LIKE 'abc%',注意必须是前缀匹配)的字段。

⚡️ 详解哈希索引

哈希索引基于哈希表实现,其核心是通过一个哈希函数将索引键值映射到哈希表中的某个位置(桶)。

  • ​工作原理​​:

    • 对索引列的值应用哈希函数,计算出一个哈希值。

    • 根据这个哈希值直接定位到哈希表中对应的桶(bucket)。

    • 由于可能存在哈希冲突(不同的键值计算出相同的哈希值),每个桶内可能需要存储多个键值对及指向实际数据行的指针,并通过链表等方式解决冲突。

  • ​优点​​:

    • ​等值查询速度极快​​:如果哈希函数设计良好且冲突较少,查询速度可以接近O(1),效率非常高。

  • ​缺点​​:

    • ​不支持范围查询和排序​​:因为哈希函数将数据打散存储,数据间没有顺序性。

    • ​不支持部分索引列查询​​:哈希索引计算哈希值时需要使用所有索引列,因此不支持只使用复合索引的一部分列进行查询。

    • ​存在哈希冲突​​:冲突严重时性能会下降。

    • ​存储引擎支持有限​​:例如在MySQL中,只有Memory引擎显式支持哈希索引。不过,InnoDB引擎提供了一种“自适应哈希索引”功能,当它发现某些索引值被频繁访问时,会在内存中自动为这些热点数据建立哈希索引,以提升查询性能。

  • ​典型应用场景​​:

    • ​键值(Key-Value)存储​​或缓存系统,如Redis。

    • 只进行​​等值查询​​(=IN)的场景。

    • 内存数据库,因为数据在内存中,可以充分发挥其O(1)查询的优势。

💡 如何选择与使用索引?

  1. ​默认选择B+树​​:在绝大多数业务场景下,特别是关系型数据库中,B+树索引是通用且安全的选择。它支持的功能更全面。

  2. ​为查询而非为表建索引​​:索引应该建在经常出现在 WHERE子句、JOIN条件、ORDER BYGROUP BY中的列上。

  3. ​避免过度索引​​:索引不是越多越好。每个索引都会占用空间,并在数据写入(INSERT、UPDATE、DELETE)时带来维护开销。需要平衡查询性能与写入效率。

  4. ​注意最左前缀原则​​:对于复合索引(多个列组成的索引),查询条件必须从索引的最左边列开始匹配,才能有效利用索引。

希望这份详细的解释能帮助你透彻理解数据库索引的核心机制!如果你对特定数据库(如MySQL或PostgreSQL)中索引的具体实现有进一步的问题,我很乐意继续探讨。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐