mysql核心知识-----索引

news2025/1/18 7:37:56

文章目录

    • 索引的概念和用途
    • 应用层的mysql(各种操作语句)与底层的mysql数据库(磁盘上的文件)交互
    • IO的单位
    • 深入理解索引
    • 聚簇索引 VS 非聚簇索引
    • 普通(辅助)索引
    • 什么字段适合做主键?

索引的概念和用途

索引的概念 : 在mysql内部,IO数据的单位是page页(16KB),以B+树的形式将所有的page页进行组织,形成的数据结构和与其配套的
查找算法叫做索引。 (听到即懵逼????, 慢慢向下看, 疑惑最终回解决)
索引的用途: 用于提高数据库查询效率。 但是呢,查询速度的提高,但是对于增删查改的效率会降低。
所以:索引的核心在于:提高海量数据的查询速度。

索引的类型:
1, 主键索引
2, 唯一索引
3, 普通索引(辅助索引)
4, 全文索引。(不用关心)

对于索引的SQL操作比较简单,就不细说了。

而且,存储引擎的不同,索引会有些区别。
无特殊说明,往下全是 innodb存储引擎的情况

应用层的mysql(各种操作语句)与底层的mysql数据库(磁盘上的文件)交互

我们知道,数据库的主要功能是管理数据,而数据库存储数据肯定是以文件的形式保存在磁盘当中,这样才能永久保存。
而应用层的mysql不可能直接去访问磁盘中的数据, 肯定是将磁盘中的数据加载到内存,然后mysql与数据进行操作处理。
当然了,肯定也不是将磁盘中所有的数据库中的所有数据加载到内存。

其实,每当我们启动mysql的时候,我们都会在内存中申请一段空间 buffer pool =128M ,用于加载磁盘中的数据。
当mysql操作完数据后,buffer pool 以某种刷新策略刷新回磁盘中,做到永久保存。

那么, 问题又来了。 每次从磁盘中读取多少的数据呢?

IO的单位

系统读取磁盘中的数据,是以块为单位,是4KB。 (这里有疑惑可以百度一下,涉及硬盘相关的硬件知识)
然而数据库是专门用来管理数据的,为了提高IO效率 ------->以page单位 (16KB)。
也就是说:当mysql操作数据的时候,将需要操作的数据加载到内存中的buffer pool中, 是以page单位的。
刷新到磁盘中,也是以page为单位的。

然后的话,mysql操作数据的时候,肯定是磁盘中有数据,内存中也有数据。
(因为只用将需要操作的相关数据以page为单位加载到内存,这里说的不是拼凑要操作的数据,
而是建立索引后,数据会排序,将数据上下相连满16KB一个page,加载到内存)

为什么IO单位是page(16KB)呢? 需要多少数据加载多少数据到内存不好吗?
原因 : 提高IO效率, 这次要操作的数据 和下次要操作的数据可能都在一个page。
在这里插入图片描述

深入理解索引

在这里插入图片描述

我们这样插入几组数据,然后再查询会发现:按照主键进行排序。 问题又来了, 为什么会排序呢?
在这里插入图片描述

如何理解单个page(16KB)
在这里插入图片描述
128M * 1024 / 16= 8192 也就是说,128M的buffer poll 能容纳 8192个page,根据主键查找一条记录需要遍历每个page,
就算是页内查找效率提高,那查找出来也是够呛。 如何提高呢? ------> 给page页加上目录。
在这里插入图片描述
目录项 : 最小数据的键值 + page地址
目录页的本质也是页,普通页中存的数据是用户数据,而目录页中存的数据是普通页的地址。
一个目录页16KB ,而一个键值4byte 一个地址是4byte ---->一个目录页可以存放 16 * 1024 / 8 = 2048个目录项,而一个buffer pool最多才有8000多个page
也就是说:树的高度非常低 -------> 只用将少量高频访问的目录页加载到内存,就完全可以极大的提高IO效率。

为了防止线性遍历目录页,顶层的目录页仍旧可以继续加目录页,如:
在这里插入图片描述

而这样的数据结构就是 : B+ 树。

对比其他数据结构:
链表?线性遍历
二叉搜索树?在完全有序的情况下,退化成为单边树
AVL &&红黑树?虽然是平衡或者近似平衡,但是毕竟是二叉结构,相比较多阶B+,意味着树整体过高,大家都
是自顶向下找,层高越低,意味着系统与硬盘更少的IO Page交互
Hash?官方的索引实现方式中, MySQL 是支持HASH的,不过 InnoDB 和 MyISAM 并不支持.Hash跟进其算法特
征,决定了虽然有时候也很快(O(1)),不过,在面对范围查找就明显不行

