查询利器—索引

news2025/8/9 17:08:23

目录

索引的优缺点

常见索引分类

MySQL数据操作的宏观过程

认识磁盘

正式理解索引结构

采用B+树的原因

聚簇索引与非聚簇索引

索引操作

索引创建原则


索引的优缺点

优点:提高一个海量数据的检索速度 

缺点:查询速度的提高是以插入、更新、删除的速度为代价的,这些写操作,增加了大量的IO

创建索引前

创建索引后

常见索引分类

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

MySQL数据操作的宏观过程

MySQL对数据做的CURD(增删查改)操作,根据冯诺依曼体系,MySQL不可能直接去访问磁盘

实际上,数据库中对数据做的所有的访问,全部都是在内存中进行的

MySQL也会定期的将数据刷新到磁盘中!

如下图,能通过调用syncfs接口将内核缓冲区中的数据手动刷新到磁盘,也能系统自动刷新!

认识磁盘

目前我们认为,每个扇区的默认大小为512B

磁头(Heads)、柱面(Cylinder)(等价于磁道)、扇区(Sector)对应的编号。即可在磁盘上定位所要
访问的扇区,这种磁盘数据定位方式叫做 CHS
系统软件使用的并不是CHS,而是LBA,LBA ,一种线性地址,可以想象成虚拟地址与物理地
址, 系统将 LBA 地址最后会转化成为 CHS ,交给磁盘去进行数据读取
系统软件与IO交互的基本单位并不是512B,而是4KB ,原因如下:
如果操作系统直接使用硬件提供的数据大小进行交互,那么系统的IO代码,就和硬件强相关,换言
之,如果硬件发生变化,系统必须跟着变化
从目前来看,单次IO 512字节,还是太小了。IO单位小,意味着读取同样的数据内容,需要进行多
次磁盘访问,会带来效率的降低
随机访问:本次IO所给出的扇区地址和上次IO给出扇区地址不连续,这样的话磁头在两次IO操作
之间需要作比较大的移动动作才能重新开始读/写数据
连续访问:如果当次IO给出的扇区地址与上次IO结束的扇区地址是连续的,那磁头就能很快的开始
这次IO操作,这样的多个IO操作称为连续访问
系统中一定存在大量的IO请求,那么操作系统就需要管理这些IO请求,管理方式:先描述,再组织
MySQL和磁盘进行数据交互的基本单位是16KB,这个基本数据单元,在 MySQL 这里叫做page
(注意和系统的page区分)
为何IO交互要是 Page,而不是用多少,加载多少不好吗?
如果MySQL要查找id=2的记录,第一次加载id=1,第二次加载id=2,一次一条记录,那么就需要2
次IO,如果要找id=5,那么就需要5次IO!
如果这5条(或者更多)都被保存在一个Page中(16KB,能保存很多记录),那么第一次IO查找id=2的
候,整个Page会被加载到MySQL的Buffer Pool中,这里完成了一次IO,但是往后如果在查找
id=1,3,4,5等,完全不需要进行IO了,而是直接在内存中进行了,这样就减少了IO的次数!
虽然无法保证用户下次找到的数据就在这个Page里,但是有很大概率!因为有局部性原理!!!
IO效率低下的最主要矛盾不是IO单次数据量的大小,而是IO的次数
建立共识
MySQL 中的数据文件,是以page为单位保存在磁盘当中的
MySQL 的 CURD 操作,都需要通过计算,找到对应的插入位置,或者找到对应要修改或者查询
数据
只要涉及计算,就需要CPU参与,而为了便于CPU参与,一定要能够先将数据移动到内存当中
在特定时间内,数据一定是磁盘中有,内存中也有。后续操作完内存数据之后,以特定的刷新策
略,刷新到磁盘
为了更好的进行上面的操作, MySQL 服务器在内存中运行的时候,在服务器内部,就申请了被称
为 Buffer Pool 的的大内存空间,来进行各种缓存
为了更高的效率,一定要尽可能的减少系统和磁盘IO的次数
正式理解索引结构
MySQL中,在任何一个时刻,一定会存在大量的Page页存在于MySQL内部,MySQL本身就要对
它的Page进行管理,先描述,再组织!
如下图,在user表中插入以下数据后,会自动按 id (主键属性列)排好序
单个Page
现在的页模式内部,实际上是采用了链表的结构,前一条数据指向后一条数据,本质上还是通过数
据的逐条比较来取出特定的数据,效率太低了!
如何提高在一个页内进行搜索的效率
用创作书籍的方式,添加目录!即以空间换时间!
为什么要排好序
因为按照主键属性列排好序后,可以很方便的引入目录!!!
多个Page
一个Page只有16kb的空间,数据量不断增大时,就得添加新的Page页来存储数据,可当我们查找
数据时,虽然Page内部有目录,但是Page之间还是通过双链表连接的,也存在效率问题,在
Page 之间,也是需要 MySQL 遍历的,遍历意味着依旧需要进行大量的IO,将下一个Page加载到
存,进行线性检测
如何提高多个Page查找数据的效率
类似于单个Page的做法,也给Page也带上目录!!!
如下图所示,以第二行为例,该行的一个Page中存储的都是第三行每个Page 最小的id,除了最后
一层存储数据外,其余层都只存放目录!!!也就形成了下图中的B+树结构!
Page分为目录页和数据页。目录页只放各个下级Page的最小键值

