【MySQL】索引的作用及知识储备

为什么要有索引

索引可以提高数据库的性能。不用加内存,不用改程序,不用调sql,只要执行正确的create indix,查询的速度就可能提高成百上千倍。但相应的代价是,插入,更新,删除的速度有所减弱。
所以索引的作用在于提高一个海量数据的检索速度

常见索引分为:

  • 主键索引(primary key)
  • 唯一键索引(unique)
  • 普通索引(indix)
  • 全文索引(fulltext) - 解决子文索引问题

认识磁盘

我们知道了索引的作用是提高数据检索的速度,那么海量数据的检索为什么慢呢?我们需要通过认识数据的存储来了解

MySQL与存储

MySQL给用户提供存储服务,而存储的都是数据,数据在磁盘这个外设当中。磁盘是计算机中的一个机械设备,相比于其他电子元件,磁盘的效率是比较低的,在加上IO本身的特征,所以存取数据是一个比较慢的操作


磁盘的物理结构和数据存取可以参看磁盘文件系统的第一部分

总结来说

数据的存取在磁盘中需要经历以下步骤:

  1. 定位读取的盘面,进而确定哪一个磁头读取数据
  2. 定位读取哪一个磁道
  3. 定位读取哪一个扇区
    整个过程称为CHS定位法 磁头:head ;磁道(柱面):cylinder;扇区:sector
    这些步骤都是机械运动,所以速度相比于电子元件,会慢上很多

另外

数据在扇区里大多是以512字节存储
操作系统读取数据的单位是数据块(4kb),也就是8个扇区
数据库文件,本质就是保存在磁盘的盘片当中,当数据库文件很大时,一定需要占据多个扇区


磁盘随机访问与连续访问
  • 随机访问:本次IO所给出的扇区地址和上次IO给出的扇区地址不连续,此时磁头在两次IO操作之间需要作较大移动才能重新开始读/写数据
  • 连续访问:如果本次IO给出的扇区地址与上次IO结束的扇区地址是连续的,那么磁头就能很快的开始这次IO操作,这样的多个IO操作称为连续访问

如果相邻的两次IO操作是在同一时刻发出的,但它们请求的扇区地址相差很大的话,也只能称为随机访问,而非连续访问

磁盘是通过机械运动进行寻址的,连续访问不需要过多的定位,故效率比较高

MySQL与磁盘交互的基本单位

MySQL是一款应用软件,其与磁盘的交互需要依靠操作系统从中构建桥梁,我们可以将其想象为一种特殊的文件系统,它有着更高的IO场景。
所以为了提高基本的IO效率,MySQL进行IO的基本单位是16KB(InnoDB存储引擎)

mysql> show global status like 'innodb_page_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| Innodb_page_size | 16384 | -- 16*1024
+------------------+-------+

也就是磁盘的基本单位是扇区512字节操作系统基本单位是数据块4KBMySQL基本单位是page(页)16KB
三者数据交互如下:

在这里插入图片描述

  • MySQL中的数据文件,是以page为单位保存在磁盘当中的
  • MySQL的CURD操作(create update read delete),都是需要计算,找到相应的插入位置,或者找到对应要修改或者查询的数据
  • 涉及计算,就需要CPU参与,而为了便于CPU参与,一定要能够先将数据移动到内存当中
  • 所以在特定时间内,数据一定是在磁盘和内存中都存在的。后续完成内存数据的操作后,以特定的舒心策略,刷新到磁盘。此时会涉及磁盘和内存的数据交互,也就是IO。而此时IO的基本单位是page
  • 为了更好的进行上述操作,MySQL服务器在内存运行时,在服务器内部,会申请被称为buffer bool的内存空间,来进行各种缓存。使用这个内存空间和磁盘数据进行IO交互
  • 所以为提高效率,一定要尽可能的减少系统和磁盘的IO次数

局部性原理

局部性原理分为时间局部性空间局部性