与B树的区别:
B树的所有节点存放数据+page指针,而B+树只有叶子节点存放数据,非叶子节点(目录页)存放最小数据的键值和page指针
B树叶子节点不连续, B+树叶子节点连续 (更有利于范围查找)。

查找效率是提高了, 你再想想增删查改 ------> 基本上就是整个结构都要修改 。

聚簇索引 VS 非聚簇索引

都是B+树的结构。
用户数据 : 可以理解为一条条插入的记录
索引数据 : 一个page页内中的目录字段 + page指针等等,,
在这里插入图片描述

普通(辅助)索引

MySQL 除了默认会建立主键索引外,我们用户也有可能建立按照其他列信息建立的索引,一般这种索引可以
叫做辅助(普通)索引。

MyISAM的辅助索引和主键索引无区别, 就是上面的非聚簇索引。 (用户数据和索引数据分离)
InnoDB 的辅助索引中叶子节点并没有数据,而只有对应记录的主键值。
所以通过辅助(普通)索引,找到目标记录,需要两遍索引**:首先检索辅助索引获得主键,然后用主键到主索引中检
索获得记录。这种过程,就叫做回表查询**
为何 InnoDB 针对这种辅助(普通)索引的场景,不给叶子节点也附上数据呢?原因就是太浪费空间了。

还有一种索引 ------ 唯一索引, 不能重复,可以为null, 加上 not null 等价于 主键索引。

这里的什么主键索引 + 唯一索引 + 辅助索引的 特性知识就不罗嗦了, 随便百度或者翻学校的烂教材都能找到。

什么字段适合做主键?

比较频繁作为查询条件的字段应该创建索引
唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
更新非常频繁的字段不适合作创建索引
不会出现在where子句中的字段不该创建索引

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/155636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1.ISAAC简介

ISAAC简介 ISAAC教程合集地址: https://blog.csdn.net/kunhe0512/category_12163211.html Isaac 是 NVIDIA 的智能机器人开放平台。 Isaac SDK 提供了大量强大的 GPU 加速算法 GEM,用于导航和操作。 Isaac SDK Engine 是一个框架,可以轻松编写模块化应…

Android开发应用案例——简易计算器(附完整源码)

Android开发-AS学习(一)Android开发-AS学习(二)使用android studio开发简易计算器app(完整源码可在博主资源中自行下载)最终效果:开发步骤:创建一个名为calculator的新项目编写代码项…

Java加解密(六)基于口令(PBE)加密