目录页的本质也是页,普通页中存的数据是用户数据,而目录页中存的数据是普通页的地址

查找的时候,自顶向下找,只需要加载部分目录页到内存,不需要太多的加载无效的Page,即可

完成算法的整个查找过程,大大减少了IO次数

什么是主键索引

所有的数据最终可以在磁盘中,也可以在MySQL的buffer pool内存中

所有的数据都必须以Page 为单位进行IO,以Page为单位进行组织

在MySQL内部,将热点数据,以B+树的形式将所有的Page页,进行组织,形成的数据结构与其

配套的查找算法,叫做索引!

采用B+树的原因

InnoDB 在建立索引结构来管理数据的时候,其他数据结构为何不行
链表,线性遍历,查询效率太低;二叉树搜索树,可能会退化成为线性结构;AVL和红黑树,因为
是二叉结构,树整体过高,因为是自顶向下查找,层高越高,意味着系统与硬盘会更多的IO Page
交互;Hash结构,因为是散列的,比如在查找数学成绩在60-80分的同学时,效率就不够高了!
为什么不选择B树,而选择B+树
B树节点,既有数据,又有Page指针,而B+,只有叶子节点有数据,其他目录页,只有键值和
Page指针,所以对于B+树,一个节点可以存储更多的key,使得树更矮,IO操作次数更少
B+叶子节点,全部相连,而B没有,所以B+树更便于进行范围查找
B+树在哪里
在磁盘上有完整的B+树和数据,在内存中有局部高频被访问的B+树的核心Page,MySQL查找一
定会伴生着MySQL根据B+树进行Page的换入换出!
MySQL其实就是一个文件系统!!!
聚簇索引与非聚簇索引
下图为 MyISAM 表的主索引,Col1 为主键,将索引Page和数据Page分离,叶子节点没有 数据,
只有对应数据的地址,MyISAM 这种用户数据与索引数据分离的索引方案,叫做非聚簇引
如下图,创建了一个表格,存储引擎为MYISAM,建好后就有了右边的三个文件,frm是表结构,
MYD是数据,MYI是主键索引数据
InnoDB 这种用户数据与索引数据在一起索引方案,叫做聚簇索引
除了主键索引外,还有辅助(普通)索引,唯一区别在于,主键不能重复,而非主键可重复
如下图,InnoDB 的非主键索引中叶子节点并没有数据,而只有对应记录的key值
通过辅助(普通)索引,找到目标记录,需要两遍索引:首先检索辅助索引获得主键,然后用主键
到主索引中检索获得记录,这种过程,就叫做回表查询
对于普通索引,不给叶子节点附上数据,是因为太浪费空间了!
索引操作
创建主键索引
方式一:在创建表的时候,直接在字段名后指定 primary key
方式二:在创建表的最后,指定某列或某几列为主键索引
例:create table user2(id int, name varchar(30), primary key(id));
方式三:创建表后添加索引
例:alter table user3 add primary key(id);
查询索引
show index from 表名;
注意:下图中的BTREE不是B树,而是B+树!!!
另外两种方式则是:
show keys from 表名;
desc 表名;
创建唯一键索引
方式一:在表定义时,在某列后直接指定unique唯一属性
方式二:创建表时,在表的后面指定某列或某几列为unique
例:create table user5(id int primary key, name varchar(30), unique(name));
方式三:创建表后添加唯一键索引
例:alter table user6 add unique(name); 
创建普通索引
方式一:在表的定义最后,指定某列为索引
方式二:创建完表以后指定某列为普通索引
例:alter table user9 add index(name);
方式三:创建一个索引名为 idx_name 的索引
例:create index idx_name on user10(name);
删除索引
删除主键索引:alter table 表名 drop primary key;
其他索引的删除: alter table 表名 drop index 索引名; 索引名就是show keys from 表名中的
Key_name 字段
方法三:drop index 索引名 on 表名
全文索引的创建
当对文章字段或有大量文字的字段进行检索时,会使用到全文索引。MySQL提供全文索引机制,

