MySQL - 第10节 - MySQL索引特性

news2024/12/23 19:22:02

1.索引的概念

索引的概念:

• 数据库表中存储的数据都是以记录为单位的,如果在查询数据时直接一条条遍历表中的数据记录,那么查询的时间复杂度将会是O(N)。
• 索引的价值在于提高海量数据的检索速度,只要执行了正确的创建索引的操作,查询速度就可能提高成百上千倍。当一张表创建索引后,在数据库底层就会为表中的数据记录构建特定的数据结构,后续在查询表中数据时就能通过查询该数据结构快速定位到目标数据。
• 索引虽然提高了数据的查询速度,但在一定程度上也会降低数据增删改的效率,因为这时在对表中的数据进行增删改操作时,除了需要进行对应的增删改操作之外,可能还需要对底层建立的数据结构进行调整维护。

常见的索引分为:

• 主键索引(primary key)。

• 唯一索引(unique)。

• 普通索引(index)。

• 全文索引(fulltext)。

索引的价值:

使用如下SQL创建一个海量数据表:

drop database if exists `index_demon`;
create database if not exists `index_demon` default character set utf8;
use `index_demon`;

-- 构建一个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;
repeat
set i = i + 1;
insert into EMP values ((start+i)
,rand_string(6),'SALESMAN',0001,curdate(),2000,400,rand_num());
until i = max_num
end repeat;
commit;
end $$
delimiter ;

-- 雇员表
CREATE TABLE `EMP` (
  `empno` int(6) unsigned zerofill NOT NULL COMMENT '雇员编号',
  `ename` varchar(10) DEFAULT NULL COMMENT '雇员姓名',
  `job` varchar(9) DEFAULT NULL COMMENT '雇员职位',
  `mgr` int(4) unsigned zerofill DEFAULT NULL COMMENT '雇员领导编号',
  `hiredate` datetime DEFAULT NULL COMMENT '雇佣时间',
  `sal` decimal(7,2) DEFAULT NULL COMMENT '工资月薪',
  `comm` decimal(7,2) DEFAULT NULL COMMENT '奖金',
  `deptno` int(2) unsigned zerofill DEFAULT NULL COMMENT '部门编号'
);

-- 执行存储过程,添加8000000条记录
call insert_emp(100001, 8000000);

上述SQL中创建了一个名为index_demon的数据库,在该数据库中创建了一个名为EMP的员工表,并向表当中插入了八百万条记录。

将上述SQL保存到index_data.sql文件中,然后在MySQL中使用source依次执行文件中的SQL即可(该source依次执行文件的SQL命令需要一些时间)。如下:

SQL执行完毕后查看数据库就能看到一个名为index_demon的数据库。如下:

进入该数据库,在数据库中可以看到一个名为EMP的员工表。如下:

由于EMP表中有八百万条记录,因此在查看EMP表中的数据时可以带上limit子句。如下:

通过desc命令可以看到,目前EMP员工表中没有建立任何索引。如下:

查询EMP表中指定工号的员工信息,可以看到每次查询过程都需要花费4.6秒左右。如下:

当我们给员工表中的工号建立索引后,数据库底层就会为员工表中的数据记录构建特定的数据结构,需要注意的是,由于当前员工表中的数据量较大,因此建立索引时也需要花费较长时间。如下:

这时再查询EMP表中指定工号的员工信息,可以看到几乎检测不到查询时耗费的时间。如下:

根本原因就是,给员工工号创建索引后再根据员工工号来查询数据,这时就能够直接通过底层建立的数据结构来快速定位到目标数据,从而提高数据的检索速度,这就是索引的价值。


2.认识磁盘

• mysqld中的

• MySQL给用户提供存储服务,存储的数据在磁盘这个外设当中。

• 磁盘是计算机中的一个机械设备,相比于计算机的其他电子元件,磁盘的效率是比较低的。

• 而如何提高效率是MySQL的一个重要话题,因此我们有必要了解一下磁盘的相关内容。

2.1.磁盘的结构

2.1.1.磁盘的整体结构

磁盘的整体结构如下:

部分说明:

