NipGeihou's blog NipGeihou's blog
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档

NipGeihou

我见青山多妩媚,料青山见我应如是
  • Java

    • 开发规范
    • 进阶笔记
    • 微服务
    • 快速开始
    • 设计模式
  • 其他

    • Golang
    • Python
    • Drat
  • Redis
  • MongoDB
  • 数据结构与算法
  • 计算机网络
  • 应用

    • Grafana
    • Prometheus
  • 容器与编排

    • KubeSphere
    • Kubernetes
    • Docker Compose
    • Docker
  • 组网

    • TailScale
    • WireGuard
  • 密码生成器
  • 英文单词生成器
🍳烹饪
🧑‍💻关于
  • 分类
  • 标签
  • 归档
  • MySQL

    • 《高性能MySQL》

      • 「高性能MySQL」创建高性能的索引
        • 索引的类型
          • B-Tree索引
          • 搜索方式
          • 查询类型
          • 限制
          • 哈希索引
          • 查询类型
          • 限制
    • 记录

  • Redis

  • MongoDB

  • 分享

  • 数据库
  • MySQL
  • 《高性能MySQL》
NipGeihou
2022-01-06
目录

「高性能MySQL」创建高性能的索引

索引(在 MySQL 中也叫做 “键 (key)”)是存储引擎用于快速找到记录的一种数据结构。

# 索引的类型

扩展:官方文档 Index Types Per Storage Engine (存储引擎的索引类型) (opens new window)

点击查看
Storage Engine Permissible Index Types
InnoDB (opens new window) BTREE
MyISAM (opens new window) BTREE
MEMORY (opens new window)/ HEAP HASH , BTREE
NDB (opens new window) HASH , BTREE (see note in text)

# B-Tree 索引

image-20220106235556483

存储引擎以不同的方式使用 B-Tree 索引:

MyISAM InnoDB
使用前缀压缩技术,使索引更小 按照原数据格式进行存储
通过数据的物理位置引用被索引的行 根据主键引用被索引的行

# 搜索方式

  • 从索引的根节点开始进行搜索。
  • 根节点的槽中存放了指向子节点的指针,存储引擎根据这些指针向下层查找。
  • 通过比较节点页的值和要查找的值可以找到合适的指针进入下层子节点,这些指针实际上定义了子节点页中值的上限和下限。
  • 最终存储引擎要么是找到对应的值,要么该值不存在。
  • 叶子节点指针指向的是被索引的数据。

# 查询类型

全键值、键值范围、键前缀

  • 全值匹配
  • 匹配最左前缀
  • 匹配列前缀
  • 匹配范围值
  • 精准匹配某一列并范围匹配另一列
  • 只访问索引的查询(覆盖索引)

# 限制

  • 如果不是按照索引最左列开始查找,则无法使用索引
  • 不能跳过索引的列
  • 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查询

# 哈希索引

哈希索引(hash index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。

在 MySQL 中,只有 Memory 引擎显式支持哈希索引,也是 Memory 引擎默认索引类型。

# 查询类型

  • 全值匹配

# 限制

  • 不能覆盖索引
  • 不能用于排序
  • 只能等值比较查找,哈希表的特性所决定的
  • 哈希冲突很多的话,操作代价高,常见于在某个选择性很低(哈希冲突很多)的列上建立哈希索引,那么删除表中的一行时,需要遍历对应哈希值的链表中的每一行,找到并删除对应行的引用。
上次更新: 2024/03/11, 22:37:05
「MySQL」了解LSM-Tree + SSTable

「MySQL」了解LSM-Tree + SSTable→

最近更新
01
Docker Swarm
04-18
02
安全隧道 - gost
04-17
03
Solana最佳实践
04-16
更多文章>
Theme by Vdoing | Copyright © 2018-2025 NipGeihou | 友情链接
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式