计算机基础--MySQL--索引

news2024/9/22 22:35:40

参考文献

  1. [MySQL索引连环18问!] https://zhuanlan.zhihu.com/p/364041898
  2. [深入理解MySQL索引] https://www.infoq.cn/article/ojkwyykjoyc2ygb0sj2c
  3. [聚集索引和非聚集索引的区别] https://juejin.cn/post/7001094401858469918
  4. [索引分类] https://blog.csdn.net/dd2016124/article/details/125134967

在这里插入图片描述

1. 索引疑惑

1.1 索引是什么?

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。

索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。而且索引是一个文件,它是要占据物理空间的。

一句话总结:索引是帮助数据库高效获取数据的数据结构

1.2 索引的分类

  • 从存储结构上来划分,索引主要有:Btree 索引(B+tree,B-tree)、哈希索引、全文索引等
  • 从功能逻辑上说,索引主要有4类,分别是普通索引、唯一索引、主键索引、全文索引。
  • 按照物理实现方式,索引可以分为2种:聚集索引和非聚集索引。
  • 按照作用字段个数进行划分,分成单列索引和联合索引。

1.2.1 普通索引

在创建普通索引时,不附加任何限制条件,只是用于提高查询效率。这类索引可以创建在任何数据类型中,其值是否唯一和非空,要由字段本身的完整性约束条件决定。建立索引以后,可以通过索引进行查询。例如,在表 student 的字段 name 上建立一个普通索引,查询记录时就可以根据该索引进行查询。

1.2.2 唯一索引

使用 UNIQUE 参数可以设置索引为唯一性索引,在创建唯一性索引时,限制该索引的值必须是唯一的,但允许有空值(该空值也可以有多个)。在一张数据表里可以有多个唯一索引。
例如,在表 student 的字段 email 中创建唯一性索引,那么字段 email 的值就必须是唯一的。通过唯一性索引,可以更快速地确定某条记录。

1.2.3 主键索引

主键索引其实并不是一种索引类型,而是根据主键,在主键上建立聚集索引,主键是具有唯一性且不能为空。一张表里最多只有一个主键索引。这是由于其底层数据的物理存储方式决定的,数据存储在文件中只能按照一种顺序进行存储。

1.2.4 聚集索引和非聚集索引

1.2.4.1 聚集索引

聚集索引就是基于主键来构建的索引结构。聚集索引就是按照每张表的主键来构建一颗B+树,该B+树叶子节点里面存储了这个表的每一行数据记录。

1.2.4.2 非聚集索引

除聚集索引外都称为非聚集索引,非聚集索引底层构建的B+树叶子节点里面存储了这个表的每一行数据的地址。如果要真正得获取行数据,还需要访问主键索引来进行数据的检索。

1.2.4.3 聚集和非聚集索引的区别

  • 简单来说,聚集索引就是基于主键创建的索引,除了主键索引以外的其他索引,称为非聚集索引,也叫做二级索引。
  • 由于在InnoDB引擎里面,一张表的数据对应的物理文件本身就是按照B+树来组织的一种索引结构,而聚集索引就是按照每张表的主键来构建一颗B+树,然后叶子节点里面存储了这个表的每一行数据记录。
  • 所以基于InnoDB这样的特性,聚集索引并不仅仅是一种索引类型,还代表着一种数据的存储方式。
  • 同时也意味着每个表里面必须要有一个主键,如果没有主键,InnoDB会默认选择或者添加一个隐藏列作为主键索引来存储这个表的数据行。一般情况是建议使用自增id作为主键,这样的话id本身具有连续性使得对应的数据也会按照顺序存储在磁盘上,写入性能和检索性能都很高。否则,如果使用uuid这种随机id,那么在频繁插入数据的时候,就会导致随机磁盘IO,从而导致性能较低。
  • 需要注意的是,InnoDB里面只能存在一个聚集索引,原因很简单,如果存在多个聚集索引,那么意味着这个表里面的数据存在多个副本,造成磁盘空间的浪费,以及数据维护的困难。
  • 由于在InnoDB里面,主键索引表示的是一种数据存储结构,所以如果是基于非聚集索引来查询一条完整的记录,最终还是需要访问主键索引来检索。

