sql 之 索引

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。

1. 什么是索引

官方上面说索引是帮助MySQL高效获取数据的数据结构,通俗点来说,数据库索引就像是是一本书的目录,可以直接根据页码找到对应的内容,目的就是为了加快数据库的查询速度。

2. 索引原理

  • 数据结构:一般是 B+树(平衡树)作为其数据结构,因为B+树在插入、删除和查找操作中都具有良好的性能。也可能是使用哈希表
  • 通俗来讲,就是用空间替换时间

但是,为什么是B+树而不是B树呢?原因有两点:

  1. B树每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点能存储的key的数量很小,要保存同样多的key,就需要增加树的高度。树的高度每增加一层,查询时的磁盘I/O次数就增加一次,进而影响查询效率。而在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+树的高度。
  2. B+树的叶子节点上有指针进行相连,因此在做数据遍历的时候,只需要对叶子节点进行遍历即可,这个特性使得B+树非常适合做范围查询。

3. 索引分类

  • 主键索引:primary key

    • 设定为主键后,数据库自动建立索引,InnoDB为聚簇索引,主键索引列值不能为空(Null)
  • 唯一索引:

    • 索引列的值必须唯一,但允许有空值(Null),但只允许有一个空值(Null)
  • 复合索引:

    • 一个索引可以包含多个列,多个列共同构成一个复合索引
  • 全文索引:

    • Full Text(MySQL5.7之前,只有MYISAM存储引擎引擎支持全文索引)
    • 全文索引类型为FULLTEXT,在定义索引的列上支持值的全文查找允许在这些索引列中插入重复值和空值。全文索引可以在Char、VarChar 上创建
  • 空间索引:

    • MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型,MySQL在空间索引这方年遵循OpenGIS几何数据模型规则
  • 前缀索引:

    • 在文本类型为char、varchar、text类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定

4. 索引的优缺点

  • 优点:
    大大提高数据查询速度。
    可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。
    通过索引列对数据进行排序,降低数据的排序成本降低了CPU的消耗。
    被索引的列会自动进行排序,包括【单例索引】和【组合索引】,只是组合索引的排序需要复杂一些。
    如果按照索引列的顺序进行排序,对order 不用语句来说,效率就会提高很多。

  • 缺点:
    索引会占据磁盘空间。
    索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改查操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。
    维护索引需要消耗数据库资源。

5. 创建索引

- 创建主键索引:#建表时,主键默认为索引
create table user(id varchar(11) primary key,name varchar(20),age int
)#查看user表中的索引
show index from user;
  • 创建单列索引:
#创建单列索引,只能包含一个字段
create index name_index on user(name);
  • 创建唯一索引:
#创建唯一索引,只能有一个列
create unique index age_index on user(age);
  • 创建符合索引:
#复合索引
create index name_age_index on user(name,age);

下次讲 sql 的优化,其中也有关于索引的操作~

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

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

相关文章

深度学习笔记【订阅前必读】

一、同款pdf版本笔记使用情况 pytorch深度学习(共计169页,基于本人听完B站小土堆PyTorch深度学习快速入门教程所写) 发现这一份B站小土堆Pytorch深度学习笔记连985、211等高校同学都在使用(语雀在线版,笔记带评论) 二、笔记获取优…

vscode连接远程服务器一直需要输密码,但是连不上

问题:vscode连接远程服务器一直需要输密码,但是连不上。 解决办法:kill 掉该远程服务器,然后再重新连接 操作: windows: ctrlshiftp mac:cmdshiftp 调出指令,然后选择“Remote SSH:Kill Vscode Serve…

【代码随想录】day37:递增数字,监控二叉树

递增数字 def monotoneIncreasingDigits(self, n):""":type n: int:rtype: int"""# 找到不递增的位置i对应的数字k,前一个数字-1,后面都变为9,# 后序遍历nlist(str(n))for i in range(len(n)-1,0,-1):# 如果不递增if n[i]…

SpringMVC--概述 / 入门

目录 1. SpringMVC简介 2. 配置&入门 2.1. 开发环境 2.2. 创建maven工程 2.3. 手动创建 web.xml 2.4. 配置web.xml 2.4.1. 默认配置方式 2.4.2. 扩展配置方式 2.5. 创建请求控制器 2.6. 创建springMVC的配置文件 2.7. 测试 HelloWorld 2.7.1. 实现对首页的访问…

基于java+springboot+vue实现的教学辅助系统(文末源码+Lw)23-225

摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差&#…

如何在Linux中安装NVM(Node Version Manager)

NVM(Node Version Manager)是一个命令行工具,允许您轻松在同一台计算机上安装和管理多个版本的Node.js。它是Node.js开发者的神器,特别适用于需要在不同项目间切换Node.js版本的场景。下面是在Linux系统上安装NVM的详细步骤&#…

