数据库索引

2023-09-17 22:29:49

一、索引是什么?

索引是帮助MySQL高效获取数据的数据结构。

二、索引能干什么?

索引非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引能够轻易将查询性能提高好几个数量级,总的来说就是可以明显的提高查询效率。

三、索引的分类?

  1. 从存储结构上来划分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。这里所描述的是索引存储时保存的形式,
  2. 从应用层次来分:普通索引,唯一索引,复合索引
  3. 根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。
    平时讲的索引类型一般是指在应用层次的划分。
    就像手机分类:安卓手机,IOS手机 与 华为手机,苹果手机,OPPO手机一样。
    ***普通索引:***即一个索引只包含单个列,一个表可以有多个单列索引
    ***唯一索引:***索引列的值必须唯一,但允许有空值
    ***复合索引:***多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
    ***聚簇索引(聚集索引):***并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行。
    ***非聚簇索引:***不是聚簇索引,就是非聚簇索引

四、索引的底层实现

mysql默认存储引擎innodb只显式支持B-Tree( 从技术上来说是B+Tree)索引,对于频繁访问的表,innodb会透明建立自适应hash索引,即在B树索引基础上建立hash索引,可以显著提高查找效率,对于客户端是透明的,不可控制的,隐式的。
不谈存储引擎,只讨论实现(抽象)

Hash索引

基于哈希表实现,只有精确匹配索引所有列的查询才有效,对于每一行数据,存储引擎都会对所有的索引列计算一个哈希码(hash code),并且Hash索引将所有的哈希码存储在索引中,同时在索引表中保存指向每个数据行的指针。
在这里插入图片描述

B-Tree索引(MySQL使用B+Tree)

B-Tree能加快数据的访问速度,因为存储引擎不再需要进行全表扫描来获取数据,数据分布在各个节点之中。
在这里插入图片描述

B+Tree索引

是B-Tree的改进版本,同时也是数据库索引索引所采用的存储结构。数据都在叶子节点上,并且增加了顺序访问指针,每个叶子节点都指向相邻的叶子节点的地址。相比B-Tree来说,进行范围查找时只需要查找两个节点,进行遍历即可。而B-Tree需要获取所有节点,相比之下B+Tree效率更高。(排序查找算法系统的学习,可以在Java知音公众号回复“排序算法聚合”)
在这里插入图片描述
结合存储引擎来讨论(一般默认使用B+Tree)

案例:假设有一张学生表,id为主键

在这里插入图片描述
在MyISAM引擎中的实现(二级索引也是这样实现的)
在这里插入图片描述
在InnoDB中的实现
在这里插入图片描述

五、为什么索引结构默认使用B+Tree,而不是Hash,二叉树,红黑树?

***B-tree:***因为B树不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致IO操作变多,查询性能变低;
***Hash:***虽然可以快速定位,但是没有顺序,IO复杂度高。
***二叉树:***树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。
***红黑树:***树的高度随着数据量增加而增加,IO代价高。

六、为什么官方建议使用自增长主键作为索引?

结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。总之就是减少分裂和移动的频率。

七、简单总结下

  1. MySQL使用B+Tree作为索引数据结构。
  2. B+Tree在新增数据时,会根据索引指定列的值对旧的B+Tree做调整。
  3. 从物理存储结构上说,B-Tree和B+Tree都以页(4K)来划分节点的大小,但是由于B+Tree中中间节点不存储数据,因此B+Tree能够在同样大小的节点中,存储更多的key,提高查找效率。
  4. 影响MySQL查找性能的主要还是磁盘IO次数,大部分是磁头移动到指定磁道的时间花费。
  5. MyISAM存储引擎下索引和数据存储是分离的,InnoDB索引和数据存储在一起。
  6. InnoDB存储引擎下索引的实现,(辅助索引)全部是依赖于主索引建立的(辅助索引中叶子结点存储的并不是数据的地址,还是主索引的值,因此,所有依赖于辅助索引的都是先根据辅助索引查到主索引,再根据主索引查数据的地址)。
  7. 由于InnoDB索引的特性,因此如果主索引不是自增的(id作主键),那么每次插入新的数据,都很可能对B+Tree的主索引进行重整,影响性能。因此,尽量以自增id作为InnoDB的主索引。