1.3 索引有哪些优缺点?

(1) 索引的优点如下:

  • 通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
  • 可以给所有的 MySQL 列类型设置索引。
  • 可以大大加快数据的查询速度,这是使用索引最主要的原因。
  • 在实现数据的参考完整性方面可以加速表与表之间的连接。
  • 在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间

(2) 增加索引也有许多不利的方面,主要如下:

  • 创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
  • 索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。
  • 当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。

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

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

相关文章

【消费战略】解读100个食品品牌丨王小卤 4年10亿爆品破局

爆品破局 王小卤的聚焦发展! 王小卤创建于 2016 年,与饮料行业的独角兽元气森林同年。 相较于元气森林的快速增长,王小卤历经 三年坎坷之路,直至 2019 年才踏上高增长的赛道,实现四年十亿的增长。 “所有的消费品都值得重新 做…

RHCSA练习作业(二)

目录 题目一 题目二 题目三 第四题 第五题 题目一 文件查看:查看/opt/passwd文件的第六行(使用head和tail指令) 代码如下: head -6 /opt/passwd | tail -1 题目二 在/etc及其子目录中,查找host开头的文件&#x…

纯净Python环境的安装以及配置PyCharm编辑器

前言 优质的教程可以让我们少走很多弯路,这一点毋庸置疑。去年二月我接触了Python,并找到了一份优质的配置教程,让我能够快速上手Python的学习。现在,一年多过去了,我已经有了很大的进步和变化,这也让我更…

ARM kernel 内核的移植 - 从三星官方内核开始移植

一、内核移植初体验 1、三星官方移植版内核获取 (1) 从网盘下载源码包。 (2) 这个文件最初是来自于三星的 SMDKV210 开发板附带的光盘资料。 2、构建移植环境 (1) Windows下建立工程。 (2) ubuntu下解压。 3、配置编译下载尝试 (1) 检查 Makefile 中 ARCH 和 CROSS_COMPI…

手把手教你Python爬虫

前言 python爬虫技术在java开发工作中属于工具性的技术属性,所以我这里就只从爬取一个网站的数据为例作为教学内容,具体的基础学习与其它的扩展知识内容,我会以链接的形式给出,若有兴趣可自行点击学习。 python基础知识教学 Pyth…

怎么压缩图片的体积大小,4款软件分享

怎么压缩图片的体积大小?因为在日常生活和工作中,我们常常会遇到需要压缩图片大小的情况。图片的大小是由像素点数量和每个像素的颜色深度共同决定的,一般来说,像素点数量越多,每个像素的颜色深度越高,图片…

四百元以内哪种耳机音质好?2023便宜音质好的蓝牙耳机推荐

现如今,蓝牙耳机的发展速度越来越快,不少人对于其音质方面的要求也越来越高。最近看到很多人问,有没有便宜音质又好的蓝牙耳机?针对这个问题,我来给大家推荐几款便宜音质好的蓝牙耳机,一起来看看吧。 一、…

怎么远程控制电脑

为什么要从另一台电脑远程控制电脑? 如今,Splashtop已广泛应用于各个领域。 在很多情况下,您需要从另一台远程电脑控制一台电脑。 这里演示了两个例子: 1:当您不在同一楼层时,您的同事需要您的帮助来解决…

阿里云张献涛:云原生计算基础设施助力汽车行业数字化升级

2023 年阿里云峰会北京站《云上智能汽车》论坛,阿里云智能基础产品部副总裁、阿里云智能弹性计算 & 无影产品线总经理张献涛,发表了《云原生计算基础设施助力汽车行业数字化升级》的主题演讲。 当前,汽车行业的数字化浪潮已经渗透到汽车设…

System V 共享内存

System V 共享内存 共享内存是什么如何使用共享内存ftokshmgetshmatshmdtshmctl 共享内存的原理共享内存实现两个进程间通信共享内存的特点共享内存与管道配合使用两个进程间通信多个进程间通信 共享内存是什么 🚀共享内存是最快的IPC形式。一旦这样的内存映射到共…

