type
status
date
slug
summary
tags
category
icon
password
近日,设计一个类似于积分系统的模块
在现有有限条件下:
- 单实例Redis
- 单实例MySQL
- 可能单\多实例下的Nest服务
顺便阅读了《高性能MYSQL》一文,其中索引一节。温故知新,在此记录一下并且将来可能会参与实践的一些思考。
高效索引
索引的本质
排好序的快速查找数据结构 - 引用自JavaKeeper 海星
除了数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

- 上图左边是一张简单的
学生成绩表
,只有学号 id 和成绩 score 两列(最左边的是数据的物理地址)
比如我们想要快速查指定成绩的学生,通过构建一个右边的二叉搜索树当索引,索引节点就是成绩数据,节点指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到对应的数据,从而快速检索出符合条件的学生信息。
- 索引本身也很大,不可能全部存储在内存中,一般以索引文件的形式存储在磁盘上
优势
- 索引大大减少了服务器需要扫描的数据量(提高数据检索效率)
- 索引可以帮助服务器避免排序和临时表(降低数据排序的成本,降低 CPU 的消耗)
- 索引可以将随机 I/O 变为顺序 I/O(降低数据库 IO 成本)
劣势
- 索引也是一张表,保存了主键和索引字段,并指向实体表的记录,所以也需要占用内存
- 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 INSERT、UPDATE 和 DELETE。 因为更新表时,MySQL 不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息
索引分类
索引分类可以从3个不同的角度切入,逐步在设计时确定索引在业务中设计属于什么分类范畴。
- 逻辑角度
主键索引
:主键索引是一种特殊的唯一索引,不允许有空值
普通索引
或者单列索引
:每个索引只包含单个列,一个表可以有多个单列索引
多列索引
(复合索引、联合索引):复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。
唯一索引
或者非唯一索引
Full-Text
全文索引:它查找的是文本中的关键词,而不是直接比较索引中的值
空间索引
:空间索引是对空间数据类型的字段建立的索引
- 数据结构角度
Hash
索引:主要就是通过Hash
算法,将数据库字段数据转换成定长的Hash
值,与这条数据的行指针一并存入Hash
表的对应位置;如果发生Hash
碰撞,则在对应Hash
键下以链表形式存储。查询时,就再次对待查关键字再次执行相同的Hash
算法,得到Hash
值,到对应Hash
表对应位置取出数据即可,Memory
引擎是支持非唯一哈希索引的,如果发生Hash
碰撞,会以链表的方式存放多个记录在同一哈希条目中。使用Hash
索引的数据库并不多, 目前有Memory
引擎和NDB
引擎支持Hash
索引。
B+树
索引
- 物理存储角度
- 聚集索引(clustered index)
- 非聚集索引(non-clustered index),也叫辅助索引(secondary index)y
🤗 总结归纳
总结文章的内容
📎 参考文章
- 一些引用
- 引用文章
有关Notion安装或者使用上的问题,欢迎您在底部评论区留言,一起交流~
- 作者:guozichun
- 链接:https://blog.yayh.life/article/e1e0304d-6849-438f-b16b-5e65afa746fa
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。