SQL进阶理论篇(三):什么是索引

文章目录

  • 简介
  • 索引是万能的吗
  • 索引的种类有哪些?
    • 普通/唯一/主键/全文索引
    • 聚集索引与非聚集索引
    • 单一索引与联合索引
  • 总结
  • 参考文献

简介

索引在SQL优化中占了很大的比重,甚至可以说,对SQL的优化,其实就是对索引的优化。

但是索引并不是万能的,用好了索引,确实可以提升SQL的查询效率,甚至提升十倍以上。但是用错了索引,也可能会降低查询的效率。

索引是万能的吗

什么是索引(index)呢?

数据库中的索引,就好比是一本书的目录,可以帮我们快速进行特定值的定位查找,从而提高整体查询的效率。

所以,索引就是帮助数据库管理系统高效获取指定数据的一种数据结构

如果不使用索引的话,我要找一个特定值,就必须从第一条数据开始,一条一条扫描,直到找到我需要的数据。可想而知的慢。

那既然如此,我把所有字段都建上索引不就好了,那整个表岂不是查啥都会很快?

倒也不是。

首先,如果你的数据行数比较少,比如说还不到1000行,这就不需要创建索引了,可能直接遍历的速度还更快,因为启用索引也是有时间开销的。

另外,当数据重复度大的时候,比如高于10%,也可以不对这个字段进行索引。就像我们之前说过的性别字段,如果需要在100w行数据里查找出那50w行性别为男的数据,加上索引也不会变快,因为索引里一般是只保存了主键,即使快速定位到了这50w主键,下一步还是要回表,依次取出这50w数据。

那性别字段真的不适合创建索引吗?

也不绝对。

假设有一个女儿国,100w人里只有10个男性,那么当我们要通过select * from user where gender=1;来筛选出男性的记录时,针对性别建了索引,要比不建索引的效率快的多。

因此我们可以得出结论,索引的价值在于快速定位少量数据。如果需要定位的数据有很多,那么索引就失去了它的使用价值,比如通常情况下的性别字段(通常情况下的男or女 ,不是指老美的近百种性别)。

我们不仅要看字段中的数值个数,还要根据数值的分布情况来考虑是否创建索引。

索引的种类有哪些?

从功能逻辑上来讲,索引主要有4类,分别是普通索引、唯一索引、主键索引和全文索引

从物理实现方式上来区分,索引可以分为2种:聚集索引和非聚集索引,其中,非聚集索引也被称为是二级索引或者辅助索引。

如果是按照字段个数进行划分,则可以分为两类:单一索引和联合索引

普通/唯一/主键/全文索引

普通索引是基础索引,没有任何约束,主要是用来提升查询效率的;

唯一索引,是在普通索引的基础上,对字段添加了唯一性约束;

主键索引,是在唯一索引的基础上,对字段添加了非空约束,也就是NOT NULL + UNIQUE,一张表里最多只能有一个主键索引。

全文索引,用的不多,MySQL自带的全文索引只支持英文。

前三种索引其实都是一类索引,只不过是对数据的约束性逐渐提升。不过要注意,单表中,只能有一个主键索引,因为数据存储在文件中只能按照一种顺序进行。

聚集索引与非聚集索引

聚集索引可以按照主键来排序存储数据,主键索引后面就是数据(类似数组,可以简单理解成,索引位置存储的就是对应的数据行),这样子,找到了索引值所在的位置,就相当于找到了数据的位置,在查找行的时候非常有效。

只有当表包含聚集索引时,表内的数据行才会按照索引值在磁盘上进行物理排序和存储。每个表只能有一个聚集索引,因为数据行本身只能按照一个顺序存储。

一般来讲,主键索引或者唯一非空索引,都可以作为聚集索引。

在MySQL的InnoDB里,

  • 如果一张表定义了主键索引,那么这个主键索引就作为聚集索引。
  • 如果没有定义主键索引,那么该表的第一个唯一非空索引作为聚集索引。
  • 如果也没有唯一非空索引,那么InnoDB会生成一个隐藏的自增主键作为聚集索引。

总之InnoDB一定会给自己搞出一个聚集索引,用来指导自身在磁盘上的排序。

非聚集索引是什么呢?

在数据库管理系统中,会有单独的存储空间来存放非聚集索引。这些索引是按照顺序存储的,但是索引里存储的并不是对应的数据行,而是数据行存储的地址