【产品应用】一体化步进伺服电机在高速异形插件机的应用

随着科技的不断发展,自动化生产设备在各个行业中得到了广泛的应用。高速异形插件机作为自动化生产设备中的一种,其核心部件之一就是一体化步进伺服电机。本文将详细介绍一体化步进伺服电机在高速异形插件机中的应用。 01.设备简介 高速异形插件机是一种…

我们为什么要写作?

为什么要写书是一个很难回答的问题,因为从不同的角度,会有不同的答案。 最近ChatGPT很火!诸事不决,先问问ChatGPT,看看它是怎么回答的。 ChatGPT给出的答案还是比较全,虽然没有“一本正经的胡说八道”&…

PCB高频电路设计中的差分信号设计

目录 1、差分信号的定义 2、如何布置差分线路? 3、微带线和带状线的概念 4、布线中常用的匹配方法 1、差分信号的定义 什么是差分布线:差分布线主要是区别传统的信号线对应一根地线的信号传输方式,差分信号传输主要是两条线上都有信号传…

基本数据类型和引用数据类型的存储区别?

目录 1、存储位置的区别 2、变量赋值时的区别 ① 基本数据类型 ② 引用数据类型 3、小结 ① 声明变量时不同的内存地址分配 ② 不同的类型数据导致赋值变量时的不同 1、存储位置的区别 基本数据类型和引用数据类型存储在内存中的位置不同: ① 基本数据类型存…

20230420 | 977. 有序数组的平方、 209. 长度最小的子数组、59. 螺旋矩阵 II

1、977. 有序数组的平方 方法1&#xff1a;使用暴力法&#xff0c;一遍for&#xff0c;一次排序。这个时间复杂度是 O(n nlogn)&#xff0c; 可以说是O(nlogn)的时间复杂度。 class Solution {public int[] sortedSquares(int[] nums) {//先计算出平方for(int i0;i<nums.le…

Vulnhub项目:JANGOW 1.0.1

靶机地址&#xff1a;Jangow: 1.0.1 ~ VulnHub 渗透过程&#xff1a; kali ip&#xff1a;192.168.56.104&#xff0c;使用arp-scan -l查看到靶机ip192.168.56.118 对靶机进行端口探测&#xff0c;发现了21、80端口 访问80端口&#xff0c;发现site目录 点击进去后&#xff0…

HIVE SQL 进行 Join 和 group by的具体原理及分区方式

HIVE SQL 实现Join和group by 具体原理 1、JOIN 在map的输出value中为不同表的数据打上tag标记&#xff0c;在reduce阶段根据tag判断数据来源。MapReduce的过程如下&#xff1a; 2、 GROUP BY HIVE SQL 实现Join和group by 的分区原理 1、JOIN 在join操作中&#xff0c;两个…

【Java】哔哩哔哩编程题练习

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 每日随心练&#xff0c;望各位大佬喜欢&#xff0c;做法有很多种&#xff0c;以下是我个人的想法 目录 一、复数乘法 二、一年中的第几天 三、k个一组翻转链表 一、复数乘法 输入两个表示复…

电路中电容的作用

总体目录 电源设计中常见电容常见电容作用降压滤波高通滤波平滑输出电压 延时耦合去耦/退耦旁路 不常用电容作用调谐电容衬垫电容补偿电容中和电容稳频电容定时电容加速电容启动电容运转电容 电源设计中常见电容 安规电容 常见电容作用 https://www.bilibili.com/video/BV…

【K8S系列】深入解析控制器

目录 序言 1 基础介绍 1.1 前情提要 1.2 Kube-controller-manager介绍 1.3 控制器类型 2 使用介绍 2.1 控制循环 2.2 Deployment控制器 实际状态&#xff1a; 期望状态&#xff1a; PodTemplate&#xff1a; 3 总结 4 投票 序言 在你想要放弃的时候&#xff0c;想…