MySQL索引

2021/7/5 19:17:50

本文主要是介绍MySQL索引,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

索引的基本概述

索引的分类

  1. 主键索引:设定为主键后数据库会自动建立索引,主键不能为空

  2. 单值索引:除主键外的其他某一列设置的索引

  3. 复合索引:一个索引包含多个列

  4. 唯一索引:索引列的值唯一,允许为空,只能存在一个null

    show index from 表名; --查看表中索引

索引底层原理解析—B+树

在这里插入图片描述
B+Tree是在B-Tree(B树)结构基础上的一种优化,使其更很适合实现外存储的索引结构,InnoDB存储引擎就是使用B+Tree实现其索引结构。

B+Tree与B-Tree(B树)最大的区别就是,B树非叶子节点必须存储数据,而每页存储空间是有限的,如果存储的数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时,会导致B树的深度很大,从而增大了查询时磁盘的I/O次数,影响查询效率。而B+树只有叶子节点存储数据,非叶子节点不存储数据,只存储索引和指针即key值信息,这样大大加大了每个节点存储key的数量,进而页目录存储的数据可以更多,树的深度更小。
B+树相对于B树有几点不同:

  1. 非叶子节点只存储键值信息,即主键和指针信息
  2. 所有叶子节点之间都有一个链指针
  3. 数据记录都存在叶子节点
  • InnoDB存储引擎中页的大小为16KB,一般表的逐渐类型为int类型(占用4个字节)或bigint(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+树中的一个节点)中大概存储16KB/(8B+8B)=1k键值(因为是估值,为方便计算,这里K取10^3)。也就是说一个深度为3的B+树的索引可以维护10 ^ 3 * 10 ^ 3 * 10 ^ 3 = 10亿条记录;
  • 实际情况中每个节点可能不能填充满,因此在数据库中,B+树的高度一般都在2-4层,mysql的InnoDB引擎在设计时是将根节点(即顶层页)常驻内存的,也就是说查找某一键值的行记录最多只需要1-3次磁盘操作即可。如果是3层,最多2次磁盘操作。

聚簇索引&非聚簇索引

聚簇索引

将数据存储与索引放到一块,索引结构的叶子节点保存了行数据。
一般来讲,一个表中的主键索引一定是聚簇索引,但聚簇索引不一定就是主键索引。
如果数据存储和索引放到了一起,叶子节点存储的是整行数据,这就是聚餐索引

聚簇索引

将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置

在InnoDB中,在聚簇索引之上创建的索引称之为辅助索引,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引。辅助索引叶子节点存储的不再是行的物理位置,而是主键值,辅助索引访问数据总是需要二次查找

非聚簇索引中最终找到的是对应的id,然后根据该id值在聚簇索引中找数据。

为什么存id主键值,而不直接存数据地址,根据地址去找?
因为在增删改的过程中,原数据的地址会发生变化,而主键是一直不变的。

在这里插入图片描述



这篇关于MySQL索引的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程