“手撕”MySQL的索引

news2024/11/17 7:28:12

目录

二、索引的作用

三、索引的缺点 

四、如何使用索引

查看索引:

创建索引: 

 ​编辑

删除索引:

五、索引的底层原理

那什么是B树,什么是B+树呢? 

B+树的好处:

 总结:


一、什么是索引

索引(index),在其他语言中,我们管索引叫下标,但是在MySQL中有点不一样,我们可以理解为目录!这些索引保存着我们的数据地址。

就像我们新华字典一样,如果我们想找一个字,我们可以通过拼音目录,部首目录等等,非常的快!

二、索引的作用

 就是来加快查询速度,为什么需要加快查询的速度呢?

答:比如我们在select中where一个条件,我们有大量的数据需要查询,如果一条一条遍历着去查询,那么时间复杂度将是O(N)。

O(N)看起来不大,但是它和我们数据结构中的O(N)不大一样,为什么呢?

因为在数据结构中是利用内存来遍历的,但是MySQL却是利用硬盘来读的而硬盘的速度非常慢,甚至比内存慢个几千倍。这就非常浪费时间,非常消耗咱们数据库的资源

 这时候我们就需要索引来帮忙了。例如我们select * from stduent where id=5:

无索引:我从最开始第一个开始遍历,一个一个遍历,不是的话就pass掉,不打印,直到我遇到了id=5,才打印出来。

有索引:我通过一种数据结构叫B+树,直接找到id=5,直接打印!

所以我们发现:索引可以大大减少我们的时间! 

三、索引的缺点 

好东西肯定是需要付出一些代价的,不可能十全十美~~

1)加索引需要耗费一些空间

但是对于后端开发来讲,这甚至不算什么,存储空间不够加硬盘就好啦~~若加硬盘话不够的话,还可以加机器~~

2) 加了索引,可能会影响”增删改“的效率

对于增删改可能会变快,也可能会变慢,也可能不变~~

比如 delete * from student where id=5;来说,确实会变快,因为少了很多遍历,

但是同时,”增删改“是需要同步更新维护索引的,需要调整。

在业务中,查询的频率比“增删改”高很多,所以这不算什么问题~~

但,上述两个问题不算什么问题,总的来说:利大于弊。

四、如何使用索引

值得注意的是:

创建主键约束(primary key)、唯一约束(unique)、外键约束(foreign key)时,会自动创建 对应列的索引。

假设我有student这个表:student(id,sn,name,qq_mail,classes_id)

查看索引:

show index from 表名;

创建索引: 

create index 索引名 on 表名(字段名);

 

创造索引其实是一个危险的操作!

对于数据量比较小(几万,几十万)创造索引,没什么危险的,

但是对于数据量特别大的(上千万等)创建索引,会触发大量的硬盘OI,就可能会卡死。

删除索引:

只能删除咱自己创造的索引,不能删除系统自动生成的索引。 

drop index 索引名 on 表名;

 

五、索引的底层原理

 索引用到的数据结构,其实是B+树(念做B加树)。它相当于B树,也可以叫做B-树(念做B树!不叫B减树)的plus版本。

B+树甚至可以说是为了数据库量身定做的数据结构,因为除了数据库甚至想不到B+树的其他用法~~

为什么不用其他数据结构呢,比如二叉搜索树,或者哈希表? 

1)二叉搜索树,最大的问题在于“二叉”当腰保存的元素多的时候,就会使整个树的高度变得比较高,它会有很多个节点,数据库是由硬盘读取的,每比较一次,都是很费时间的。

2)哈希表,最大的问题在于,只能进行“相等‘查询,无法进行>  <这样”范围查询“,也无法进行like这样的模糊查询。

那什么是B树,什么是B+树呢? 

B树:就是一个节点里面有多个数(二叉树一个节点只有一个数),假设一个节点有N个key值,它会划分出N+1个区间。这样就可以降低树的高度,从而减少节点的个数。这样就可以节省很多时间了。

问题:既然每个节点的数量多了,比较的次数不就多了吗,总次数还是不变,为什么会减少时间呢?

答:注意的是,这里是硬盘读取,硬盘一次读取一个节点(一个节点有多个数)!所以只要节点数量少,硬盘读取的次数就能减少,自然而然时间也会减少了。接下来的比较是在内存中比较的,也会比较快~~

B+树:B树的plus版本。 区别是:N叉搜索树,每个节点上包含N个key值,划分N个区间,上一个节点里面的  每一个数  都会  “下沉”  成为下一个节点的最后一个数。直到最后一层,他们会前后串起来,形成一个链表,就是一个数据全集,里面会存储数据库里面的数据,就像柳树的柳一样。

查询思路:

比如,上述的图是id的B+树,我要查id=3的数据,MySQL会查3在8和15的哪里,在8的左边,再查在2和5和8的哪里,在2和5的中间,到第3层,就查到id=3的数据了。最后一层就像柳树的柳枝一样,数据都挂在树枝上面。

 那重复出现的数据不会太占内存吗?