更多推荐

机器学习 day33(误差分析、添加数据、迁移学习)

误差分析我们可以手动查看分类错误的子集样本(通常为100个),并统计他们的错误类型在所有错误类型中,选择一种或几种最常见的错误,进行改进。这可以最高效的改进你的模型误差分析的一个限制是:它只能很好的解决人类擅长的问题添加数据添加数据有三种常见方法:直接添加全新的数据,数据增强,数据合成添加所有类型的全新数据可能又贵又慢

uniapp录音功能和音频播放功能制作

录音功能在UniApp中,你可以使用uni.getRecorderManager()方法来创建一个录音管理器实例,从而实现录音功能。以下是一个示例,演示了如何在UniApp中使用uni.getRecorderManager()实现录音功能://在需要录音的页面或组件中exportdefault{data(){retur

Apache Hive概述,模拟实现Hive功能,Hive基础架构

1、ApacheHive概述1.1、分布式SQL计算对数据进行统计分析,SQL是目前最为方便的编程工具。大数据体系中充斥着非常多的统计分析场景所以,使用SQL去处理数据,在大数据中也是有极大的需求的。MapReduce支持程序开发(Java、Python等)但不支持SQL开发1.2、分布式SQL计算-HiveApach

探索Adobe Photoshop 2024:新功能与增强功能详解

AdobePhotoshop2024,这款传奇的图像编辑软件,近期又迎来了一些令人振奋的新特性。对于专业设计师和摄影爱好者来说,Photoshop的每次更新都牵动着他们的心。那么,这次的新版本究竟带来了哪些值得我们期待的功能呢?且听我一一解读。首先,Photoshop2024对其界面进行了一些改进。全新的工作区布局,使

Layui快速入门之第七节 表格

目录一:基本用法基本案例:二:静态表格三:模板配置渲染四:静态表格转换五:已知数据渲染六:自定义模板API渲染一:基本用法表格组件table是Layui中使用率极高的一个组件,它以表格的承载方式对数据进行渲染、重载、排序、统计、分页等等一系列交互操作,并提供了丰富的API用于扩展,基本涵盖了日常业务所涉及的大部分需求基

【pytorch】模型常用函数(conv2d、linear、loss、maxpooling等)

1、二维卷积函数——cnv2d():'''in_channels(int):输入通道数out_channels(int):输出通道数kernel_size(intortuple):卷积核大小stride(intortuple,optional):步长Default:1padding(int,tupleorstr,opt

驱动开发 作业 day9 9/20

基于platform实现head.h#ifndef__HEAD_H__#define__HEAD_H__//构建LED开关的功能码,不添加ioctl第三个参数#defineLED_ON_IO('l',1)#defineLED_OFF_IO('l',0)#endiftest.c#include<stdlib.h>#inc

docker 获取Nvidia 镜像 | cuda |cudnn

本文分享如何使用docker获取Nvidia镜像,包括cuda10、cuda11等不同版本,cudnn7、cudnn8等,快速搭建深度学习环境。1、来到dockerhub官网,查看有那些Nvidia镜像https://hub.docker.com/r/nvidia/cuda/tags?page=2&name=11.3这

Spring Cloud Eureka:服务注册与发现

💗wei_shuo的个人主页💫wei_shuo的学习社区🌐HelloWorld!SpringCloudEureka:服务注册与发现SpringCloudEureka是SpringCloud生态系统中的一个组件,它是用于实现服务注册与发现的服务治理组件。在微服务架构中,服务之间存在复杂的依赖关系,而SpringCl

安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR下级海康设备无法级联是什么原因?

安防视频监控平台/视频集中存储/云存储/磁盘阵列EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。有用户反馈,在使用下级平台的海康设备级联到视频监控EasyCVR平台

游戏服务器搭建过程中Maven多模块编译遇到的一些问题

目录1、多模块的创建1.1父模块的创建1.2删除垃圾文件1.3修改pom.xml1.4创建子模块继承2、子模块之间的互相引用3、多个模块间版本的管理3.1dependencis3.2dependencyManagement4、依赖执行5、在SpringBoot项目中加载依赖项目的组件有几种常用的方法5.1.使用@Com

热文推荐