• 永磁铁: 机械硬盘的存储方式与磁带比较类似,磁体具有记忆的功能,永磁铁是为了保证磁性的稳定。
• 音圈马达: 硬盘读取数据的关键部位,主要作用是将存储在磁盘上的信息转换为电信号向外传输。
• 主轴: 保证电机稳定的转动,磁盘转动才能读出数据。
• 空气滤波片: 过滤空气硬盘透气孔中进入的空气,保证硬盘内部清洁,同时还可以防止硬盘内部的零件氧化,确保硬盘安全使用。
• 磁盘: 硬盘一般都是铝合金制作的,主要是用来存储文件的。
• 磁头: 用来读取盘片上的信息。
• 串行接口: 用来连接电脑与硬盘的接口,起到传输的作用。

2.1.2.磁盘中的一个盘片

一个磁盘由多个盘片叠加而成,盘片的表面涂有磁性物质,这些磁性物质就是用来记录二进制数据的,因为盘片的正反两面都可涂上磁性物质,因此一个盘片有两个盘面。

磁盘中的一个盘片如下:

部分说明:

• 磁道: 磁盘表面被分为许多同心圆,每个同心圆称为一个磁道,每个磁道都有一个编号,最外面的是0磁道。
• 扇区: 每个磁道被划分成若干个扇区,每个扇区的存储容量为512字节,每个扇区都有一个编号。
说明一下:

• 由于每个扇区的存储容量相同,因此最内侧磁道上的扇区数据密度最大,而最外侧磁道上的扇区数据密度最小。
• 近三十年来,扇区大小一直是512字节,但最近几年正在迁移到更大、更高效的4096字节扇区,通常称为4K扇区。
• 数据库文件就是保存在磁盘中的一个个扇区中的,因此找到一个文件本质就是,在磁盘上找到保存该文件的所有扇区。

2.1.3.扇区的定位方式

• 一个磁盘由多个盘片叠加而成,每个盘片有两个盘面,所有盘面中半径相同的同心磁道构成一个柱面。

• 每个盘面都有一个对应的磁头,每个磁头都有一个编号,所有的磁头都是连在同一个磁臂上的。

示意图如下:

定位扇区时采用CHS寻址方式:

• 磁头(Heads): 每个盘面都有一个对应的磁头,因此确定了磁头也就确定了数据在哪一个盘面。
• 柱面(Cylinder): 所有盘面中半径相同的同心磁道构成柱面,因此在确定了数据在哪一个盘面的基础上,再确定柱面也就确定了数据在该盘面上的哪一个磁道。
• 扇区(Sector): 每个磁道被划分成若干个扇区,因此在确定了数据在哪一个磁道的基础上,再确定扇区也就确定了数据在该磁道上的哪个扇区。
简单来说,CHS寻址方式就是先通过H确定数据所在的盘面,再通过C确定数据所在的磁道,最后通过S定位到目标扇区。

说明一下:

• CHS寻址方式是磁盘定位扇区的方式,但实际CHS寻址方式对磁盘以外的设备来说没什么作用,因此系统软件在定位磁盘上的数据时采用的是LBA(Logical Block Address,逻辑区块地址)。
• LBA是描述计算机存储设备上数据所在区块的通用机制,LBA和CHS之间可以通过计算公式进行相互转换,LBA存在的意义就是对底层逻辑器件进行虚拟化,让系统软件可以不用关心底层硬件具体的寻址方式,而实际底层硬件采用的还是CHS寻址方式。

2.1.4.操作系统与磁盘交互的基本单位

操作系统与磁盘进行IO交互的基本单位是4KB,而不是扇区的大小512字节,原因如下:

• 物理内存实际是被划分成一个个4KB大小的页框的,磁盘上的数据也会被划分成一个个4KB大小的页帧,因此操作系统与磁盘以4KB为单位进行IO交互,就能提高数据加载和保存的效率。
• 操作系统与磁盘进行IO交互时,如果直接以扇区的大小作为IO的基本单位,那么这时系统的IO代码和硬件就是强相关的,将来当硬件的扇区大小发生变化时就需要对应修改操作系统的IO代码。
• 此外,以扇区的大小作为IO的基本单位太小了,这就意味着读取同样的数据内容,需要进行更多次的磁盘访问,而磁盘的效率是比较低的,这样IO效率就降低了。
因此操作系统与磁盘以4KB作为IO交互的基本单位,一方面是为了提高IO效率,另一方面是为了实现硬件和系统的解耦。

