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

MySQL常见八股:索引

MySQL索引的最左前缀匹配原则是什么一句话概括当MySQL在使用联合索引时查询条件必须从索引的最左列开始匹配。这是因为联合索引在B树中的排列方式是从左到右的顺序。比如联合索引(first_namelast_nameage会先按 first_name 排序first_name 相同再按last_name 排序last_name 相同再按 age 排序。MySQL 查找时会优先用first_name作为匹配依据然后依次用last_name和 age。跳过最左侧字段后面的列在B树中是无序的压根没法利用索引快速定位。特例范围查询当范围查询是,这种会停止匹配wherea1andb2andc3;只有a能用上联合索引因为a经过查询筛选后不同a值之间的b和c是无序的。无法走索引。相反当遇到,,前缀 like xx%时不会停止匹配。因为他们之中包含等值判断脏读/不可重复读/幻读分别代表什么意思这三个都是并发事务带来的数据一致性问题严重程度递减脏读指数据库中一个事务查询了一个还没提交的数据万一那个数据回滚了读到的数据不存在不可重复读指一个事务查询两次同一行数据两次获得的数据不一样。因为中间有别是事务修改并提交了这行数据。强调数据的内容改变幻读指一个事务执行两次同样的范围查询返回的数据行数不一样。因为中间有别是事务执行了插入或删除操作。强调数据的行数变化。不同隔离级别下会出现的问题安全程度读未提交读已提交可重复读串行化性能依次递减InnoDB存储引擎默认的就是可重复读。如何解决的脏读MVCC天然解决读的是快照看不到未提交的数据不可重复读在可重复读隔离级别下ReadView在事务一开始就固定了后续复查读取的是同一个ReadView。幻读快照读走MVCC看不到新插入行当前读用间隙锁所著范围别的事务插不进来。当快照读和当前都混用时还会出现幻读。MySQL的存储引擎有哪些他们之间有什么区别MySQL的存储引擎是可插拔的不同引擎辅助数据的存储与读取。实际场景中95%都是使用的InnoDB面试主要讲InnoDB与MyISAM进行区分就行了MySQL8.4版本一共提供了10个引擎常见的有这几个1InnoDBMySQL5.5 之后的默认引擎支持事务、行级锁、外键MVCC也有适合高并发的OLTP场景。数据按聚簇索引组织主键查询贼快。2MyISAM老版本的默认引擎不支持事务只有表级锁但读性能不错。适合那种写少读多、对一致性要求不高的场景比如早年的一些报表系统。3MEMORY数据全放内存里速度快但MySQL重启数据就没了。一般拿来做时表或者会话级缓存。4Archive专门存归档数据的只支持INSERT 和 SELECT不支持索引I但压缩率高。日志归档、历史订单这种场景用得上。5NDBMySQLCluster用的引擎支持分布式和高可用数据自动分片适合电信级别的大规模集群。MySQL的覆盖索引覆盖索引指的是查询内容包含在了二级索引内部查询时直接从索引里拿数据无需再次执行回表操作。本质是索引中有的数据直接拿减少回表操作。优点减少I/O操作查询直接从索引中拿数据避免访问主键索引的数据页。查询更快索引页小结构紧凑缓存命中率更高减少内存占用Buffer Poll只需加载索引页不用加载更大的数据页设计覆盖索引的哲学主要分四点来设计高频查询优先分析业务哪些查询频率高针对这些设计覆盖索引权衡读写比列覆盖索引不是越多越好。索引列越多索引越大写入维护成本高。利用联合索引把where条件的列与select的列创建为一个联合索引。例如select a,b from t where c1,可以键c,a,b索引覆盖索引和索引下推的区别覆盖索引是完全不回表索引里有查询需要的所有数据。索引下推是减少回表次数把过滤条件下推到引擎层提前过滤但最终还是要回表拿完整数据。两种解决的问题不一样索引类型有哪些MySQL索引可以从三个维度来分类数据结构存储方式索引性质。我们先从数据结构来切入重点讲解B树然后展开讲解聚簇索引和非聚簇索引的区别。数据结构B树索引叶子节点存储数据叶子节点通过链表串起来保证了快速定位单条记录和高效做出范围扫描。哈希索引通过哈希函数直接算出数据位置等值查询O1不支持范围查询和排序。全文索引空间索引存储方式聚簇索引又叫主键索引叶子节点世界存放完整的行数据数据按主键顺序物理存储一张表只能由一个主键索引非聚簇索引也叫二级索引叶子节点只存储索引字段值和主键值。查完二级索引还得拿着主键取主键索引获取具体数据。索引性质1主键索引唯一且非空每张表只能有一个。InnoDB里主键索引就是聚簇索引。2唯一索引保证列值不重复但允许有NULL可以有多个NULL。3普通索引没有唯一约束纯粹为了加速查询。4联合索引多列组合成一个索引遵循最左前缀原则列顺序很重要。5全文索引文本搜索用。6空间索引GIS数据用。衍生B树厉害在哪数据库查询由两大类构成等职查询和范围查询。哈希索引等值查询速度快但是无法进行范围查询。B树两个都行并且叶子节点用双向链表连接范围扫描的时候顺着链表走不用回溯。另外,B树特点是树矮一个三层的B树就能存储2000万左右的数据。查询一条数据最多3次I/O。索引下推索引下推是MySQL 5.6之后引入的技术。核心思路是把部分查询条件从Service层下推到存储引擎层在引擎层就把不符合查询条件的数据过滤不用在将这些数据进行回表操作。作用是减少回表操作提升查询效率。没有索引下推的流程是引擎层用索引定位数据返回主键给Service层Service层回表拿到完整数据再用剩余条件过滤。有了索引下推引擎层能直接用索引里的列来过滤不符合条件的不会回表减少了I/O如何判断索引是否生效在SQL语句的前面加上EXPLAIN如果显示Usingindexcondition说明用上了索引下推。EXPLAINSELECT*FROMpeopleWHEREzipcode95054ANDlastnameLIKE%etrunia%;Extra 显示Usingindex condition就表示 lastname 条件被下推到引擎层了。关于联合索引覆盖索引索引下推的区分联合索引是基础有了联合索引才有覆盖索引和索引下推。索引下推和覆盖索引是技术。这两个优化都能减少I/O但原理不同特性索引下推覆盖索引解决的问题减少回表次数完全避免回表是否回表需要回表但次数少不需要回表EXPLAIN 标识Using index conditionUsing index适用场景select * 且有额外过滤条件select 的列都在索引里两者可以同时存在吗不能。如果走了覆盖索引压根不回表索引下推就没有用武之地了。InnoDB存储引擎中聚簇索引和非聚簇索引有什么区别在 InnoDB 引擎中聚簇索引的叶子节点直接存储完整的数据行一张表只能有一个聚簇索引I默认就是主键索引。非聚簇索引的叶子节点只存储索引列的值和主键要拿到完整数据得先查主键再回表一张表可以有多个非聚簇索引。核心区别就是叶子节点存的东西不一样聚簇索引存完整数据非聚簇索引存主键值。这导致聚簇索引查询能一步到位拿到数据非聚簇索引可能要多一次回表操作。MySQL中使用索引一定有效吗如何排查索引效果索引不一定生效。建了索引不低啊表查询会用用来索引不代表查询就快。MySQL最终是否走索引靠的是优化器的成本计算。优化器会评估走索引和全表扫描各自的I/O成本和cpu成本。优势全表扫描确实成本低比如表就几百行数据走索引不如直接扫有时统计信息不准导致优化器算错账。用EXPLAIN命令来排查索引。在SQL语句前面加上EXPLAIN就能看到MySQL选择的执行计划重点看type访问类型all是全表扫描range是范围扫描ref是等值匹配index是全索引扫描。key实际用的索引名称NULL就是没用上索引rows预估扫描行数这个数字越大说明查询代价越高。索引失效常见场景基本原因分为两类1.查询条件导致索引树的快速查找能力用不上 2.优化器觉得不划算1联合索引不符合最左前缀假设有个联合索引idx_name_age_id查询写成WHERE age 10 AND id 1跳过了 name字段最左缀匹配失败索引树的有序性利用不上退化成全索引扫描甚至全表扫描。2索引列上做了运算WHEREid38这种写法MySQL得把每行的id 拿出来算一遍没法直接在索引|树上定位只能全录扫描。3索引列上用了函数WHERELOWER(name‘cong’对索引列套了函数索引树里存的是原始值函数处理后的值根本不在树里还是得全表扫。MySQL8.0 可以建函数索引来解决这个问题。4LIKE左侧带通配符WHEREnameLIKE%cong%这种写法索引是按字符顺序排的左边不确定就没法定位起始位置只能全扫。LIKE’cong%是可以走索引的。5OR连接了非索引字段WHEREnamecong’ORage 18如果age没索引lMySQL没法通过索引l快速过滤 age 条件整个查询可能退化成全表扫描。6隐式类型转换name是Varchar 类型查询写成 WHERE name 1MySQL会做隐式转换相当于 WHERE CAST(nameAsignedint1索引列上套了函数索引失效。联表查询时两边字段编码不一致也有同样的问题。7优化器认为全表扫描更划算同一个索引查热点数据可能走全表查冷门数据走索引。比如订单表按商品ID 查热门商品占了80%的订单走索引反而要回表几十万次不如直接全表扫描。8ORDER BY没配合好ORDER BY 后面的字段不是主键也不是覆盖索引MySQL 可能选择全表扫描再排序而不是走索引。

相关文章:

MySQL常见八股:索引

MySQL索引的最左前缀匹配原则是什么? 一句话概括:当MySQL在使用联合索引时,查询条件必须从索引的最左列开始匹配。这是因为联合索引在B树中的排列方式是"从左到右"的顺序。比如联合索引(first_name,last_name&#xff0…...

如何告别焦虑等待:Elsevier Tracker让学术投稿进度一目了然

如何告别焦虑等待:Elsevier Tracker让学术投稿进度一目了然 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 还在每天刷新Elsevier投稿页面,焦虑地等待审稿状态更新吗?Elsevier Tr…...

2025届学术党必备的五大AI辅助论文神器实测分析

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当下,人工智能生成内容越来越普及,好多用户面临着内容会被AI检测工…...

2025届毕业生推荐的五大AI学术神器推荐榜单

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 对于那些想要降低文本AI检测率的用户来讲,专业的降AI率网站能给出高效的解决办法…...

干货|GitHub 仓库推送避坑指南(附踩坑实录)

对了,分享一个我最近常看的AI人工智能学习渠道,讲得挺有章法的,不端着也不故弄玄虚。不感兴趣划走就行,感兴趣的可以自己去验证一下。 →传送门 干货|GitHub 仓库推送避坑指南(附踩坑实录) 文…...

从MobileNet到U-Net:聊聊那些‘非标准’卷积(空洞、深度可分离)在实战中的选择与调参

从MobileNet到U-Net:非标准卷积的工程实践指南 在计算机视觉领域,卷积神经网络(CNN)早已成为基础架构。但当我们从理论研究转向实际部署时,标准卷积操作往往难以满足多样化的工程需求——移动端需要极致的计算效率,医学图像分割要…...

告别鬼影!用PyTorch复现动态场景HDR融合论文,手把手教你搞定多曝光图像对齐与融合

动态场景HDR融合实战:PyTorch实现多曝光图像对齐与去鬼影技术 在数字摄影领域,高动态范围(HDR)成像技术一直是突破相机硬件限制的重要手段。当面对阳光直射的窗户与昏暗室内共存的场景时,单张照片往往难以同时保留亮部和暗部细节。传统解决方…...

别再死记硬背公式了!用Python+NumPy手把手带你理解矩阵白化(附完整代码)

用Python实战理解矩阵白化:从数学恐惧到代码掌控 很多数据科学初学者在面对矩阵白化这类数学概念时,常常陷入公式推导的泥潭而难以自拔。我们不妨换个思路——用Python代码和可视化手段,让抽象的数学原理变得触手可及。本文将带你用NumPy一步…...

从阶乘逆元到组合数计算:一个公式打通LeetCode刷题效率瓶颈

从阶乘逆元到组合数计算:一个公式打通LeetCode刷题效率瓶颈 在算法竞赛和LeetCode刷题中,组合数计算是许多动态规划和数论问题的核心操作。想象一下这样的场景:你正在解决一个需要频繁计算C(n, m) mod p的问题,每次调用都要重新计…...

用Python和NumPy动手实现8种DST变换:从公式到可视化基图像

用Python和NumPy动手实现8种DST变换:从公式到可视化基图像 在信号处理领域,离散正弦变换(DST)是一组与离散余弦变换(DCT)齐名的重要工具。不同于DCT的对称延拓特性,DST通过反对称延拓方式处理信…...

为什么90%的团队虚拟线程改造失败?揭秘3大反模式:阻塞IO、同步锁滥用、监控盲区(附诊断脚本)

第一章:虚拟线程的本质与高并发架构适配性再认知虚拟线程并非操作系统内核线程的简单封装,而是 JVM 在用户态实现的轻量级执行单元,其核心价值在于将“线程生命周期管理”从 OS 转移至运行时,从而解耦调度成本与并发规模。每个虚拟…...

【2024最硬核AI数据层教程】:用EF Core 10原生向量API构建低延迟RAG系统,实测P99<87ms

第一章:EF Core 10向量搜索扩展的演进与核心价值EF Core 10正式将向量搜索能力纳入官方生态,标志着ORM框架首次原生支持语义检索场景。这一演进并非简单叠加功能,而是深度整合了数据库向量索引、相似度计算与LINQ查询管道,使开发者…...

如何快速解锁NVIDIA消费级GPU虚拟化功能:完整操作指南

如何快速解锁NVIDIA消费级GPU虚拟化功能:完整操作指南 【免费下载链接】vgpu_unlock Unlock vGPU functionality for consumer grade GPUs. 项目地址: https://gitcode.com/gh_mirrors/vg/vgpu_unlock 在虚拟化环境中使用NVIDIA GPU加速一直是专业领域的特权…...

3分钟解锁B站缓存视频:免费开源m4s转MP4完整解决方案指南

3分钟解锁B站缓存视频:免费开源m4s转MP4完整解决方案指南 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter 你是否曾经在B站缓存了珍贵…...

告别繁琐操作!在Windows上轻松安装APK文件的终极指南

告别繁琐操作!在Windows上轻松安装APK文件的终极指南 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾经遇到过这样的情况:在Windows电脑…...

用STM32和AD637搞定电路幅频特性测试:手把手教你复刻电赛D题核心模块

STM32与AD637构建的电路特性测试仪实战指南 在电子设计竞赛和实际工程中,快速准确地测量电路特性是每个硬件工程师的必备技能。本文将带你从零开始,用STM32微控制器和AD637真有效值检测芯片搭建一个功能完整的电路特性测试平台。不同于传统的赛题报告&am…...

Anaconda数据科学环境搭建:为千问3.5-9B模型服务准备Python生态

Anaconda数据科学环境搭建:为千问3.5-9B模型服务准备Python生态 1. 为什么需要Anaconda 在开始部署千问3.5-9B这类大模型之前,一个稳定、隔离的Python环境是必不可少的。Anaconda作为数据科学领域的瑞士军刀,能帮你轻松管理不同项目所需的P…...

从ProcessBuilder源码看Java进程创建:如何优雅地处理I/O流与子进程?

Java进程交互的深度实践:从ProcessBuilder源码到高效流处理 在分布式系统与自动化工具链开发中,Java进程管理能力直接影响着系统稳定性和资源利用率。当我们使用Runtime.getRuntime().exec()执行一个简单的ls命令时,背后究竟发生了多少层级的…...

Qwen3.5-2B模型处理网络协议分析:智能解析与异常流量识别

Qwen3.5-2B模型处理网络协议分析:智能解析与异常流量识别 1. 网络运维的痛点与AI解决方案 网络运维工程师每天都要面对海量的协议数据包和系统日志。传统分析方法需要人工逐条查看十六进制报文,或者编写复杂的过滤规则,效率低下且容易遗漏关…...

ComfyUI+Stable Audio Open:游戏开发者如何5分钟生成逼真环境音效(附实战案例)

ComfyUIStable Audio Open:游戏开发者如何5分钟生成逼真环境音效(附实战案例) 当你在深夜调试游戏场景时,突然发现缺少关键的环境音效——雨林中的虫鸣、古堡走廊的木质地板吱呀声、未来都市的悬浮车引擎嗡鸣。传统音效制作流程可…...

SAP ABAP开发避坑指南:BP业务伙伴的地址、银行、角色BAPI到底该怎么选?

SAP ABAP开发实战:BP业务伙伴BAPI选择策略与避坑技巧 每次打开SE37准备调用BP相关BAPI时,那些以BAPI_BUPA_开头的函数列表总让人眼花缭乱。上周刚踩过一个坑——用BAPI_BUPA_ADDRESS_CHANGE更新地址时,系统莫名其妙清空了邮政编码后三位。后来…...

别急着扔!华硕A555L老本升级实战:加内存、换系统,让它再战三年

华硕A555L老本重生指南:低成本升级方案与实战技巧 当手头的笔记本电脑开始力不从心,大多数人第一反应可能是"该换新机了"。但别急着把旧笔记本送进回收站——特别是像华硕A555L这样的机型,通过精准的硬件升级和系统优化&#xff0c…...

FrontPage练习题(3)

1、设置表单名称为“论坛个人信息设定表”。2、对照效果图fp:jp页面中尚有空缺的表单对象未完成插入。请插入空缺的表单对象,各对象的初始值见效果图。3、设置表单对象属性1:(1)设置表格第1行文本“论坛个人信息设定表…...

Arch Linux无线安装保姆级教程:从iwctl联网到KDE/GNOME桌面完整配置

Arch Linux无线安装全流程指南:从零配置到KDE/GNOME桌面环境部署 当你面对一台没有有线网络接口的机器,却想体验Arch Linux的纯净与自由时,传统的安装教程往往显得力不从心。这份指南将彻底解决无线环境下的安装难题,从最基础的iw…...

Git Cherry-Pick实战:精准移植代码变更的进阶指南

1. 为什么你需要掌握Git Cherry-Pick? 在多人协作的开发项目中,我们经常会遇到这样的场景:某个紧急修复需要从生产环境(release分支)同步到正在开发中的功能分支(feature分支),但又不…...

【仅剩72小时】Spring Boot 4.0 RC2插件仓库临时开放——抢先下载3个GA版前唯一可用的Agent-Ready调试插件(含源码签名证书)

第一章:Spring Boot 4.0 Agent-Ready 架构插件下载与安装 Spring Boot 4.0 引入了原生支持 Java Agent 的运行时增强能力,使 APM、分布式追踪、无侵入式指标采集等场景得以在不修改业务代码的前提下实现。Agent-Ready 架构要求应用启动时能自动识别并加载…...

保姆级教程:用Python-CAN库在树莓派上搭建汽车CAN总线数据监控器

树莓派Python-CAN实战:打造低成本汽车数据监控系统 在汽车电子和嵌入式开发领域,CAN总线作为车辆内部通信的神经系统,承载着发动机控制、车身电子、仪表盘等关键数据。传统CAN分析仪动辄上万元的价格让个人开发者和学生望而却步。而实际上&am…...

保姆级教程:在Android SystemUI源码中,用ADB广播动态控制导航栏三键(Home/Back/Recent)

深度定制Android导航栏:ADB广播动态控制三键显示的工程实践 在Android系统定制开发领域,SystemUI的修改往往是ROM开发者最常接触的核心模块之一。特别是导航栏这一用户交互的关键入口,其行为定制直接影响到设备的用户体验。传统修改方式需要反…...

深入Synopsys USB VIP内部:layering sequence如何玩转UVM callback与event机制

深入Synopsys USB VIP内部:layering sequence如何玩转UVM callback与event机制 在芯片验证领域,Synopsys VC USB VIP作为行业标杆工具,其核心价值不仅在于提供标准协议验证能力,更在于开放了丰富的扩展接口。本文将聚焦VIP中鲜为人…...

别再手动拖拽了!Matlab画图时用xlim函数精准控制X轴范围的3个实战技巧

别再手动拖拽了!Matlab画图时用xlim函数精准控制X轴范围的3个实战技巧 每次用Matlab画完图,你是不是也习惯性地用鼠标拖拽坐标轴来调整显示范围?这种操作不仅效率低下,还难以保证多张图表的一致性。今天我们就来彻底解决这个问题—…...