答:不会,简直是微乎其微。也就一个数字下沉了而已,假设我有1000w个数字下沉,一个数字int为4个字节,也就是4000w个。

记住:kb->thousand(千),mb->million(百万),gb->billion(十亿),也才40个million,40MB而已。

而且这只是个数字,并不像最后一层一样挂数据。但是好处却是非常大的。

B+树的好处:

1)N叉搜索树,高度比较低,节点少,此时硬盘IO次数就比较少

2)叶子节点是全集,并且用链表结构链接,非常便于范围查询

3)B+树,所有的查询都是要落到叶子节点上完成的,任何一次查询,经理的IO次数和比较次数都是差不多的,查询的开销稳定

4)叶子节点存储key值和数据,非叶子节点只存储key值,空间耗费小

 总结:

1)索引是啥,解决啥问题

索引相当于书的目录,能够提高查询的速度

2)索引付出了什么代价

a)需要更多的存储空间

b)肯会影响增删改的效率(不一定会影响)整体来说,索引的利大于弊

3)如何使用sql操作索引,是否有注意事项

a)show index from 表名;查看索引(主键,外键,unique会自动生成索引)

b)create index 索引名 on 表名(列名):给指定列创建索引

c)drop index 索引名 on 表名:删除索引

索引是针对列来常见的,后续查询的时候,查询条件使用的列和索引列匹配,才能索引生效,提高效率。针对一个比较大的表,创建/删除索引,是非常危险,可能会出发大量的硬盘IO,八机器搞挂了。

4)索引背后的数据结构->B+树特点和优势

特点:

a)N叉搜索树,每个节点上包含N个key值,划分N个区间

b)每个父节点中的元素,都会下沉到子节点中,作为该子节点中,作为该节点中最大值的角色来存在

c)叶子接待你这一层就构成了数据集合的全集

d)使用类似于链表职责与的结构,把叶子节点串起来

优势:

a)N叉搜索树,高度比较低,降低了硬盘IO次数

b)范围查询非常方便&高效

c)所有查询都洛到叶子节点上,开销非常稳定,容易预估成本

d)叶子节点存储key值和数据,非叶子节点只存储key值,空间耗费小(也可以加载在内存中进一步减少时间)

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

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

相关文章

OpenCV 图像预处理—图像金字塔

文章目录 相关概念高斯金字塔拉普拉斯金字塔应用 构建高斯金字塔为什么要对当前层进行模糊&#xff1f;1. 平滑处理2. 减少混叠&#xff08;Aliasing&#xff09;3. 多尺度表示4. 图像降采样 举个栗子创建高斯金字塔和拉普拉斯金字塔&#xff0c;并用拉普拉斯金字塔恢复图像 相…

《汇编语言 基于x86处理器》- 读书笔记 - 第3章-汇编语言基础

《汇编语言 基于x86处理器》- 读书笔记 - 第3章-汇编语言基础 3.1 基本语言元素3.1.1 第一个汇编语言程序常见汇编语言调用规范 3.1.2 整数常量&#xff08;基数、字面量&#xff09;3.1.3 整型常量表达式3.1.4 实数常量十进制实数十六进制实数&#xff08;编码实数&#xff09…

使用git命令行的方式,将本地项目上传到远程仓库

在国内的开发环境中&#xff0c;git的使用是必不可少的。Git 是一款分布式版本控制系统&#xff0c;用于有效管理和追踪文件的变更历史及协作开发。本片文章就来介绍一下怎样使用git命令行的方式&#xff0c;将本地项目上传到远程仓库&#xff0c;虽然现在的IDE中基本都配置了g…

Ubuntu安装terminator教程

Terminator 是一个高级的终端仿真器,专为 Linux 和 Unix 系统设计。它的主要特点是提供了丰富的多窗口和多标签功能,使用户能够在一个窗口中管理多个终端会话。这对于系统管理员、开发人员以及需要同时运行多个命令行任务的用户来说,极为方便。 一、安装 1、更新包 sudo a…

使用Selenium爬虫批量下载AlphaFold数据库中的PDB文件

注意&#xff1a;本方法使用了python&#xff0c;下载速度一般&#xff0c;如果需要更快的大批量下载可以考虑使用其他方法&#xff0c;例如FTP Alphafold数据库其实提供了许多物种的蛋白质组&#xff1a; AlphaFold Protein Structure Database 但是如果你搜索的物种不在这个…

算法面试leadcode【经典150道】

88 合并两个有序数组 方法一 使用arraycopy排序 * 思路一&#xff1a;将nums2合并到nums1的尾部&#xff0c;再直接进行排序。* 使用arraycopy(int[]nums1,int m,int[] nums2,int n)* 方法来进行排序&#xff0c;* 从原数组的哪个位置&#xff0c;移动到原数组的哪个位置&#…

xxl-job适配达梦数据库并制作镜像、源码部署xxl-job

背景&#xff1a;因项目需要信创&#xff0c;需将原本的mysql数据库&#xff0c;改成达梦数据库 一、部署达梦数据库 1.1 部署达梦数据库服务 可参考&#xff1a;Docker安装达梦数据库_达梦数据库docker镜像-CSDN博客 PS&#xff1a;部署达梦数据库时&#xff0c;需加上大小…