2.2.磁盘的随机访问(Random Access)与连续访问(Sequential Access)

随机访问与连续访问:

• 随机访问: 本次IO所给出的扇区地址与上次IO给出的扇区地址不连续,磁头在两次IO操作之间需要做比较大的移动动作才能找到目标扇区进行IO。
• 连续访问: 本次IO所给出的扇区地址与上次IO给出的扇区地址是连续的,磁头很快就能找到目标扇区进行IO。
需要注意的是,尽管两次IO是在同一时刻发出的,但如果它们请求的扇区地址相差很大,那也只能称为随机访问,因为连续访问中的连续指的是访问的扇区地址的连续,而不是访问时间的连续,由于连续访问不需要过多的定位,因此效率比较高。


3.MySQL与磁盘交互的基本单位


4.索引的理解


5.索引操作

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

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

相关文章

B049-cms04-浏览次数 富文本 轮播图 上传

目录 浏览次数页面加载发送请求后台处理请求前台展示 展示日期富文本编辑static下引入富文本资源文件夹模态框文本域替换成如下内容底部引入相关文件调整模态框样式把富文本选项移到模态框前面上传表情或图片等富文本添加操作手动清空富文本编辑器内容修改操作手动回显富文本编…

postman接口测试—Restful接口开发与测试

开发完接口&#xff0c;接下来我们需要对我们开发的接口进行测试。接口测试的方法比较多&#xff0c;使用接口工具或者Python来测试都可以&#xff0c;工具方面比如之前我们学习过的Postman或者Jmeter &#xff0c;Python脚本测试可以使用Requests unittest来测试。 测试思路…

抖音短视频矩阵系统源码:技术开发与实践

目录 一.短视频账号矩阵管理系统囊括的技术 1.开发必备的开发文档说明&#xff1a; 二.技术文档分享&#xff1a; 1.底层框架系统架构&#xff1a; 2.数据库接口设计 1.技术开发必备的开发文档说明&#xff1a; 1.1系统架构&#xff1a; 抖音SEO排名系统主要由以下几个模…

PHP 对PDF文件实现数字签名

PHP通过TCPDF库对生成的PDF文件进行数字签名。 效果如下&#xff1a; 这个是因为签名证书不在可信任证书列表中。 目录 准备数字证书 1.申请数字证书 2.自签名证书 安装TCPDF 证书签名 设置证书路径 设置证书信息 设置文档签名 设置签名外观 图像签名外观 空签名外观…

git使用命令技巧

文章目录 前言查看提交用户名更改提交用户名查看文件的diff查看提交记录Git 本地分支管理查看、切换、创建和删除分支 前言 我们在使用git的时候&#xff0c;提交后会看到如下记录&#xff1a; 经常会遇到提交后&#xff0c;这个作者的名字和自己设置的名字不一致&#xff0…

Python文件操作指南:编码、读取、写入和异常处理

文章目录 文件的编码文件的读取使用 read 方法读取整个文件内容&#xff1a;使用 readlines 方法按行读取文件内容并存储到列表中&#xff1a;使用迭代器遍历文件内容&#xff1a; 文件的写入文件的追加文件操作的综合案例文件的关闭文件的存在性检查异常处理文件操作的更多方法…

如何下载外文文献,PubMed中的文献怎么获取

查找外文文献常用数据库有&#xff1a;PubMed、ScienceDirect、Wiley、Web of Science、EI等等。今天单独讲一下PubMed数据库文献的获取方法。 PubMed是生物医药领域使用最广泛的免费文献检索系统。但PubMed 的资讯并不包括期刊论文的全文&#xff0c;只是提供了指向全文提供者…

Meta Quest v55系统推送,浏览器支持多点触摸

6月25日青亭网报道&#xff0c;此前我们报道了Quest v55公测版系统更新解锁了GPU和CPU频率限制&#xff0c;以及动态分辨率渲染功能。 现在v55系统正式向所有人开启推送&#xff0c;并且加入了更多功能&#xff1a; 1&#xff0c;解锁GPU和CPU限制&#xff0c;支持动态分辨率渲…