局部性原理出现的原因,大部分人认为是:程序的指令大部分时间是顺序执行,而且程序的集合,如数组等各种数据结构都是连续存放

  1. 时间局部性:如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某数据被访问,则不久之后该数据可能再次被访问
  2. 空间局部性:一旦程序访问了某个存储单元,则不久之后,其附近的存储单元也很大可能被访问

参考:局部性原理


MySQL的IO交互为什么要用page

为什么MySQL和磁盘进行IO交互要使用page呢?而不是用多少加载多少呢?

倘若,我们有十个数据,其中id从1到10,如果用多少加载多少,每次都只加载一个数据,查找id=10就需要十次IO

但如果使用page存储,那么十个数据都是存储在一个page中,一次IO读取整个page,放入buffer bool。无论是id=3,4,8,都是在内存中查找。大大减少了IO的次数

但是我们无法保证,用户下次查找的数据一定在这个page中,但是因为局部性原理,大概率在这个page中
往往IO效率低下的最主要矛盾不是IO单次数据量的大小,而是IO的次数

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

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

相关文章

[论文分享] EnBinDiff: Identifying Data-Only Patches for Binaries

EnBinDiff: Identifying Data-Only Patches for Binaries [TDSC 2021] 在本文中,我们将重点介绍纯数据补丁,这是一种不会引起任何结构更改的特定类型的安全补丁。作为导致假阴性的最重要原因之一,纯数据补丁成为影响所有最先进的二进制差分方…

切换npm的版本

1、在配置环境变量的地址中,多准备几个已解压版本的node 2、要想升降版本直接更改该文件中的文件夹名称就行 环境变量中的path的值是不用变的C:\Program Files\nodejs

Ubuntu22安装Docker engine(apt安装方式)

一、准备工作 新创建一个虚拟机。 进入虚拟机: 二、安装docker docker现在对用不同主机提供了不同安装包:docker engine 和 docker desktop。 docker desktop适用于图形化的桌面电脑,docker engine适用于服务器。我们这里当然是安装docker…

SpringCloud-Gateway

一、介绍 (1)网关服务 (2)功能:断言、路由、过滤 (3)能避免用户直接访问到业务主机 二、项目搭建 a、编写pom.xml(注意移除web框架,gateway中自带有) &l…

7.定时器

定时器资源 CC2530有四个定时器TIM1~TIM4和休眠定时器 TIM1 定时器1 是一个独立的16 位定时器,支持典型的定时/计数功能,比如输入捕获,输出比较和PWM 功能。定时器有五个独立的捕获/比较通道。每个通道定时器使用一个I/O 引脚。定时器用于…

【API篇】二、源算子API

文章目录 0、demo数据1、源算子Source2、从集合中读取数据3、从文件中读取4、从Socket读取5、从Kafka读取6、从数据生成器读取数据7、Flink支持的数据类型8、Flink的类型提示(Type Hints) 0、demo数据 准备一个实体类WaterSensor: Data All…

【入门】.Net Core 6 WebApi 项目搭建

一、创建项目 1.1.创建新项目:打开开发工具>创建新项目>搜索API>选择C#语言的ASP.NET Core Web API 1.2.配置新项目:**自定义项目信息以及存储路径 1.3.其他信息:这里框架必须选择.NET 6.0,其他配置默认勾选即可,也可以根…

逐字稿 | 对比学习论文综述【论文精读】

对比学习在计算机视觉领域的发展历程,4个阶段: 百花齐放:方法、模型、目标函数、代理任务都还没有统一。CV双雄:MOCOv1、SimCLRv1、MOCOv2、SimCLRv2、CPC和CMC的延伸工作、SwaV,这个阶段发展非常迅速,以上…

云上攻防-云原生篇Docker安全系统内核版本漏洞CDK自动利用容器逃逸

文章目录 云原生-Docker安全-容器逃逸&内核漏洞云原生-Docker安全-容器逃逸&版本漏洞-CVE-2019-5736 runC容器逃逸-CVE-2020-15257 containerd逃逸 云原生-Docker安全-容器逃逸&CDK自动化 云原生-Docker安全-容器逃逸&内核漏洞 细节部分在权限提升章节会详解&…