但是有要求,要求表的存储引擎必须是MyISAM,而且默认的全文索引支持英文,不支持中文,

如果对中文进行全文检索,可以使用sphinx的中文版(coreseek)

如下图,创建一个全文索引的表格,以及插入数据

查询有没有database数据 

explain可以查看细节,key为NULL,表示没有采用全文索引的方式

采用全文索引
注意:key为title,并不是只用到了表格列title,而是索引的名称为title

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

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

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

相关文章

pdf生成:wkhtmltopdf

wkhtmltopdf是开源(LGPLv3)命令行工具,使用Qt WebKit渲染引擎将HTML渲染为PDF和各种图像格式。这些完全以“headless”模式运行,不需要显示或显示服务wkhtmltoimage。建议: 不要将wkhtmltopdf与任何不受信任的HTML一起…

sqli-labs/Less-61

这一关的欢迎界面提示我们尝试机会为5次 然后要以id为注入点 首先先判断一下是否为数字型 输入id1 and 12 回显如下 所以属于字符型 然后输入1 回显如下 出现了报错信息 说明可以进行报错注入 也说明了注入类型 佐证一下 输入一个1))--回显如下 这道题我还是使用报错注入 首…

使用Python查询国内 COVID-19 疫情

有时我们只是想要一个速的工具来告诉当前疫情的情况,我们只需要最少的数据。 使用Python语言和tkinter图形化显示数据。 首先,我们使用 Tkinter 库使我们的脚本可以图形化显示。 使用 requests 库从 丁香园 获取数据。 然后我们将在这种情况下显示我们…

c# .net+香橙派orangepi 200块多打造自家 浇花助手 系统

由于出差多,这里的花经常过一段时间才能浇水,有些花都旱晕了,所以想做一个助手帮我远程就可以操作浇花,当然也完全可以发展为一个商用系统,拿浇花来做为一个测试平台吧,现在已经完成了,并已经运行了一个多月…

异双功能连接体:Alkyne PEG4 APN,2183440-36-8

一、产品描述: APN-C3-PEG4-炔是一种含有APN部分的异双功能连接体,对半胱氨酸和炔基具有很强的化学选择性。APN半胱氨酸缀合物在水性介质、人血浆和活细胞中的优异稳定性使这种新的巯基点击反应成为生物缀合应用的一种有前景的方法。 APN-C3-PEG4 alkyne…

C语言:关键字----switch、case、default(开关语句)

C语言:基础开发----目录 C语言:关键字—32个(分类说明) 有32个关键字详细说明,还有跳转链接! 一、开关语句----介绍 开关语句,包括以下四种关键字: switch:开关语句case: 开关语句…

PHP如何实现订单的延时处理详解

业务需求 订单是我们在日常开发中经常会遇到的一个功能,最近在做业务的时候需要实现客户下单之后订单超时未支付自动取消的功能,刚开始确认了几种方法: 客户端到时间请求取消服务端定时查询有没有需要取消的订单,然后批量处理下…

深度学习入门(五十)计算机视觉——转置卷积

深度学习入门(五十)计算机视觉——转置卷积前言计算机视觉——转置卷积课件(初见转置卷积)1 转置卷积2 为什么称之为“转置”课件(再谈转置卷积)1 转置卷积2 重新排列输入和核形状换算同反卷积的关系总结教…

Android -- 每日一问:Activity的启动模式(launchMode)有哪些,有什么区别?