也就是说,在正式使用的时候,系统会进行两次查找,第一次先找到索引,第二次去索引对应的位置取出数据行。

这不同于聚集索引,聚集索引相当于是索引里存储的就是对应的数据行,索引排序后相当于是对所有数据行排序了。非聚集索引是维护有单独的索引表,它只保证索引表是有序的,而数据行仍然是随机存储的

复制一下教程里对聚集索引和非聚集索引的总结:

  • 聚集索引的叶子节点存储的就是我们的数据记录,非聚集索引的叶子节点存储的是数据位置。非聚集索引不会影响数据表的物理存储顺序。
  • 一个表只能有一个聚集索引,因为只能有一种排序存储的方式,但可以有多个非聚集索引,也就是多个索引目录提供数据检索。
  • 使用聚集索引的时候,数据的查询效率高,但如果对数据进行插入,删除,更新等操作,效率会比非聚集索引低。

前两项总结好理解,该如何理解第三项总结里的"插入/删除/更新时,聚集索引会更慢"呢?

主要是因为聚集索引,其实是面向读取的设计。

由于我们的数据,会按照聚集索引的大小顺序依次写入磁盘,所以当我们更新或者插入一条随机的数据时,所有的记录需要重新排序并按照新顺序重写进磁盘。

而非聚集索引由于维护的只是个索引表,只需要更新下索引表就可以,数据行还是随机存。

所以在数据量很大的情况下,这个效率的差距是很明显的。

单一索引与联合索引

索引列为一列时,是单一索引;

多个列组合在一起创建的索引,叫做联合索引。

创建联合索引时,我们需要注意创建时的顺序问题,因为联合索引 (x, y, z) 和 (z, y, x) 在使用的时候效率可能会存在差别。

这是因为联合索引的 最左匹配原则 。就是按照最左优先的方式进行索引的匹配。

比如以(x, y, z)的顺序创建联合索引,如果查询条件是where x=1 and y=2 and z=3,就可以匹配上索引;如果查询条件是where y=2,就匹配不上联合索引。

其实就是说,如果联合索引最左边的字段没有进入查询条件里,那么联合索引就无法发挥作用。

总结

对where字句的字段建立索引,可以大幅度提升查询的效率。

采用聚集索引进行数据查询,比使用非聚集索引的查询效率略高。

索引其实还存在一些不足,比如说占用额外的存储空间、会降低数据库的写操作性能等,如果有多个索引的话,还会增加索引选择的时间。因此在使用索引的时候,需要在效率和维护代价之间做平衡。

参考文献

  1. 23丨索引的概览:用还是不用索引,这是一个问题

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

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

相关文章

《深入理解 Android ART 虚拟机》笔记

Dex文件格式、指令码 一个Class文件对应一个Java源码文件,而一个Dex文件可对应多个Java源码文件。开发者开发一个Java模块(不管是Jar包还是Apk)时: 在PC平台上,该模块包含的每一个Java源码文件都会对应生成一个同文件…

Dubbo连接协议配置基础V2.0.0

Dubbo连接所使用的协议 一、dubbo://协议 1.1、使用场景: Dubbo 缺省协议采用单一长连接和 NIO 异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。反之,Dubbo 缺省协议不适合传送大数据量的服…

Flink Window中典型的增量聚合函数(ReduceFunction / AggregateFunction)

一、什么是增量聚合函数 在Flink Window中定义了窗口分配器,我们只是知道了数据属于哪个窗口,可以将数据收集起来了;至于收集起来到底要做什么,其实还完全没有头绪,这也就是窗口函数所需要做的事情。所以在窗口分配器…

计算机组成原理-ATT格式vsIntel格式

文章目录 AT&T格式 vs lntel格式 x86汇编语言是lntel格式,还有一种汇编语言格式是AT&T AT&T格式 vs lntel格式 lntel格式中取主存地址内容未指明长度默认为32位,对应下图中第四行右边的指令 百分号 美元符号 小括号 可用于计算机结构体数组…

竞赛保研 python+opencv+机器学习车牌识别

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于机器学习的车牌识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:4分工作量:4分创新点:3分 该项目较为新颖,适…

Amazon Q:对话智能赋能企业发展

授权说明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 亚马逊云科技开发者社区, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 。 在最近举办的亚马逊云科技大会上,引人瞩目的消息是A…

西米支付:微信支付发布了一则重大公告!从2024年1月8日开始执行。