目录基于口令(PBE)加密1 定义2 加密过程3 解密过程5 PBE加密算法会话密钥保存4 使用场景5 JDK支持的PBE加密算法6 Bouncy Castle 支持的PBE加密算法7 算法调用示例基于口令(PBE)加密 1 定义 PBE(Password Based Encr…

linux文件管理和用户管理(二)

1、学习linux的原因: linux是一些做项目运维的工作人员用到最多的一个工具普通程序员学习linux的目的是为了让项目部署到服务器上,而大多数服务器都是linux系统(centOS),所以对Linux要有基本的使用能力。 2、文件系统…

Python采集专栏文档保存成pdf

前期准备 环境使用 Python 3.8Pycharm 模块使用 requests >>> pip install requests 数据请求parsel >>> pip install parsel 数据解析re >>> 内置模块 不需要安装 正则表达式pdfkit >>> pip install pdfkit 实现步骤 采集文章内容,…

【前端】Vue项目:旅游App-(12)home-Calendar:日期选择、日历、动态显示时间

文章目录目标过程与代码安装依赖结构样式动态数据:默认数据今天明天添加日历修改样式动态数据:显示日历中选择的数据效果总代码修改或添加的文件formatDate.jshome.vuemain.js目标 点击时间: 弹出日历供选择: 动态显示数据&#…

Linux设备树简析

1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 设备树的来源 在 Linux 中,每个设备驱动,管理一组设备数据,类似面向对象编程中类和其实例对象的关系。一段时…

视频播放破亿,抖音近期的流量密码是什么

纵观12月抖音涨粉趋势,美食、医疗健康、生活日常等细分领域中涌现出不少优质账号,圈粉不断。从『粉丝飙升榜』TOP30来看, 12月上榜达人的更替率高达76.6%,向太陈岚单日涨粉557.26w,12月共收获751.09w粉丝,空…

做好网络舆情监测监控的重要性,TOOM网络舆情监控平台建设方案?

舆情监控在当今时代非常重要,互联网走进千家万户,各种信息在网络上传播,舆情监控旨在帮助公司了解公众对其产品、服务、品牌形象等的看法,并及时采取应对措施。接下来简单了解做好网络舆情监测监控的重要性,TOOM网络舆…

关于城市轨道交通的电力监控中心调度系统研究

摘 要 :在城市轨道交通的运行过程中,电力监控系统很好地监控了各个配电所、电力设备以及接触网等的运行情况,这对于城市轨道交通的安全稳定运行有着关键性的作用。因此,随着当今城市轨道交通事业的不断发展,城市轨道交…

MATLAB | 如何使用MATLAB绘制序列logo图

这次开发了一个生物信息学比较常用的序列logo图绘制MATLAB代码包,绘制效果如下: 数据来自基迪奥生物项目编号为seqlogojrois9l2jit的示例数据。同时本工具函数参考以下文献: Tareen A, Kinney J B. Logomaker: beautiful sequence logos in …

再见2022,你好2023:八年程序媛老兵的践行、思考与展望

再见2022,你好2023写在前面的话1.2022速记1.1 产假前,ParaView三维自动化项目1.2 产假后,EDA仿真项目1.3 从EDA行业谈谈2022年的经济寒冬2. 2023年的新年flag2.1 flag one:挑战高薪2.2 flag two:读更多的书,读更多专业书2.2.1 读过…

动态内存管理题目讲解

前言: 上一期我们讲述了有关动态内存管理的知识点,这期我们通过几个经典的笔试题来进行深入的了解以及对知识点的巩固 目录第一题第二题第三题第四套第一题 试题如下: void GetMemory(char* p) {p (char*)malloc(100); } void Test(void) …

1.H3CNE-计算机网络概述

计算机网络概述计算机网络定义一组自治计算机互联的集合计算机网络基本功能资源共享综合信息服务分布式处理与负载均衡计算机网络的类型局域网LAN(Local Area Network) 由用户自行建设,使用私有地址组建的网络城域网MAN(Metropolitan Area Network)由运营…

为什么职场第一开发语言会是SQL?看完这些你就瞬间明白了

看到一个有趣的比喻,用来说明SQL与Excel的差别是什么。 如果把SQL比作火车,把Excel更比作卡车。 卡车灵活自由,高速或乡村小道想去哪就去哪,但即便每天不停歇卡车的运载量也不大,而且容易出交通事故。 火车运载量大…

windows下软件安装:miniconda下安装R4.1.3并将其添加到 Jupyter notebook 中

0. 说明: 本来是想在windows中用conda安装R,然后再下载安装RStudio并对其进行配置使之可以用conda环境中的R,但是经过尝试以及网络上查找相关文档发现,原版RStudio不支持使用conda环境中的R(可能Anaconda中自带的RStu…

Visual studio C++桌面应用程序添加外部文件引用

C桌面应用程序添加外部文件引用 前言 之前对C的开发接触很少,本章节记录一下Visual studio开发C桌面应用程序是如何引入外部文件 ★提高阅读体验★ 👉 ♠一级标题 👈 👉 ♥二级标题 👈 👉 ♥ 三级标…

Apache Spark 机器学习 基本统计 1

1 基本概念 相关性,是指两个变量或者两个系列变量的关联程度,也就是,其中一方变量的变化会影响另外一方变量的变化。 相关性分为三种关系,正相关、负相关以及不相关。 正相关,从单调递增的角度看,其中一…

Netty基础入门——文件编程、网络编程【2】

Netty基础入门——文件编程、网络编程【2】 基础入门【1】 1 文件编程 1.1 channel 两个channel传输数据 transferTo方法一次性最多传输2G大小的文件,如果超出会丢弃 public static void main(String[] args) {try (FileChannel from new FileInputStream(&quo…

APM系统是什么?有什么用处?

自SpringCloud问世以来,微服务以席卷之势风靡全球,企业架构都在从传统SOA向微服务转型。然而微服务这把双刃剑在带来各种优势的同时,也给运维、性能监控、错误的排查带来的极大的困难。在大型项目中,服务架构会包含数十乃至上百个…