Java | Leetcode Java题解之第300题最长递增子序列

题目&#xff1a; 题解&#xff1a; class Solution {public int lengthOfLIS(int[] nums) {int len 1, n nums.length;if (n 0) {return 0;}int[] d new int[n 1];d[len] nums[0];for (int i 1; i < n; i) {if (nums[i] > d[len]) {d[len] nums[i];} else {int…

19. Revit API: Parameter(参数)

一、前言 我们在前面或多或少提到也用到参数了&#xff0c;这篇便细讲一下。 首先&#xff0c;我们知道好多信息都藏在参数里&#xff0c;或者说可以从参数中获取。我们还能够通过调整参数的值&#xff0c;改变模型的形态&#xff0c;即族的参变。 其次&#xff0c;有时族上…

【CAN通讯系列4】CAN通讯如何传递信号?

在【CAN通讯系列3】如何学习CAN通讯&#xff1f;中举了一个例子&#xff1a;新能源汽车要实现驱动功能&#xff0c;先需要整车控制器VCU计算目标转速或扭矩请求等信号&#xff0c;再通过CAN通讯传递给电机控制器MCU&#xff0c;就这个例子继续探讨CAN通讯的基础问题。 1 CAN数据…

入门 PyQt6 看过来(案例)08~ 页面布局

主题&#xff1a;学习页面布局控件以及布局容器的使用&#xff08;理论知识&#xff09; 1 布局控件 PyQt6的布局方式包括绝对布局、水平布局、垂直布局、网格布局和表单布局。 绝对布局&#xff1a;直接设置控件对象在参考坐标中的位置水平布局&#xff1a;对加入的控件对象从…

引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。

vue3 报错&#xff1a; 引用的项目“xxxx/tsconfig.node.json”可能不会禁用发出。 解决&#xff1a; 进入对应的 json 文件&#xff1a; 修改&#xff1a; "noEmit": false 当 noEmit 设置为 false 时&#xff0c;TypeScript 编译器将根据项目配置生成相应的输出文…

【数据结构初阶】单链表经典算法题十道(详解+图例)—得道飞升(终篇)

hi &#xff01; 目录 9、 环形链表 || 10、随机链表的复制 终章 9、 环形链表 || 【图解】 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode *detectCy…

Live800:客户服务中的情感智能,建立深厚客户关系的秘诀

在当今竞争激烈的市场环境中&#xff0c;客户服务已成为企业脱颖而出的关键因素之一。而情感智能&#xff0c;作为客户服务中的重要组成部分&#xff0c;更是建立深厚客户关系、提升客户满意度的秘诀所在。优秀的客户服务不仅关乎问题的解决&#xff0c;更在于情感的交流与共鸣…

物联网云盒多路开关量模拟量转无线MQTT钡铼技术S275

物联网云盒多路开关量模拟量转无线MQTT技术在现代工业自动化和远程监测中扮演着关键角色。钡铼第四代RTU S275作为一款先进的物联网数据监测采集控制短信报警终端&#xff0c;集成了多种先进技术和功能&#xff0c;旨在提升远程数据采集与控制的效率和可靠性。 钡铼第四代RTU …

在Ubuntu 12.10上安装和使用tmux的方法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 关于 tmux tmux 是一个终端复用工具。它允许您使用多个虚拟终端访问 tmux 终端。 tmux 利用了客户端-服务器模型&#xff0c;这使您可…

unity3d:TabView,UGUI多标签页组件,TreeView树状展开菜单

概述 1.最外层DataForm为空壳编辑数据用。可以有多个DataForm&#xff0c;例如福利DataForm&#xff0c;抽奖DataForm 2.Menu层为左边栏层&#xff0c;每个DataForm可以使用不同样式的MenuForm预制体 3.DataForm中使用ReorderList&#xff0c;可排列配置 4.有定位功能&#xf…

网址导航系统PHP源码分享

1、采用光年全新v5模板开发后台 2、后台内置8款主题色&#xff0c;分别是简约白、炫光绿、渐变紫、活力橙、少女粉、少女紫、科幻蓝、护眼黑 3、可管理无数引导页主题并且主题内可以进行不同的自定义设置&#xff0c;目前内置16套主题 持续增加中… 4、可单独开发各种插件&a…

【OSCP系列】OSCP靶机-LemonSqueezy(原创)

【OSCP系列】OSCP靶机-LemonSqueezy 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 1、快速扫描 2、全端口扫描 只有一个80端口 3、版本系统探测 80端口http的apache服务&#xff0…

2年社招冲击字节,一天三面斩获offer

在工作满两年的时间选择了求变&#xff0c;带着运气和实力以社招身份重新看今天的互联网环境&#xff0c;从结果看还是复合预期的。 整个面试的流程还挺快的。周中让招聘专员给投递了简历。问什么时候面试&#xff0c;申请了一个周日&#xff0c;直接安排三面。下周周中就开启…