经典回答 这应该是一道很虐人的面试题,很多人都答不上来,很多人根本就没有用过。当我发现在被我面试的人中有80%的比例对它不了解时,我找过一些同事讨论是否还有在面试中考查这个问题的必要,得到的回答是“程序员何苦为难程序员”…

网络面试题总结

IO协议 问题一:如何理解IP的不可靠和无连接 不可靠:指的是不能保证数据包能成功地到达目的地。发生错误的时候,丢弃该数据包,发送ICMP消息给信源端。可靠性由上层提供。无连接: :IP 不维护关于后续数据报的状态信息。 体现在,IP 数据可以不按顺序发送和接收。A 发送连续…

信息安全工程实践笔记--Day2 暴力破解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录实验目标一、弱口令分类1.系统服务弱口令2.设备弱口令3.社工型的弱口令二、弱口令的攻击方式暴力破解获取密码的方式三、bp实操1.bp模块讲解1.sniper(狙击…

跨平台下移动应用的开发框架对比与分析

当前由于移动互联网技术的日益发展,人们对移动互联网程序的要求也是越来越高,以往的互联网程序已经不能满足人们日益增长的需求,对此相关的工作技术人员要不断努力,研发出与时俱进的移动互联网程序。 近些年来由于平板电脑、智能…

【HTML5】调查问卷制作简约版

当你第一次使用CSS时候 目录 1、调查问卷网页展示及源码 1.1html源码 1.2css源码 2、form表单属性的用法 2.1date属性 2.2radio属性 2.3checkbox属性 2.4textarea标签 2.5required属性 2.6button标签 前言: 大家好,我是拳击哥带你捶键盘。首先感…

是前端受欢迎,不是你学了前端你就受欢迎好吧

☆ 这几天世界杯真是爆冷啊,也许是这届世界杯是冬天举办的原因吧。 ☆ 昨晚的德国对日本,日本做为亚洲小组冲出的第一名,实力强没有问题。而且我从小就看《足球小子》,大空翼深入人心啊。还记得那个动画片,放了学赶紧回…

运营版uniapp多商户商城小程序+H5+APP+商家入驻短视频社区种草直播阶梯拼团

运营版uniapp多商户商城小程序H5APP商家入驻短视频社区种草直播阶梯拼团 前后端全套源码, 支持二次开发,代码无加密! 独立商家后台 用于店铺商品管理订单管理发货管理等 多类经营模式 多商家B2B2C、自营B2C运营模式 私有化部署 前端Uni…

Unity编辑器拓展最全实现

1编辑器顶部菜单学习 验证事项 2编辑器Scene菜单学习 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;public class TestSceneMenu : MonoBehaviour { [InitializeOnLoadMethod] //加入这个属性,就相当于…

7.前端笔记-CSS-元素显示模式

HTML元素分为块元素和行内元素两种类型 1、块元素 常见的块元素&#xff1a; <h1>~<h6> <p> <div> <ul> <ol> <li>块元素的特点&#xff1a; &#xff08;1&#xff09;独占一行 &#xff08;2&#xff09;高度、宽度、内外边距可…

java线程池详解

一 介绍 线程我们可以使用 new 的方式去创建&#xff0c;但如果并发的线程很多&#xff0c;每个线程执行的时间又不长&#xff0c;这样频繁的创建线程会大大的降低系统处理的效率&#xff0c;因为创建和销毁进程都需要消耗资源&#xff0c;线程池就是用来解决类似问题。 线程…

餐饮+KTV融合消费模式,会受消费者喜欢吗?

这个五一&#xff0c;我们雨科网门店系统的客户&#xff0c;大侠火锅店终于是将KTV搬到了自己的门店里&#xff0c;运用门店小程序功能及纸质代金券及礼品的噱头吸引客户进店&#xff0c;只需消费并和任意一人合唱一首歌即可领取&#xff0c;消费者在等餐或放松的时候一键点歌演…

一起来了解下 TOWER “未知装置”

从 2022 年 11 月 9 日开始&#xff0c;TOWER 未知装置可在 TOWER Token 网站&#xff08;https://www.crazydefenseheroes.com/fusion/game-assets&#xff09;上使用&#xff0c;允许玩家使用 TOWER Token 融合他们的 NFT 或将他们现有的 TOWER NFT 跟踪为不同的形式。 第一阶…