MySQL 索引(一)

文章目录

  • 索引(重点)
  • 硬件理解
    • 磁盘
    • 盘片和扇区
    • 定位扇区
    • 磁盘的随机访问和连续访问
  • 软件方面的理解
  • 建立共识
  • 索引的理解

在这里插入图片描述

索引(重点)

  1. 索引可以提高数据库的性能,它的价值,在于提高一个海量数据的检索速度。

在这里插入图片描述
案例:
建立一个海量表

drop database if exists 'my_index';
create database if not exists 'my_index' default character set utf8;
use 'my_index';--构建一个8000000条记录的数据
--构建的海量表数据需要有差异性,所以使用存储过程来创建, 拷贝下面代码就可以了,暂时不用理解--产生随机字符串
delimiter $$
create function rand_string(n INT)
returns varchar(255)
begin declare chars_str varchar(100) default'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ';declare return_str varchar(255) default '';declare i int default 0;while i < n do set return_str =concat(return_str,substring(chars_str,floor(1+rand()*52),1));set i = i + 1;end while;return return_str;end $$
delimiter ;--产生随机数字
delimiter $$
create function rand_num()
returns int(5)
begin declare i int default 0;set i = floor(10+rand()*500);
return i;
end $$
delimiter ;--创建存储过程,向雇员表添加海量数据
delimiter $$
create procedure insert_emp(in start int(10),in max_num int(10))
begin
declare i int default 0; set autocommit = 0;  repeatset i = i + 1;insert into EMP values ((start+i) 
,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());until i = max_numend repeat;commit;
end $$
delimiter ;--执行存储过程,添加8000000条记录
call insert_emp(100001, 8000000);

查询员工编号为998877的员工

select * from emp where empno=998877;

在这里插入图片描述
花了6.17秒,就你一个人就花了6秒,如果公司人很多,会死机的

给表加上索引

alter table emp add index(empno);

很明显加上索引之后,速度明显变快了
在这里插入图片描述

  1. 硬件->系统->MySQL

  2. 常见索引分为:
    主键索引(primary key)
    唯一索引(unique)
    普通索引(index)
    全文索引(fulltext)–解决中子文索引问题。

  3. 先整一个海量表,在查询的时候,看看没有索引时有什么问题?
    在海量的数据表中没有索引查询起来会变得很慢,如果有索引可以加快查询的速度

  4. 给emp表添加索引

alter table emp add index(empno);

硬件理解

磁盘

  1. MySQL中的每一个表就是一个文件
  2. MySQL 给用户提供存储服务,而存储的都是数据,数据在磁盘这个外设当中。磁盘是计算机中的一个机械设备,相比于计算机其他电子元件,磁盘效率是比较低的,在加上IO本身的特征,可以知道,如何提交效率,是 MySQL 的一个重要话题。
    在这里插入图片描述

盘片和扇区

在这里插入图片描述

  1. 扇区:数据库文件,本质其实就是保存在磁盘的盘片当中。也就是上面的一个个小格子中,就是我们经常所说的扇区。当然,数据库文件很大,也很多,一定需要占据多个扇区。
  2. 在半径方向上,距离圆心越近,扇区越小,距离圆心越远,扇区越大
  3. 那么,所有扇区都是默认512字节吗?目前是的,我们也这样认为。因为保证一个扇区多大,是由比特位密度决定的。
  4. 我们在使用Linux,所看到的大部分目录或者文件,其实就是保存在硬盘当中的。(当然,有一些内存文件系统,如: proc , sys 之类,我们不考虑)
  5. 数据库文件,本质其实就是保存在磁盘的盘片当中,就是一个一个的文件,找到一个文件的全部,本质,就是在磁盘找到所有保存文件的扇区。
  6. 而我们能够定位任何一个扇区,那么便能找到所有扇区,因为查找方式是一样的。

定位扇区

在这里插入图片描述

  1. 先找到柱面,再找磁头,最后找到扇区(chs)
  2. 系统读取磁盘是以块为单位的,基本单位是4kb,因为不以块为单位,以扇区为单位的话,一个是效率太慢,磁头每次都要转到相应的位置开始读取,单次是512字节,读取的量太少,第二个是耦合度太高,不便于硬件或操作系统各自升级

