首页 > 数据库 >MySQL(八):MySQL之索引

MySQL(八):MySQL之索引

时间:2024-03-12 15:02:58浏览次数:20  
标签:查询 叶子 索引 MySQL 节点 主键

1、MySQL索引及作用

  MySQL官网:索引(Index)是帮助MySQL高效获取数据的数据结构。索引是数据结构。

  一个索引就是一个B+树,加快数据查询的速度。一个select查询语句在执行过程中一般最多能使用一个辅助索引,即使在where条件中用了多个辅助索引。

2、InnoDB存储引擎支持的常见索引

2.1、B+树索引

2.2、哈希索引

  哈希索引只能用于等值查找。

  B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般为3、4层,故需要3、4次的IO查询。

  InnoDB存储引擎内部自己去监控索引表,如果监控到某个索引经常用,那么就认为是热数据,然后内部自己创建一个hash索引,称之为自适应哈希索引( Adaptive Hash Index,AHI),创建以后,如果下次又查询到这个索引,那么直接通过hash算法推导出记录的地址,直接一次就能查到数据,比重复去B+tree索引中查询三四次节点的效率高了不少。

  InnoDB存储引擎使用的哈希函数采用除法散列方式,其冲突机制采用链表方式。注意,对于自适应哈希索引仅是数据库自身创建并使用的。

3、为什么哈希索引不适合做数据库索引

  1、不能实现范围查找,hash表只能匹配是否相等。

  2、组合索引可以支持部分索引查询,如(a,b,c)的组合索引,查询中只用到了a和b也可以查询的,如果使用hash表,组合索引会将几个字段合并hash,没办法支持部分索引;

  3、数据量大,hash冲突概率增加。

4、MySQL索引 - B+树

  B+树中的B是balance的含义,B+数是由平衡二叉树掩化而来。

4.1、B+树特征

  1、非叶子节点只保存索引信息和下一层节点的索引信息,不保存数据

  2、叶子也存储实际数据,相邻的叶子节点之间用指针相连,叶子节点由小到大(有序)串联在一起。

4.2、B+树

  MySQL中实现的B+树,叶子节点之间的链表是双向链表。

  0

B+树优点:

1、在磁盘设备上,通过B+树可以有效的存储数据

  在InnoDB存储引擎中,默认定义的B+树的节点大小是16KB。在计算机中数据的读取按页(page)的整倍数,页的大小为4K。InnoDB每一次磁盘I/O,读取的都是 16KB的整数倍的数据。也就是说InnoDB在节点的读写上是可以充分利用磁盘顺序IO的高速读写特性。

2、所有记录都存储在叶子节点上,非叶子(non-leaf)存储索引(keys)信息;而且记录按照索引列的值由小到大排好了序。

3、B+树含有非常高的扇出(fanout),通常超过100,在查找一个记录时,可以有效的减少IO操作;

  *扇出:是每个索引节点(Non-LeafPage)指向每个叶子节点(LeafPage)的指针;

  *扇出数 = 索引节点(Non-LeafPage)可存储的最大关键字个数 + 1

4.3、B+树与B*树、B树的区别

1、B+树与B树

1.1、区别

  B树的非叶子节点也需要存放数据、没有将叶子结点用链表串联起来。

  0

1.2、相较于B+树的缺点

  B树叶子节点、非叶子节点都会保存数据,这样导致在非叶子节点中能保存的指针数量变少,指针少的情况下要保存大量数据,只能增加树的高度,导致IO 操作变多,查询性能变低。

1.3、B+树与B树适用场景

  存在大量范围查询的场景,适合使用B+树(比如数据库);

  而对大量单个key查询的场景,可以考虑B树(比如NOSQL的MongoDB)。

2、B+树与B*树

  非叶子节点之间,也有相互的指针指向。Oracle使用的是B*树。

  0

5、MySQL索引 - B+树索引

5.1、聚集索引/聚簇索引

  聚簇索引,将表的主键来构造一棵B+树,并将整张表的行数据存放在该B+树的叶子节点中。

  聚簇索引 => 索引即数据,数据即索引。

  利用数据库表的主键构建的,每张表只有一个聚簇索引。

5.2、辅助索引/二级索引/非聚集索引

  聚簇索引只能在搜索条件是主键值时才能发挥作用,因为B+树中的数据都是按照主键进行排序的。

  以非主键的列建立索引,这种索引被称为辅助索引/二级索引。

  每建立一个索引,就有一颗B+树。

  对于辅助索引(Secondary Index,也称二级索引、非聚集索引),叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点中的索引行中还包含了相应行数据的聚集索引键。

5.3、回表

  回表:通过辅助索引来寻找数据时,InnoDB存储引擎会遍历辅助索引并获取指向主键索引的主键,然后再通过主键索引(聚集索引)来找到一个完整的行记录。

  根据辅助索引的值查询一条完整的用户记录需要使用到2棵B+树 --> 一次辅助索引,一次聚集索引。

5.4、联合索引/复合索引

