《MySQL 实战 45 讲》课程学习笔记(四)

深入浅出索引

  • 索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。

索引的常见模型

哈希表

  • 哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。
  • 哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。
  • 不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。
  • 哈希表这种结构适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL 引擎。

有序数组

  • 有序数组在等值查询和范围查询场景中的性能就都非常优秀。
  • 有序数组索引只适用于静态存储引擎。

二叉搜索树

  • 二叉搜索树的特点是:每个节点的左儿子小于父节点,父节点又小于右儿子。
  • 为了维持 O(log(N)) 的查询复杂度,你就需要保持这棵树是平衡二叉树。为了做这个保证,更新的时间复杂度也是 O(log(N))。
  • 树可以有二叉,也可以有多叉。多叉树就是每个节点有多个儿子,儿子之间的大小保证从左到右递增。二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不使用二叉树。其原因是,索引不止存在内存中,还要写到磁盘上。
  • N 叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了。

InnoDB 的索引模型

  • InnoDB 使用了 B+ 树索引模型,所以数据都是存储在 B+ 树中的。每一个索引在 InnoDB 里面对应一棵 B+ 树。
  • 根据叶子节点的内容,索引类型分为主键索引和非主键索引。
    • 主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。
    • 非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。
    • 基于非主键索引的查询需要多扫描一棵索引树,即回表。因此,我们在应用中应该尽量使用主键查询。
  • 自增主键的插入数据模式,符合递增插入的场景。
    • 每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。
    • 而有业务逻辑的字段做主键,则往往不容易保证有序插入,这样写数据成本相对较高。
    • 主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小。
  • 覆盖索引
    • 由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。
  • 最左前缀原则
    • B+ 树这种索引结构,可以利用索引的"最左前缀",来定位记录。
    • 不只是索引的全部定义,只要满足最左前缀,就可以利用索引来加速检索。
    • 这个最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。
  • 在建立联合索引的时候,如何安排索引内的字段顺序?
    • 第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。
  • 索引下推
    • 索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。
    • 在满足语句需求的情况下, 尽量少地访问资源是数据库设计的重要原则之一。
    • 我们在使用数据库的时候,尤其是在设计表结构时,也要以减少资源消耗作为目标。
相关推荐
油丶酸萝卜别吃5 小时前
前端转全栈学习路线
前端·学习
GlueNa2SiO38 小时前
第十八章 Linux故障排查与恢复
linux·服务器·笔记·学习
weixin_431600449 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
灯澜忆梦9 小时前
【MySQL10】进阶篇 | 索引_#2性能优化
数据库·sql·mysql·性能优化
带娃的IT创业者9 小时前
DeepTutor:当 Agent-Native 架构撞上个性化学习的临界点
学习·架构·ai agent·大模型应用·个性化学习·教育技术·agent-native架构
xian_wwq9 小时前
【学习笔记】Context Engineering,AI Agent 真正的内存管理-4/16
笔记·学习·context
寒月小酒10 小时前
AnythingLLM 学习
学习
疯狂打码的少年11 小时前
【数据结构】队列:定义、顺序队列与链式队列
数据结构·笔记
LeoZY_13 小时前
LinkScope 使用笔记:基于 OpenOCD 的通用硬件芯片调试助手
笔记·单片机·嵌入式硬件·开源软件
不会代码的小猴13 小时前
标准模板库(STL)
开发语言·c++·笔记·算法