面试准备 --- 数据库索引

前情

可以说是完全为了面试了,我还没有工作,自己做的项目也还没有用过索引,如何添加索引,可以在菜鸟教程自己看,这里说一下使用的意义和底层的数据结构

正文

为什么使用索引

  • 如果在概念上说索引,就不能只局限于数据库,这个概念在很多方面都有涉及,我印象很深的就是操作系统中的文件系统还有内存管理中的页表的设计,我觉得在概念上都类似数据库索引;
  • 数据库为什么要使用索引,其实很简单,就是你读书为什么要看目录的原因一样,就是为了快速定位内容,当然这是主要目的,还有一些其他目的;
  • 索引的缺点
    • 很明显,索引并不只是逻辑上的概念,它的的确确存在为一个物理文件,那么创建这样一个文件就需要耗费时间和空间,还有一点,如果这个表是既有查询也有插入删除更改等操作,索引文件就需要动态的修改,这样可能出现添加索引比不添加索引还耗时的情况,这就要根据查询和修改等操作的比例还自行决定;

底层数据结构

就说一下Mysql吧,Mysql主要使用两种数据结构:哈希表和B+树,哈希索引的使用情况很少,仅适合于绝大部分查询都是单条记录索引,否则都是用B+树索引;

  • B/B+树可以看一下我的博客B树,建议自行寻找博客,我的博客用于重新记忆,不适合学习;

  • 不同的数据库引擎也有不同的索引方式

    • MyISAM使用的是非聚簇索引,也就是说索引使用的B+树中,每个叶子节点存储的是真实数据的地址,内部节点的索引数据可以使主键也可以是其他字段,使用主键的索引称为主索引,使用其他字段的索引称为辅助索引,对于MyISAM来说,二者并没有什么区别.但InnoDB不同;
    • InnoDB使用的是聚簇索引,也就是说索引使用的B+树中,每个叶子节点存储的是数据本身,当然也有主索引和辅助索引之分,主索引的叶子节点存储的是原始数据,辅助索引存储的是主键,也就是说如果使用辅助索引,就需要进行两次索引,先在辅助索引B+树中找到主键,然后在主索引B+树中找到数据;
    • 从InnoDB的主索引和辅助索引可以看出一些问题,辅助索引存储的是主键的值,这就意味着,如果我们选取的主键很长,那么整个辅助索引所占空间就会很大,这就是不建议主键过长的原因;
  • 我们知道了B/B+树的结构后,仔细想想,如果在生成索引B+树时,使用的主键不是递增的,那么插入节点过程中,必然会经历很多的节点分裂,调整的过程,这无疑是相当耗时的,所以建议尽量使用递增的主键;

猜你喜欢

转载自blog.csdn.net/qq_36865108/article/details/86772882