当前位置: 首页 > news >正文

【面试题】谈谈MySQL的索引

索引是啥

可以把Mysql的索引看做是一本书的目录,当你需要快速查找某个章节在哪的时候,就可以利用目录,快速的得到某个章节的具体的页码。Mysql的索引就是为了提高查询的速度,但是降低了增删改的操作效率,也提高了空间的开销。比如一本书很薄的时候,章节不多,对应的目录也就很少 ,可能才一两页,当书的章节很多时,对应的目录也就很多,需要更多的页码来存储目录,当数据库中表的数据很多时,对应的索引也就需要更多的空间来保存,因此说空间的开销会被增加。

  • 查看索引

    show index from 表名

    image-20240220145011069

key_name 是索引名,column_name是根据id这列创建了索引。当表里有primary key、unique和foreign key 时数据库会自动创建索引,每次进行操作表时,数据库会自动判断是否走索引,效率高不高。

  • 创建索引

create index 索引名 on 表名(列名)

image-20240220145321269image-20240220145508380

针对student里的name列创建一个名为inx_name的索引,当再次查看student里的索引时,可以发现多了一个名为inx_name的索引名。

  • 删除索引

drop index 索引名 on 表名

image-20240220145713271

索引的数据结构

MySQL创建索引的目的是为了加快查找速度,因此可以考虑查找速度较快的数据结构,比如哈希表,哈希表的查找时间复杂度是O(1),不过不能范围查询,但是MySQL经常查询时带有范围条件,因此哈希表是不适合做索引的数据结构。二叉搜索树适合范围查询,查询的速度也比较快,时间复杂度是O(N),但是二叉搜索树的高度决定了元素的比较次数,当树的高度较高时,比较次数也会增加,而比较操作又需要进行IO操作的,因此当比较次数增加时,IO操作的次数也增加了,IO操作是很费系统资源的,所以二叉搜索树也不适合索引的数据结构。针对二叉搜索树的高度问题,可以引入一个N叉搜索树,把高度降低。N叉搜索树的典型实现是B树,N叉搜索树每个节点有N个key,同时有多个分叉,因此这样就把高度降低了,不过比较次数并没有减少,一个节点上的元素可能涉及到多次比较,但是读写硬盘(IO)的次数减少了,因为每个节点都在硬盘上,读一次硬盘可以读到N个key,之前的二叉搜索树读一次硬盘只能获得一个key。但是B树还是不能做索引的数据结构。现在就针对比较次数进行优化,引入了一个B+树,B+树也是一个N叉搜索树,B+树每个节点上包含N个key,N个key可以划分N个区间,每个区间内的最后一个key是最大值,可以看下图发现叶子没有了80、90这种节点,父元素的key会以最大值的方式在子元素中重复出现,因此叶子节点就包含了整个数据的全集,最后再把叶子每个节点用类似于链表的方式连接起来。

image-20240220152405222

image-20240220152552599

B+树是很适合做MySQL的索引,它具有以下几个特点:

  1. 由于高度降低了,因此比较次数降低了,IO读写次数也减少了,叶子节点之间连接,更适合做范围查询,比如查询 3<id and id <10的元素,可以直接从叶子节点中取。

  2. 由于所有数据元素都落在了叶子节点,因此查询哪个元素,比较次数都是差不多的,查询操作相对均衡。而对于B树的查询可能有的快,有的慢,比如查询根节点的元素时就很快,查询叶子节点时就很慢。

  3. 由于所有的key都会在叶子节点体现,因此非叶子节点可以只存一个索引值,比如id,叶子结点存数据库里真实的数据(数据行),这样就导致非叶子节点占用的空间大大降低,有可能在读取硬盘时可以把非叶子节点的索引值全部读到内存中,更进一步的降低了IO次数。

    image-20240220155533507

对于带有主键列的索引是按照这种B+树组织的,而对于不带主键列的数据创建了索引,是按另一种B+树实现的。比如非叶子节点存学生姓名name,叶子节点存放主键id,当使用主键列查询数据时,只需要去主键列创建的索引查询一遍即可,当使用非主键列创建的索引,需要去非主键列索引里查询到对应的主键id,再使用这个id去主键列索引里查询对应的数据,需要两次查询,这种操作称为”回表“。