5.4.1、概念

  联合索引(复合索引): 多个列组合起来进行索引。

  建立联合索引只会建立1棵B+树,多个列分别建立索引会分别以每个列则建立B+树,有几个列就有几个B+树。

5.4.2、复合索引最左匹配原则

在a,b两列建立索引,index(a,b)在索引构建上,包含了两个意思:

  1、先把各个记录按照note列进行排序。

  2、在记录的note列相同的情况下,采用b列进行排序。

5.5、覆盖索引

  覆盖索引:从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录(回表)。

  辅助索引不包含整行记录的所有信息,故其大小要远小于聚集索引,因此可以减少大量的IO操作。但是,覆盖索引并不是索引类型的一种。

如:

  辅助索引中包含主键及指向下一层节点的指针,根据辅助索引只查询主键时,可直接通过辅助索引返回,不需要回表操作。

 

标签:查询,叶子,索引,MySQL,节点,主键
From: https://www.cnblogs.com/RunningSnails/p/18068319

相关文章

  • MYSQL语法:左连接、右连接、内连接、全外连接
    概念leftjoin(左连接):返回包括左表中的所有记录和右表中连接字段相等的记录。rightjoin(右连接):返回包括右表中的所有记录和左表中连接字段相等的记录。innerjoin(内连接):只返回两个表中连接字段相等的行。fulljoin(全外连接):返回左右表中所有的记录和左右表中连接字段相等的记录......
  • MySQL 精通与优化
    目录1.数据库管理与优化1.1.用户管理和权限控制1.2.数据库的备份和恢复1.3.数据库的性能优化和调优1.4.锁定和事务管理2.高可用性与容错性2.1.主从复制(Master-SlaveReplication)2.2.主主复制(Master-MasterReplication)2.3.数据库集群技术3.实践与项目案例3.1.......
  • typeorm mysql blob 存储base64
    typeormmysqlblob存储base64在TypeORM中,要将Base64数据存储到MySQL数据库的BLOB字段,您需要先将Base64字符串转换为Buffer,然后使用TypeORM的实体管理器来保存。以下是一个简单的例子:首先,定义您的实体:  import{Entity,PrimaryGeneratedColumn,Column}from......
  • mysql for update是锁表还是锁行
    转载至我的博客https://www.infrastack.cn,公众号:架构成长指南在并发一致性控制场景中,我们常常用forupdate悲观锁来进行一致性的保证,但是如果不了解它的机制,就进行使用,很容易出现事故,比如forupdate进行了锁表导致其他请求只能等待,从而拖垮系统,因此了解它的原理是非常必要的,......
  • WSL基本使用,Ubuntu->docker->MySQL8
    适用于Linux的Windows子系统(WSL)可让开发人员直接在Windows上按原样运行GNU/Linux环境(包括大多数命令行工具、实用工具和应用程序),且不会产生传统虚拟机或双启动设置开销。基本使用安装#此命令将启用运行WSL并安装Linux的Ubuntu发行版所需的功能。wsl--inst......
  • MySQL主从延迟原理详解
    前言在生产环境中,为了满足安全性,高可用性以及高并发等方面的需求,基本上采用的MySQL数据库架构都是MHA、MGR等,最低也得是一主一从的架构,搭配自动切换脚本,实现故障自动切换。上述架构都是通过集群主从复制(Master-Slave)的方式来同步数据。MySQL集群简单架构图:说到主从同步,离不开bi......
  • 部署测试平台-使用docker安装mysql
    1.拉取mysql5.7镜像:dockerpullmysql:5.72.新建数据库挂载目录:mkdir-p/root/data/mysql5.7/conf   配置文件mkdir-p/root/data/mysql5.7/data   数据库数据目录mkdir-p/root/data/mysql5.7/log   数据库日志3.把配置文件my.cnf放到/root/data/m......
  • mysql 索引
    索引是根据表中一列或若干列按照一定顺序建立的列值与记录行之间的对应关系的数据结构,通过索引查询可以提高查询的效率。举个例子:把一个数据表当做一个图书馆,数据表中的一行数据当做一本书,在没有索引的情况下,想要找某一本书时,几乎需要将整个图书馆的书找一遍。当建立了索引后,就......
  • Lucene轻量级搜索引擎,真的太强了!!!Solr 和 ES 都是基于它
    一、基础知识1、Lucene是什么Lucene是一个本地全文搜索引擎,Solr和ElasticSearch都是基于Lucene的封装Lucene适合那种轻量级的全文搜索,我就是服务器资源不够,如果上ES的话会很占用服务器资源,所有就选择了Lucene搜索引擎2、倒排索引原理全文搜索的原理是使用......
  • MySQL数据库表关系详解
    MySQL数据库表关系详解(1)一对一一对一关系是最好理解的一种关系,在数据库建表的时候可以将人表的主键放置与身份证表里面,也可以将身份证表的主键放置于人表里面一对一的关系就是一种特殊的多对多的关系,一张表A中的一条记录只能对应另一张表B中的一条记录,另一张表B中的一条记......