磁盘的随机访问和连续访问

  1. 随机访问:本次IO所给出的扇区地址和上次IO给出扇区地址不连续,这样的话磁头在两次IO操作之间需要作比较大的移动动作才能重新开始读/写数据。
  2. 连续访问:如果当次IO给出的扇区地址与上次IO结束的扇区地址是连续的,那磁头就能很快的开始这次IO操作,这样的多个IO操作称为连续访问。
  3. 因此尽管相邻的两次IO操作在同一时刻发出,但如果它们的请求的扇区地址相差很大的话也只能称为随机访问,而非连续访问。(所以OS的文件系统一般就会将我们的一些IO请求在底层做一些归类和排序,尽可能地增加连续访问的可能,另一方面减少了磁头的摆动次数也能提高磁盘的使用寿命
  4. 磁盘是通过机械运动进行寻址的,随机访问不需要过多的定位,故效率比较高。

软件方面的理解

  1. 为了提高基本的IO效率, MySQL 进行IO的基本单位是 16KB,使用 InnoDB 存储引擎
  2. 再数据块的流动方面都是数据块给操作系统,操作系统给mysql,mysql给操作系统,操作系统给磁盘
  3. MySQL 中的数据文件是以page为单位保存在磁盘当中的
  4. 证明MySQL是以16kb为单位的
  5. 也就是说,磁盘这个硬件设备的基本单位是 512 字节,而 MySQL InnoDB引擎使用 16KB 进行IO交互。即, MySQL 和磁盘进行数据交互的基本单位是 16KB 。这个基本数据单元,在 MySQL 这里叫做page注意和系统的page区分

在这里插入图片描述在这里插入图片描述

建立共识

  1. MySQL以16kb为单位进行mysql级别的IO
  2. MySQL要有自己的buff pool(缓冲池),会把数据读到buff pool里,把buff pool的数据刷新到操作系统的缓冲区里,最后刷新到磁盘
  3. 一定要尽可能的减少系统和磁盘IO的次数,一次IO的数据量越大,比多次IO数据量小效率更高
  4. mysql会预先开辟一个128mb的缓冲池

索引的理解

  1. 建立测试表,存储引擎默认是InnoDB的
create table if not exists user (id int primary key,     --一定要添加主键哦,只有这样才会默认生成主键索引age int not null,name varchar(16) not null
);
show create table user \G;
  1. 插入信息,插入5条无序的数据
--插入多条记录,注意,我们并没有按照主键的大小顺序插入哦
mysql> insert into user (id, age, name) values(3, 18, '杨过');
mysql> insert into user (id, age, name) values(4, 16, '小龙女');
mysql> insert into user (id, age, name) values(2, 26, '黄蓉');
mysql> insert into user (id, age, name) values(5, 36, '郭靖');
mysql> insert into user (id, age, name) values(1, 56, '欧阳锋');
  1. 查看表中的内容,发现数据是有序的

在这里插入图片描述
4. 理解page

在这里插入图片描述
5. 为何io操作要page?
为了减少IO的次数,提高IO的效率,在单个page中,不在单个page中,会进行多次IO操作
你怎么保证,用户一定下次找的数据,就在这个Page里面?---->我们不能严格保证,但是有很大概率再一个Page当中或者是周围的,因为有局部性原理。

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

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

相关文章

环境搭建-复现ST-GCN输出动作分类视频(win10+openpose1.7.0+VS2019+CMake3.30.1+cuda11.1)

这次我们安装github.com/yysijie/st-gcn这个作者源码环境&#xff0c;安装流程十分复杂这里介绍大体流程。 1.首先编译openpose的python API接口这个编译难度较大&#xff0c;具体参考博文&#xff1a;windows编译openpose及在python中调用_python openpose-CSDN博客 这个博…

HTML属性

HTML&#xff08;HyperText Markup Language&#xff09;是网页开发的基石&#xff0c;而属性&#xff08;Attribute&#xff09;则是HTML元素的重要组成部分。它们为标签提供附加信息&#xff0c;控制元素的行为、样式或功能。本文将从基础到进阶&#xff0c;全面解析HTML属性…

2025年“深圳杯”数学建模挑战赛C题国奖大佬万字思路助攻

完整版1.5万字论文思路和Python代码下载&#xff1a;https://www.jdmm.cc/file/2712073/ 引言 本题目旨在分析分布式能源 (Distributed Generation, DG) 接入配电网系统后带来的风险。核心风险评估公式为&#xff1a; R P_{loss} \times C_{loss} P_{over} \times C_{over}…

两数相加(2)

2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode * dummy new ListNode(0);int carry 0;ListNode * head dummy;while (l1 ! nullptr || l2 ! nullptr ||…

基于大模型的新型隐球菌脑膜炎智能诊疗全流程系统设计与实现的技术方案文档

目录 一、术前风险预测系统1. 多模态融合模型架构2. 风险预测流程图(Mermaid)二、麻醉剂量预测系统1. 靶控输注(TCI)模型2. 麻醉方案优化流程图(Mermaid)三、术后并发症预测模型1. 时序预测模型(LSTM)2. 并发症预测流程图(Mermaid)四、健康教育管理模块1. 移动健康(…

coze工作流完成行业调研报告

一、coze 是什么&#xff1f; Coze是由字节跳动推出的新一代AI应用开发平台&#xff0c;定位是零代码或低代码的AI开发平台&#xff0c;也被称为字节跳动版的GPTs &#xff0c;国内版名为“扣子”。 Coze有国内版和国外版两个版本。国内版网址为http://www.coze.cn &#xff…

智慧农业运维平台养殖—传感器管理监控设计—仙盟创梦IDE

智慧农业综合监测与智能执行系统简介 该系统围绕农业生产全流程&#xff0c;融合气象环境监测、农技指导精准推送及多维度智能控制&#xff0c;助力农业高效、科学发展。 气象环境与农技指导&#xff1a;于农业现场部署慧云智能物联网设备&#xff0c;实时监测空气温湿度、光照…

docker 镜像的导出和导入(导出完整镜像和导出容器快照)

一、导出原始镜像 1. 使用 docker save 导出完整镜像 适用场景&#xff1a;保留镜像的所有层、元数据、标签和历史记录&#xff0c;适合迁移或备份完整镜像环境。 操作命令 docker save -o <导出文件名.tar> <镜像名:标签>示例&#xff1a;docker save -o milvu…

Spring循环依赖问题

个人理解&#xff0c;有问题欢迎指正。 Spring 生命周期中&#xff0c;首先使用构造方法对 bean 实例化&#xff0c;实例化完成之后才将不完全的 bean放入三级缓存中提前暴露出 bean&#xff0c;然后进行属性赋值&#xff0c;此时容易出现循环依赖问题。 由此可见&#xff0c;…

JAVA自动装箱拆箱

引言 Java 中的**装箱&#xff08;Boxing&#xff09;和拆箱&#xff08;Unboxing&#xff09;**是自动类型转换的机制&#xff0c;用于在基本数据类型&#xff08;如 int、long 等&#xff09;和其对应的包装类&#xff08;如 Integer、Long 等&#xff09;之间进行转换。这种…

如何阅读、学习 Linux 2 内核源代码 ?

学习Linux 2内核源代码是深入理解操作系统工作原理的绝佳途径&#xff0c;但这无疑是一项极具挑战性的任务。下面为你提供一套系统的学习方法和建议&#xff1a; 一、扎实基础知识 操作系统原理 透彻掌握进程管理、内存管理、文件系统、设备驱动等核心概念。推荐阅读《操作系…

树莓派4的v4l2摄像头(csi)no cameras available,完美解决

根据2025年最新技术文档和树莓派官方支持建议&#xff0c;no cameras available错误通常由驱动配置冲突或硬件连接问题导致。以下是系统化解决方案&#xff1a; 一、核心修复步骤 强制禁用传统驱动 sudo nano /boot/firmware/config.txt确保包含以下配置&#xff08;2025年新版…

c++学习之路(3)

通过《c学习之路&#xff08;2&#xff09;》的学习&#xff0c;我们已经掌握了数据的储存&#xff0c;以及数据的读入与输出&#xff0c;这次课程&#xff0c;我们要学习if语句的使用方法以及逻辑表达式请各位学者做好准备&#xff0c;谢谢配合&#xff01;&#xff01;&#…

Java程序题案例分析

目录 一、基础语法 1. 类与对象 2. 接口与抽象类 二、面向对象语法 1. 继承与多态 2. 四种访问修饰符 三、设计模式相关语法 一、策略模式&#xff08;接口回调实现&#xff09; 1. 完整实现与解析 二、工厂模式&#xff08;静态工厂方法实现&#xff09; 1. 完整实…

comfyu BiRefNet-General模型下载及存放地方

https://huggingface.co/ZhengPeng7/BiRefNet/tree/main

HunyuanCustom:文生视频框架论文速读

《HunyuanCustom: A Multimodal-Driven Architecture for Customized Video Generation》论文讲解 一、引言 本文提出了 HunyuanCustom&#xff0c;这是一个基于多模态驱动的定制化视频生成框架。该框架旨在解决现有视频生成模型在身份一致性&#xff08;identity consistenc…

tryhackme——Enumerating Active Directory

文章目录 一、凭据注入1.1 RUNAS1.2 SYSVOL1.3 IP和主机名 二、通过Microsoft Management Console枚举AD三、通过命令行net命令枚举四、通过powershell枚举 一、凭据注入 1.1 RUNAS 当获得AD凭证<用户名>:<密码>但无法登录域内机器时&#xff0c;runas.exe可帮助…

Web3 学习全流程攻略

目录 🧭 Web3 学习全流程攻略 🌱 第一阶段:打好基础(Web3 入门) 🧠 目标: 📚 学习内容: ✅ 推荐资源: 🧑‍💻 第二阶段:技术栈搭建(成为 Web3 开发者) 🧠 目标: 📚 学习内容: ✅ 推荐资源: 🌐 第三阶段:构建完整 DApp(去中心化应用)…

Python程序打包为EXE文件的全面指南

Python程序打包为EXE文件的全面指南 Python程序打包为EXE文件是解决程序分发和环境依赖问题的有效方法。通过将Python脚本及其所有依赖项整合为单一可执行文件&#xff0c;用户无需安装Python解释器即可直接运行程序&#xff0c;极大提升了应用的便携性和用户体验。本文将深入…

22、城堡防御工事——React 19 错误边界与监控

一、魔法护盾&#xff1a;错误边界机制 1. 城墙结界&#xff08;Error Boundary&#xff09; // 客户端错误边界use client function useErrorBoundary() {const [error, setError] useState(null);​const handleError useCallback((error, errorInfo) > {setError(erro…