相关文章:

【面试题】谈谈MySQL的索引

索引是啥 可以把Mysql的索引看做是一本书的目录&#xff0c;当你需要快速查找某个章节在哪的时候&#xff0c;就可以利用目录&#xff0c;快速的得到某个章节的具体的页码。Mysql的索引就是为了提高查询的速度&#xff0c;但是降低了增删改的操作效率&#xff0c;也提高了空间…...

python工具方法 45 基于ffmpeg以面向对象多线程的方式实现实时推流

1、视频推流 参考基于ffmpeg模拟监控摄像头输出rtsp视频流并opencv播放 实现视频流的推流。 其基本操作就是,安装视频流推流服务器,ffmpeg,准备好要推流的视频。 命令如下所示:ffmpeg -re -stream_loop -1 -i 风景视频素材分享.flv -c copy -f rtsp rtsp://127.0.0.1:554/…...

HarmonyOS Stage模型基本概念讲解

本文 我们来说harmonyos中的一种应用模型 Stage模型 官方提供了两种模型 一种是早期的 FA模型 另一种就是就是 harmonyos 3.1才开始的新增的一种模型 Stage模型 目前来讲 Stage 会成为现在乃至将来 长期推进的一种模型 也就是 无论是 现在的harmonyos 4.0 乃至 之后要发布的 …...

python自动化接口测试

前几天&#xff0c;同组姐妹说想要对接口那些异常值进行测试&#xff0c;能否有自动化测试的方法。仔细想了一下&#xff0c;工具还挺多&#xff0c;大概分析了一下&#xff1a; 1、soapui:可以对接口参数进行异常值参数化&#xff0c;可以加断言&#xff0c;一般我们会加http…...

深度学习????????

深度学习是人工智能领域的一个重要分支&#xff0c;它利用神经网络模拟人类大脑的学习过程&#xff0c;通过大量数据训练模型&#xff0c;使其能够自动提取特征、识别模式、进行分类和预测等任务。近年来&#xff0c;深度学习在多个领域取得了显著的进展&#xff0c;尤其在自然…...

人工智能技术学习专栏文章汇总—帮助你入门深度学习

人工智能大潮已来&#xff0c;stay hungry, stay foolish! 人工智能技术学习类文章汇总&#xff0c;帮助你入门深度学习。 人工智能学习与实训笔记&#xff08;一&#xff09;&#xff1a;零基础理解神经网络-CSDN博客 人工智能学习与实训笔记&#xff08;二&#xff09;&am…...

线性代数:向量空间

目录 向量空间 Ax 0 的解空间S Ax b 的全体解向量所构成集合不是向量空间 基、维数、子空间 自然基与坐标 例1 例2 向量空间 Ax 0 的解空间S Ax b 的全体解向量所构成集合不是向量空间 基、维数、子空间 自然基与坐标 例1 例2...

Pormise---如何解决javascript中回调的信任问题?【详解】

如果阅读有疑问的话&#xff0c;欢迎评论或私信&#xff01;&#xff01; 本人会很热心的阐述自己的想法&#xff01;谢谢&#xff01;&#xff01;&#xff01; 文章目录 回调中的信任问题回调给我们带来的烦恼&#xff1f;调用过早调用过晚调用的次数太少或太多调用回调时未能…...

如何选择最适合的图纸加密软件?用户体验及性价比

安秉网盾图纸加密软件是一款功能强大的图纸加密工具&#xff0c;具有以下特点和优势&#xff1a; 全盘加密&#xff1a;安秉网盾采用先进的加密算法&#xff0c;能对文件、文件夹、磁盘等数据进行全面加密&#xff0c;确保数据在存储和传输过程中的安全性。 监控与审计&#…...

一分钟学会MobaXterm当Linux客户端使用

