type
status
date
slug
summary
tags
category
icon
password
😎
近日,设计一个类似于积分系统的模块 在现有有限条件下: - 单实例Redis - 单实例MySQL - 可能单\多实例下的Nest服务 顺便阅读了《高性能MYSQL》一文,其中索引一节。温故知新,在此记录一下并且将来可能会参与实践的一些思考。
 

高效索引

索引的本质

排好序的快速查找数据结构 - 引用自JavaKeeper 海星
除了数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。
notion image
  • 上图左边是一张简单的学生成绩表,只有学号 id 和成绩 score 两列(最左边的是数据的物理地址)
    • 比如我们想要快速查指定成绩的学生,通过构建一个右边的二叉搜索树当索引,索引节点就是成绩数据,节点指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到对应的数据,从而快速检索出符合条件的学生信息。
  • 索引本身也很大,不可能全部存储在内存中,一般以索引文件的形式存储在磁盘上

优势

  • 索引大大减少了服务器需要扫描的数据量(提高数据检索效率)
  • 索引可以帮助服务器避免排序和临时表(降低数据排序的成本,降低 CPU 的消耗)
  • 索引可以将随机 I/O 变为顺序 I/O(降低数据库 IO 成本)

劣势

  • 索引也是一张表,保存了主键和索引字段,并指向实体表的记录,所以也需要占用内存
  • 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE 和 DELETE。 因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息

索引分类

索引分类可以从3个不同的角度切入,逐步在设计时确定索引在业务中设计属于什么分类范畴。
 
  1. 逻辑角度
  • 主键索引:主键索引是一种特殊的唯一索引,不允许有空值
  • 普通索引或者单列索引:每个索引只包含单个列,一个表可以有多个单列索引
  • 多列索引(复合索引、联合索引):复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。
  • 唯一索引或者非唯一索引
  • Full-Text 全文索引:它查找的是文本中的关键词,而不是直接比较索引中的值
  • 空间索引:空间索引是对空间数据类型的字段建立的索引
  1. 数据结构角度
  • Hash 索引:主要就是通过 Hash 算法,将数据库字段数据转换成定长的 Hash 值,与这条数据的行指针一并存入 Hash 表的对应位置;如果发生 Hash 碰撞,则在对应 Hash 键下以链表形式存储。查询时,就再次对待查关键字再次执行相同的 Hash 算法,得到 Hash 值,到对应 Hash 表对应位置取出数据即可,Memory 引擎是支持非唯一哈希索引的,如果发生 Hash 碰撞,会以链表的方式存放多个记录在同一哈希条目中。使用 Hash 索引的数据库并不多, 目前有 Memory 引擎和 NDB 引擎支持 Hash 索引。
  • B+树索引
  1. 物理存储角度
  • 聚集索引(clustered index)
  • 非聚集索引(non-clustered index),也叫辅助索引(secondary index)y

🤗 总结归纳

总结文章的内容

📎 参考文章

  • 一些引用
  • 引用文章
 
💡
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
OpenTSDBB-Money
  • GitTalk
2021-2025 guozichun.

BLOG | Father, Husband, Developer