Linux进程间通信——管道(上)

目录 前文 一&#xff0c;进程间通信介绍 二&#xff0c;什么是管道&#xff1f; 三&#xff0c;管道的基本原理 3.1 匿名管道 3.2 管道基本原理 四&#xff0c;样例代码 五&#xff0c;管道的读写规则 六&#xff0c;管道的特点 总结 前文 本文主要是讲解一下进程间…

一文告诉你低代码的价值

随着数字化时代的到来&#xff0c;软件开发已经成为企业不可或缺的一部分。然而&#xff0c;传统的软件开发过程往往缓慢而昂贵。由此&#xff0c;低代码开发平台的出现给企业带来了一种新的软件开发方式。在本文中&#xff0c;我们将探讨低代码开发平台的用处和发展史&#xf…

【数据分享】1929-2022年全球站点的逐年平均露点数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

centos7.x升级openeuler详细操作教程

本次升级使用工具为苏研提供 1. 升级前准备操作 1.1 注意事项 ● 迁移工具安装在辅助机中&#xff08;不进行系统迁移的机器&#xff09; ● 辅助机至少给迁移工具的安装预留 1.6G 内存空间 ● 安装之前需要关闭防火墙和 SELinux 的特殊要求 ● 工具安装环境需开启工具端口…

论文格式中要求作者加入orcid的链接在名字后边

论文格式中要求作者加入orcid的链接在名字后边&#xff0c;如下图&#xff1a; 使用网上给的各种写法会出现以下问题&#xff1a; &#xff08;1&#xff09;插入位置不合适 &#xff08;2&#xff09;出现一个正方形的框 &#xff08;3&#xff09;所有参考文献带框&#xff…

中国人民大学与加拿大女王大学金融硕士——努力必有回响,加油,金融人!

有付出&#xff0c;就会有收获&#xff1b;有努力&#xff0c;就会有回响。我们为梦想挥汗如雨&#xff0c;我们为未来奋力跋涉。金融领域在职读研的我们&#xff0c;突破了工作、生活等重围&#xff0c;进入到紧张学习的阶段&#xff0c;充分利用有限的时间完成自己蜕变&#…

微前端(micro-app)使用手册

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 micro-app 使用手册 micro-app 是借鉴了 Web Component 的思想&#xff0c;通过 Custom Element 结合自定义的 Shadow Dom&#xff0c;将微前端封装成一个类 Web Component 组件&#xff0c;从而实现微前端的组件化渲染。…

项目集活动—项目集交付阶段活动

项目集交付阶段活动包括协调和管理项目集实际交付所需执行的项目集活动。这些活动包括围绕 变更控制、报告和信息发布所开展的活动&#xff0c;以及围绕成本、采购、质量和风险所开展的活动。 这些活动提供了贯穿整个项目集生命周期的支持活动和流程&#xff0c;旨在提供项目集…

第十三章 Transformer注意力机制

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

日志分析篇之Linux日志分析

0x00 前言 Linux系统拥有非常灵活和强大的日志功能&#xff0c;可以保存几乎所有的操作记录&#xff0c;并可以从中检索出我们需要的信息。 本文 简介一下Linux系统日志及日志分析技巧。 0x01 日志简介 日志默认存放位置&#xff1a;/var/log/ 查看日志配置情况&#xff1a;…

抖音本地生活林客服务商开通

抖音林客系统是一种面向本地生活服务的平台&#xff0c;它将消费者与商家联系在一起&#xff0c;在提供更便捷的服务的同时也创造了商业机会。考虑到目前互联网和移动设备的普及程度&#xff0c;以及人们对于生活质量和便利性的不断追求&#xff0c;抖音林客系统具有广阔的市场…

【AUTOSAR】AUTOSAR开发工具链(十)----基于BTC的MIL/SIL测试操作说明(2)

三、PowerWindow demon SIL测试 <一>、如果是手写的纯C代码使用方法如下 创建C代码工程文件 添加C代码的工程文件和不在一个文件夹的头文件路径 选择测试结构 接口参数格式定义 设置采样时间等于调度周期 点击import,添加测试用例类似于MIL测试 <二>、如果是模型…