一、介绍 MobaXterm是一款功能强大的远程计算机管理工具&#xff0c;它集成了各种网络工具和远程连接协议&#xff0c;可以帮助用户在Windows系统上轻松管理远程计算机。MobaXterm支持SSH、Telnet、RDP、VNC等多种远程连接协议&#xff0c;同时还集成了X11服务器&#xff0c;可…...

2024-02-21 算法: 测试链表是否有环

点击 <C 语言编程核心突破> 快速C语言入门 算法: 测试链表是否有环 前言一、双指针 ( 快慢指针 )二、代码总结 前言 要解决问题: 一道简单的算法题, 测试链表是否含有环. 想到的思路: 哈希表, 将链表指针强制转换为整型, 利用求余法建立哈希函数. 太复杂, 内存效率不高…...

http协议工具:apache详解

目录 一、常见的http服务程序 1、 Apache HTTP Server 介绍 1.1 apache 概念 1.2 apache 功能 1.3 apache 特性 2、MPM&#xff08;multi-processing module&#xff09;工作模式 2.1 prefork 2.2 worker 2.3 event 二、Apache HTTP Server安装和相关文件 1、安装方…...

我的NPI项目之Android Camera (二) -- 核心部件之 Camera Sensor

说到Camera模组&#xff0c;我们比较关心的是用的什么样的sensor&#xff1f; sensor的分辨率多少&#xff0c;sensor的像素多大&#xff0c;sensor是哪家生产的等等一些问题。今天&#xff0c;我们就穿越时间&#xff0c;将sensor的历史扒一扒。 Wikipedia先看一下&#xff1…...

【四】3D Object Model之测量Features——get_object_model_3d_params()算子

&#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; Halcon算子太多&#xff0c;学习查找都没有系统的学习查找路径&#xff0c;本专栏主要分享Halcon各类算子含义及用法&#xff0c;有…...

C++学习Day09之系统标准异常

目录 一、程序及输出1.1 系统标准异常示例1.2 标准异常表格 二、分析与总结 一、程序及输出 1.1 系统标准异常示例 #include<iostream> using namespace std; #include <stdexcept> // std 标准 except 异常class Person { public:Person(int age){if (age <…...

企业计算机服务器中了crypt勒索病毒怎么办,crypt勒索病毒解密数据恢复

计算机服务器设备为企业的生产运营提供了极大便利&#xff0c;企业的重要核心数据大多都存储在计算机服务器中&#xff0c;保护企业计算机服务器免遭勒索病毒攻击&#xff0c;是一项艰巨的工作任务。但即便很多企业都做好的了安全运维工作&#xff0c;依旧免不了被勒索病毒攻击…...

npm详解:掌握package.json配置

package.json 文件中的 scripts 配置允许你定义一系列脚本命令&#xff0c;这些命令可以通过 npm run <script-name> 来执行。下面是一些常见的 scripts 配置&#xff0c;以及它们的详解和举例。 常见的 scripts 配置 start 这是最常用的脚本&#xff0c;通常用于启动应…...

Git基础操作

1、git 基础命令 //克隆远端仓库 git clone http://dddddd.git //初始化仓库 git init //查看状态 git status //添加所有文件到缓存区 git add . //查看版本日志 git reflog //将更新提交到本地仓库 git commit -m "日志摘要" //将当前版本回退到某个版本 git rese…...

怎么卸载Nvidia显卡驱动

在Ubuntu 22.04上卸载Nvidia显卡驱动并手动重新安装的步骤可以分为几个主要部分。请确保在执行这些步骤之前&#xff0c;你已经备份了重要的数据&#xff0c;以防出现任何问题。 卸载当前的Nvidia驱动 打开终端&#xff1a;你可以通过按CtrlAltT快捷键来打开终端。 查找安装的…...

JS进阶——解构赋值

数组解构 基本&#xff1a; let [a, b, c] [1, 2, 3]; // a 1 // b 2 // c 3 可嵌套 let [a, [[b], c]] [1, [[2], 3]]; // a 1 // b 2 // c 3 可忽略 let [a, , b] [1, 2, 3]; // a 1 // b 3 不完全解构 let [a 1, b] []; // a 1, b undefined 剩余运…...

