Tim

一枚野生程序员~

  • 主页
  • 分类
  • 标签
  • 归档
  • 关于
所有文章 工具

Tim

一枚野生程序员~

  • 主页
  • 分类
  • 标签
  • 归档
  • 关于

密集索引和稀疏索引

阅读数:次 2020-02-26
字数统计: 670字   |   阅读时长≈ 2分

密集索引:文件中的每个搜索码值都对应一个索引值,就是叶子节点保存了整行,比如InnoDB

稀疏索引:文件只为索引码的某些值建立索引项,比如MyISAM

mark

密集索引的表数据按顺序存储,即索引顺序和表记录物理存储顺序一致,所以一个表只能创建一个密集索引

InnoDB的密集索引的选取规则是怎么样的呢?

1、若一个主键被定义,该主键则作为密集索引
2、若没有主键被定义,该表的第一个唯一非空索引则作为密集索引
3、若不满足以上条件,InnoDB内部会生成一个隐藏主键(密集索引)
4、非主键索引存储相关键位和其对应的主键值,包含两次查找

mark

如上图示意:InooDB的主键索引和数据是保存在同一个文件中的,所以在检索的时候,在加载叶子节点的主键进入内存的同时也加载了对应的数据,如果是使用主键查询,只需要根据B+Tree的规则找到主键,就可以获得对应的行数据,如果稀疏索引进行数据筛选就会经历两个步骤,第一个步骤是在稀疏索引B+Tree中检索该键,比如检索Ellison,就会获取到主键信息,获取到主键信息之后,需要经历第二个步骤:在主键的B+Tree中进行查找。

对于MyISAM,使用的均为稀疏索引,稀疏索引的两个B+Tree其实也没有什么不同,结构完全一致,只是存储的内容不一样而已,主键索引的B+Tree存储了主键,辅助键索的B+Tree引存储了辅助键,数据却存储在了独立的地方,也就是索引和数据是分开存储的,这两个B+Tree的叶子节点都存储了指向数据的地址,由于辅助键索是独立的,无需借助主键。

下面我们可以建表验证一下,建表语句如下和效果如下:

mark

上面我们已经弄出清楚了密集索引和稀疏索引的区别,现在来思考一个问题:索引是越多越好吗?

答案是当然是否定的,数据量小的表不需要建立索引,建立会增加额外的索引开销;数据变更需要维护索引,因此更多的索引意味着更多的维护成本,更多的索引意味着也需要更多的空间!

赏

谢谢你请我喝咖啡

支付宝
微信
  • 本文作者: Tim
  • 本文链接: https://zouchanglin.cn/3882971194.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明出处!
  • 索引
  • MySQL
  • 数据库

扫一扫,分享到微信

分析事务隔离的实现
BTree与B+Tree
目录,不存在的…
© 2017-2021 Tim
本站总访问量次 | 本站访客数人
  • 所有文章
  • 工具

tag:

  • 生活
  • Android
  • 索引
  • MySQL
  • 组件通信
  • Nginx
  • JavaSE
  • JUC
  • JavaWeb
  • 模板引擎
  • 前端
  • Linux
  • 计算机网络
  • Docker
  • C/C++
  • JVM
  • 上传下载
  • JavaEE
  • SpringCloud
  • Golang
  • Gradle
  • 网络安全
  • 非对称加密
  • IDEA
  • SpringBoot
  • Jenkins
  • 字符串
  • vim
  • 存储
  • 文件下载
  • Mac
  • Windows
  • NIO
  • RPC
  • 集群
  • 微服务
  • SSH
  • 配置中心
  • XML
  • Chrome
  • 压力测试
  • Git
  • 博客
  • 概率论
  • 排序算法
  • 分布式
  • 异常处理
  • 文件系统
  • 哈希
  • openCV
  • 栈
  • 回溯
  • SpringCore
  • 流媒体
  • rtmp
  • 面向对象
  • Vue
  • ElementUI
  • 软件工程
  • 异步
  • 自定义UI
  • ORM框架
  • 模块化
  • 交互式
  • Jsoup
  • Http Client
  • LRUCache
  • RabbitMQ
  • 消息通信
  • 服务解耦
  • 负载均衡
  • 权限
  • 多线程
  • 单例模式
  • Protobuf
  • 序列化
  • Python
  • m3u8
  • 堆
  • 二叉树
  • 自定义View
  • 观察者模式
  • 设计模式
  • 线程池
  • 动态扩容
  • 高可用
  • GC
  • ffmpeg
  • SpringMVC
  • REST
  • Redis
  • 缓存中间件
  • UML
  • Maven
  • Netty
  • 高性能网络
  • IPC通信
  • IO
  • Stream
  • 发布订阅
  • SQLite
  • Hash
  • 集合框架
  • 链表
  • Lambda
  • 汇编语言
  • 组件化
  • Router
  • 开发工具

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 思维导图
  • PDF工具
  • 无损放大
  • 代码转图
  • HTTPS证书