健康元 穿越周期看底色

中国创新药正在迈进2.0时代。 进入2024年之后,越来越多的国内创新药企开始主动调整研发管线,缩减研发开支,甚至是直接被“溢出”了市场。 在“风向标”的融资端,过去的2023年也是中国创新药融资市场连续第二年出现一二级市场融资…

启航IT行业:零基础者的入门指南

随着数字化转型成为全球趋势,IT行业的需求日益增长,吸引了大量寻求职业转型的人群。对于那些没有任何相关背景的人来说,踏入IT的大门可能看起来不易,但是通过一些明智的策略和持续的努力,实现这一跳跃并非遥不可及。以…

python教程(4更新中)

单元测试 如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生。 单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。 比如对函数abs(),我们可以编写出以下几个测…

逆向入门:为CTF国赛而战day03

今天来做几道题目。 环境准备:ida ,Exeinfo,万能脱壳器(后面有写资源) 强推,亲测有效CTF小工具下载整理_ctf工具御剑下载-CSDN博客 [网站BUUCTF] 目录 题目一 题目二三 题目4:新年快乐 题目一 easyre题解_easyr…

电脑硬件 - 硬盘

硬盘是一台电脑的数据中心,存放着我们用户的所有文件和数据 对于一块硬盘,其重要指标:顺序读写能力,随机读写能力 顺序读写影响大文件的拷贝,随机读写影响大量小文件的拷贝(打开软件的快慢) 因…

【算法详解】双指针

双指针 常见的双指针有两种形式,一种是对撞指针,一种是左右指针。 1. 双指针简介 双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针进行访问&#…

vue2转vue3一些属性使用方法总结 (持续更新中)

1.vue3中不再需要用this.$set 方法 在 Vue 3 中,this. s e t 方法不再存在,因为 V u e 3 使用了 P r o x y 来实现其响应式系统,使得对象的属性访问和修改都能够被自动追踪。因此,在 V u e 3 中,你通常不需要使用特殊的…

chrome google浏览器添加插件扩展失败怎么办,无法从该网站添加应用、扩展程序和用户脚本确定,

无法从该网站添加应用、扩展程序和用户脚本确定 chrome google浏览器添加插件扩展失败怎么办,无法从该网站添加应用、扩展程序和用户脚本确定, 需要打开调试模式 chrome://extensions/

【Vue】Vue3父子组件相互调用示例

目录 1. 父调子示例1.1 父组件1.2 子组件 2. 子调父示例2.1 父组件2.2 子组件 Tips:使用场景情况有很多,通常常见于页面表单赋值,表单属性页面回显。 页面给弹窗dialog表单赋值,通常情况为父传子;而表单提交后回传给页…

第32篇:实时时钟

Q:本期我们使用BCD计数器设计实现分--秒--厘秒实时时钟。 A:实时时钟设计:在2个七段数码管上显示分钟(从0到59),在2个七段数码管显示秒(从0到59),在2个七段数码管上显示…

要不要那么卷啊?前端是不是死了?

最近在找前端工作。发现好多还要求至少会一个后端的语言php或者java。这个我理解毕竟要和后端对接要求懂点也是可以的。但是最近发现还要会设计,有设计感可以自己设计。what?这我都会了。工资总是要多一点吧?结果工作经验3-5年竟然9k-12k。离…

信息工程大学第五届超越杯程序设计竞赛(同步赛)vp

目录 A.遗失的旋律 C.财政大臣 D.实验室有多少人 E.在雾中寻宁静 F.不规则的轮回 G.完美数字 M.Monikas game A.遗失的旋律 思路&#xff1a;模拟即可 代码如下&#xff1a; #include<bits/stdc.h>using namespace std; #define fs first #define sc second #de…

中国平安八度蝉联Brand Finance全球保险品牌价值第一,品牌价值持续增长4.2%

近日&#xff0c;国际知名品牌价值评级机构Brand Finance发布《2024年全球保险品牌价值100强》&#xff0c;中国平安连续第八年蝉联全球第一&#xff0c;品牌价值高达336亿美元&#xff0c;较上年增长4.2%。榜单其余前五位依次为德国安联保险、中国人寿、法国安盛保险、中国太平…

JavaScript的事件对象

event 对象包含“与创建它的事件有关的”属性和方法。触发的事件类型不一样&#xff0c;可用的属性和方法不一样。 1.什么是事件对象 官方解释&#xff1a;event 对象代表事件的状态&#xff0c;比如键盘按键的状态、鼠标的位置、鼠标按钮的状态等。简单理解&#xff1a;事件发…