别只会用!cat了:在Kaggle Notebook里动态编辑YOLOv5配置文件的完整攻略

突破Kaggle只读限制&#xff1a;YOLOv5配置文件动态编辑全指南 在Kaggle Notebook中进行计算机视觉项目开发时&#xff0c;许多开发者都遇到过这样的困境&#xff1a;当需要修改YOLOv5模型配置文件时&#xff0c;发现Kaggle的/kaggle/input目录是只读的。本文将介绍三种专业级解…...

TruckSim 仿真工作流实战:从参数修改到结果对比

1. TruckSim仿真工作流基础入门 第一次打开TruckSim时&#xff0c;很多新手会被复杂的界面吓到。其实只要掌握几个核心概念&#xff0c;就能快速上手这个强大的车辆动力学仿真工具。我刚开始使用时也走过不少弯路&#xff0c;现在把这些经验分享给大家。 TruckSim的工作流可以简…...

宏裕塑胶代理新日铁住金日本工程塑料全系列产品服务详解

宏裕塑胶代理新日铁住金系列产品专注于为制造业企业提供高性价比、稳定可靠的通用工程塑料原料&#xff0c;依托源头直采及技术赋能&#xff0c;为塑胶制品厂、汽车零部件厂等客户降低采购成本并保障全流程供应。宏裕塑胶代理新日铁住金核心功能与服务模块覆盖多个维度&#xf…...

告别‘有线无网’:手把手修复Ubuntu 20.04上RTL8168网卡的驱动‘掉链子’问题

深度排查Ubuntu 20.04下RTL8168网卡驱动的疑难杂症 当你满怀期待地在工作站上安装好Ubuntu 20.04&#xff0c;准备开始一天的高效开发时&#xff0c;却发现网络连接图标上那个刺眼的红色叉号——有线网络无法连接。这种"有线无网"的窘境&#xff0c;对于依赖网络工作…...

从防御者视角看Fastjson 1.2.24漏洞:如何用Docker+vulhub快速搭建靶场并验证修复方案

防御视角下的Fastjson 1.2.24漏洞实战&#xff1a;Docker靶场搭建与修复方案验证 在当今的软件开发中&#xff0c;JSON处理库的安全性问题日益凸显。作为Java生态中最流行的JSON库之一&#xff0c;Fastjson因其高性能而广受欢迎&#xff0c;但同时也因其历史漏洞频发而备受关注…...

hot100 11盛最多水的容器

题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容…...

别再搞混了!设备上那个RJ45口是Console调试口,不是网口(附电路设计详解)

别再搞混了&#xff01;设备上那个RJ45口是Console调试口&#xff0c;不是网口&#xff08;附电路设计详解&#xff09; 第一次接触企业级网络设备时&#xff0c;许多新手都会犯一个经典错误——把设备背面那个看似网口的RJ45接口当作普通网络接口使用。我曾亲眼见过一位实习生…...

Layerdivider:5步完成AI智能图像分层,免费生成专业PSD文件

Layerdivider&#xff1a;5步完成AI智能图像分层&#xff0c;免费生成专业PSD文件 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider Layerdivider是一款革命…...

【限时公开】DeepSeek官方未披露的GPU最小可行配置表:单卡L4跑7B模型的温度/功耗/吞吐临界点实测数据

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek GPU资源需求全景概览 DeepSeek系列大模型&#xff08;如DeepSeek-V2、DeepSeek-Coder、DeepSeek-MoE&#xff09;在训练与推理阶段对GPU硬件存在显著差异化的资源依赖。理解其底层计算特征、显存占用…...

仅剩最后47份!《Midjourney概念艺术创作密钥手册》(含23个受版权保护的材质编码+动态光照参数表)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;《Midjourney概念艺术创作密钥手册》核心价值与版权说明 核心价值定位 本手册聚焦于概念艺术创作中“意图—提示—反馈—迭代”的闭环实践&#xff0c;提炼出可复用的提示工程范式、风格锚定策略与跨模态语义…...