SQLite4Unity3d安卓 在手机上创建sqlite失败解决

总结 要在Unity上运行一次出现库,再打包进APK内 问题 使用示例代码的创建库 var dbPath string.Format("Assets/StreamingAssets/{0}", DatabaseName); #else// check if file exists in Application.persistentDataPathvar filepath string.Format…

idea插件开发javax.net.ssl.SSLException: No PSK available. Unable to resume.

idea插件开发,编译出错 javax.net.ssl.SSLException: No PSK available. Unable to resume.at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:129)at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117)at java.base/sun.security.ssl.…

通讯网关软件024——利用CommGate X2Access实现Modbus TCP数据转储Access

本文介绍利用CommGate X2ACCESS实现从Modbus TCP设备读取数据并转储至ACCESS数据库。CommGate X2ACCESS是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示,实现从Modbus TCP设备读取数据并转储…

Ubuntu 上传项目到 GitHub

一、前言 GitHub 作为时下最大的开源代码管理项目,广泛被工程和科研人员使用,本文主要介绍如何如何将自己的项目程序上传到 GitHub 上。 要上传本地项目到 GitHub 上,主要分为两步,第一步是 二、创建 SSH keys 首先登录 GitHu…

Jenkins+Gitlab+Docker(Dockerfile)部署

Docker部署运行 ​ 上一篇内容中使用Jenkins(运行服务器)Gitlab(代码存储库)Webhook(网络钩子)的方式部署运行我们的项目。需要我们在服务器上做好很多相关的环境配置及依赖。 ​ 那么假如有这样一个场景:需要把不同技术栈的项目部署到同一台服务器上运行。比如PH…

如何开始使用 Kubernetes RBAC

基于角色的访问控制 (RBAC) 是一种用于定义用户帐户可以在 Kubernetes 集群中执行的操作的机制。启用 RBAC 可以降低与凭证盗窃和帐户接管相关的风险。向每个用户授予他们所需的最低权限集可以防止帐户拥有过多的特权。 大多数流行的 Kubernetes 发行版都从单个用户帐户开始,…

【MySQL × SpringBoot 突发奇想】全面实现流程 · 数据库导出Excel表格文件的接口

文章目录 【MySQL SpringBoot 小点子】全面实现流程 数据库导出Excel表格文件的接口1. 什么是VO(View Object)对象2. BeanCopyUtils进行两个对象的数据转移3. mapper层实现4. service层实现5. vo对象创建6. 保存路径配置7. controller层核心代码实现8.…

JavaFX: 使用本地openjfx包

JavaFX: 使用本地openjfx包 1、注释配置2、下载openjfx包3、导入openjfx的jar包 1、注释配置 build.gradle配置注释: 2、下载openjfx包 下载javaFx地址:https://gluonhq.com/products/javafx/ 3、导入openjfx的jar包

elasticsearch安装

安装elasticsearch 1.部署单点es 1.1.创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: docker network create es-net1.2.加载镜像 elasticsearch的镜像的tar包:点击下载 将其上传到虚拟机中…

电源集成INN3270C-H215-TL、INN3278C-H114-TL、INN3278C-H215-TL简化了反激式电源转换器的设计和制造。

一、概述 InnoSwitch™3-CP系列IC极大地简化了反激式电源转换器的设计和制造,特别是那些需要高效率和/或紧凑尺寸的产品。InnoSwitch3-CP系列将初级和次级控制器以及安全额定反馈集成到单个IC中。 InnoSwitch3-CP系列器件集成了多种保护功能,包括线路过…

gRPC之gRPC Gateway

1、gRPC Gateway etcd3 API全面升级为gRPC后,同时要提供REST API服务,维护两个版本的服务显然不太合理,所以 grpc-gateway 诞生了。通过protobuf的自定义option实现了一个网关,服务端同时开启gRPC和HTTP服务, HTTP服…