最近,微信支付发布通告表示对服务商合作协议和规则进行了修订。这次修订进一步明确了收单外包服务机构的备案义务,并加强了对违约合作伙伴的处理措施。 修订后的协议将于2024年1月8日开始生效。 根据修订后的协议,服务商需在开始提供收单外包…

斑马zebra目标检测数据集VOC+YOLO格式2300张

斑马是由四百万年前的原马进化出来的,最早出现的斑马可能是细纹斑马。有关史前马科动物的化石现存于美国爱达荷州克文的克文化石床国家博物馆。斑马的史前马为“克文马”(美洲斑马或者克文斑马),学名为“Equussimplicidens”&…

Llinux面试题2

请描述一下 chmod 命令。 答:chmod 命令用于修改文件或目录的权限。它可以添加或删除对文件的读、写和执行权限。 在 Linux 中,如何修改文件的权限? 答:可以使用“chmod”命令来修改文件的权限。例如,通过以下命令将文…

​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案

随着“第四次工业革命”的爆炸式发展,众多企业都将自己的业务与迅速发展的应用开发和网站建设领域高度绑定。而对于众多有上云需求的企业和个人用户来说,选择一款自己的服务器配置就成为了一项至关重要的任务。而随着需求端的不断扩大,云服务…

第二步:私有镜像仓库Harbor的使用

前序: 🔗第一步:私有镜像仓库Harbor的安装部署 一、将容器打包为镜像,上传到Harbor 1、查看镜像 输入命令 docker images打印返回 REPOSITORY TAG IMAGE ID CREATED …

Nacos-NacosRule 负载均衡—设置集群使本地服务优先访问

userservice: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则 NacosRule 权重计算方法 目录 一、介绍 二、示例(案例截图) 三、总结 一、介绍 NacosRule是AlibabaNacos自己实现的一个负载均衡策略&…

《教育信息化论坛》期刊杂志论文发表投稿

《教育信息化论坛》由中原大地传媒股份有限公司主管,河南电子音像出版社、文心出版社主办,我刊立足于教育信息化、教育现代化科研,重点介绍国内外信息化、现代化教学手段、教学方式、教学传播研究的新成果和新观点,推广成功的国内…

【嵌入式开发 Linux 常用命令系列 14 -- source hello.sh 和 ./hello.sh 的区别】

文章目录 source hello.sh 和 ./hello.sh 的区别source hello.sh./hello.sh使用场景 source hello.sh 和 ./hello.sh 的区别 问题背景: 创建了目录~/.local/bin 并将其在.bashrc文件中添加到path 中,export PATH$PATH:/home/sam/.local/bin。 在 ~/.loc…

KVO(键值观察)

KVO(键值观察)是Objective-C 对观察者设计模式的一种实现。 举个栗子:指定一个被观察对象(A类),当被观察对象某个属性(A中的字符串name)发生更改时,对象(B类)会获得通知,并作出相应…

【Spring教程28】Spring框架实战:从零开始学习SpringMVC 之 请求与请求参数详解

目录 1 设置请求映射路径1.1 环境准备 1.2 问题分析1.3 设置映射路径 2 请求参数2.1 环境准备2.2 参数传递2.2.1 GET发送单个参数2.2.2 GET发送多个参数2.2.3 GET请求中文乱码2.2.4 POST发送参数2.2.5 POST请求中文乱码 欢迎大家回到《Java教程之Spring30天快速入门》&#xff…

记录 | docker报错:Key permissions are too open: Set correct permissions

docker 报错: Key permissions are too open: Set correct permissions 具体的: WARNING: UNPROTECTED PRIVATE KEY FILE! Permissions 0777 for /app/.ssh/id_rsa are too open. It is required that your private key files are NOT accessibl…

ls高级用法

1 使用通配符列出文件夹的内容 ls ~/videos/*.wmv 刚才你已经学会了如何在包含多个文件的目录中查找文件,但是还有一种更快的方法。如果你知道正在找的Tiger Woods的视频文件是Windows Media格式的,那么这个文件名一定是以.wmv为后缀的,这时…

认识缓存,一文读懂Cookie,Session缓存机制。

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

一、CM4树莓派系统烧录

操作系统(Raspberry Pi OS)应用程序 Raspberry Pi OS系统(树莓派推荐系统):较小的内存占用、较高的易用性以及对浮点单元的支持 浮点单元:浮点运算单元(FPU)是处理器中专门进行浮点…