type
status
date
slug
summary
tags
category
icon
password

一·、什么是索引

官方定义:一种帮助mysql提高查询效率的数据结构
优点:加快查询速度
缺点:
  • 需要额外的空间维护索引
  • 增删改要维护索引,速度会变慢

二、索引分类(innodb)

  • 主键索引(聚簇索引)
    • 设置主键后数据库会自动建立索引
  • 单值索引
    • 一个索引值包含单个列,一个表可以有很多个单列索引
  • 唯一索引
    • 索引列值必须唯一,允许有空值,但只允许有一个
  • 复合索引
    • 一个索引包含多个列
 

三、创建索引

四、如何使用

  1. 在主键作为搜索条件的时候,就已经用到了主键索引也就是聚簇索引。
  1. 而如果使用其他字段作为搜索条件的时候,如果没有构建索引的话,其只能在存储中一个个比对,效率在很多数据的情况下会很差。而当这个字段建立了索引之后,再查询的话,则会用到索引,非簇拥索引。

五、B+树

既然说索引是一种数据结构,那么mysql的索引到底是一个什么样的结构呢?
先说结论,mysql的索引结构是B+树。
那么B+树到底是如何构建的呢?
首先先来看这样的一个情景,在一个表中插入了很多的无序数据。
查询之后会发现,他们是按照id顺序进行的排列。也就是说,在插入之后,数据库对数据进行了排序。为什么要排序呢。
                                                                  此图为插入数据存储时的样子
此图为插入数据存储时的样子
这样存储在数据量大的时候就不方便查询了,于是就引入了分页的概念,相当于把所有的数据来分页管理,而且默认每页的存储16kb。
notion image
有了页面,也不方便管理,要查询的时候也不知我需要查询的数据到底在那一页,于是就引入了页面的管理,也就是’页目录‘,在‘页目录’中存放了每一页的主键值和指针,指针指向的就是对于的页。
notion image
这就是一颗B+树了,当然页目录也有存放大小,当页目录满的时候,就会再多出一层管理页目录的的页目录以此类推(套娃bushi),一般来说3层的这个结果已经可以存放很多数据了。
既然有B+树,那有B树嘛?
有,与B+树大致相同B树与B+树不同的是B树的每个节点都带有数据,
  • B+树只有叶节点带有存储的数据,
  • B+树所有的叶子节点都有一个链指针
  • 数据记录都存放在页节点中的

六、聚簇索引与非聚簇索引

前面一直在提到主键是聚簇索引,到底什么是聚簇索引
  • 聚簇索引:将数据存储与索引放到了一块,索引结构的叶子节点保存了行数据
  • 非聚簇索引:将数据与索引分开存储,索引结构的叶子节点指向了数据对应的位置
非聚簇索引总是二次查找,首先非聚簇索引需要查找主键值,再拿到簇拥索引中再寻找。
那么为什么这里不存放数据直接的地址值呢
是因为,如果数据发送增删改的话,其中的数据地址需要发生改变,而如果存放的是数据地址则需要花很多资源去维护非聚簇索引。(innodb)
 
notion image
notion image
聚簇索引需要注意什么?
主键尽量不要用uuid,太过离散,维护会消耗资源,尽量使用int这类的自增id,雪花算法生成的id
什么情况下不能使用索引?
notion image
双亲委派机制(类加载机制)Linux安装mysql
  • Giscus
  • Utterance