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

MySQL中InnoDB索引使用与底层原理

MySQL Server端的缓存(查询缓存)是MySQL Server层的特性,而InnoDB的缓存(缓冲池)是InnoDB存储引擎层的特性。两者是完全独立的。

下面我们来深入探讨这两者以及InnoDB索引的原理。


1. MySQL Server层的缓存 - 查询缓存 (Query Cache)

  • 归属MySQL Server特性。它是一个全局性的组件,理论上对所有存储引擎(如InnoDB, MyISAM)的查询都可能生效。

  • 工作原理

    1. 当执行一个SELECT语句时,MySQL会先计算这个语句的哈希值,然后去查询缓存中查找是否有完全匹配(字节对字节完全相同)的查询结果。

    2. 如果找到(缓存命中),则直接返回结果,完全跳过解析、优化和执行阶段,效率极高。

    3. 如果未找到(缓存未命中),则继续执行查询,获取结果后,会将结果存储到查询缓存中,以备下次使用。

  • 失效机制非常粗粒度。只要对某张表进行了任何写操作(INSERT, UPDATE, DELETE, TRUNCATE, ALTER TABLE等),那么所有与这张表相关的查询缓存都会全部失效并被清除。这对于写操作频繁的数据库来说,缓存命中率会非常低,维护缓存反而带来了巨大的性能开销。

  • 现状在MySQL 5.7中开始弃用,在MySQL 8.0中已被彻底移除。主要原因就是其弊大于利,在高并发读写场景下,缓存失效带来的争用甚至会导致性能下降。现在通常建议使用应用层缓存(如Redis, Memcached)来替代它。


2. InnoDB存储引擎的缓存 - 缓冲池 (Buffer Pool)

  • 归属InnoDB存储引擎的特性。这是InnoDB自身实现的核心组件。

  • 工作原理

    1. 缓冲池是主内存中的一片区域,用于缓存表和索引数据。当需要读取数据时,InnoDB会先检查数据页是否在缓冲池中。如果在(缓存命中),则直接读取内存,速度极快。

    2. 如果不在(缓存未命中),则从磁盘读取相应的数据页,并将其放入缓冲池中,然后再进行读取。

    3. 对于写操作,修改的也是缓冲池中的数据页。这些被修改但尚未刷新到磁盘的页称为脏页 (Dirty Page)。InnoDB有后台线程定期将脏页刷新到磁盘,这个过程称为刷脏 (Checkpointing)

  • 重要性这是InnoDB性能的核心。通过缓冲池,InnoDB将磁盘I/O操作最小化,将最多的操作在内存中完成。缓冲池的大小(通过 innodb_buffer_pool_size 参数设置)是MySQL性能调优最重要的参数,通常建议设置为服务器物理内存的50%-80%。

  • 与索引的关系:B+树索引的非叶子节点和频繁访问的叶子节点都会常驻在缓冲池中,这使得基于索引的查询速度非常快。


3. InnoDB索引使用与底层原理

索引数据结构:B+树

InnoDB使用B+树作为其索引的数据结构。B+树是为磁盘存储而优化的,它具有以下特点:

  • 矮胖树:层级很少,通常只需2-4次I/O就能在亿万级数据中找到目标。

  • 所有数据都存储在叶子节点:非叶子节点只存储键值(索引列的值)和指向子节点的指针,这使得非叶子节点可以存储大量键值,让树更“矮胖”。

  • 叶子节点形成有序链表:范围查询效率极高,只需找到范围的起始点,然后沿着链表遍历即可。

聚集索引 (Clustered Index)
  • InnoDB的表必须有一个聚集索引。

  • 数据行本身就直接存储在聚集索引的叶子节点上。因此,表数据本身就是按聚集索引的顺序物理存储的。

  • 通常,聚集索引就是主键(PRIMARY KEY)。如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果也没有,则会隐式创建一个 rowid 作为聚集索引。

二级索引 (Secondary Index)
  • 也叫非聚集索引或辅助索引。

  • 二级索引的叶子节点存储的不是完整的数据行,而是该行的主键值

  • 当通过二级索引查询时,需要先找到对应的主键值,然后再回到聚集索引中根据主键查找完整的行数据。这个过程称为回表 (Bookmark Lookup)

索引使用原则
  1. 最左前缀原则:对于联合索引 (a, b, c),它可以用于查询 a(a, b)(a, b, c) 的条件,但不能用于跳过 a 直接查询 b 或 c

  2. 覆盖索引 (Covering Index):如果查询的字段都包含在某个索引中(例如在索引 (a, b) 上查询 a, b),则引擎可以直接从索引中获取数据,而无需回表,极大提升性能。

  3. 索引下推 (Index Condition Pushdown, ICP):MySQL 5.6引入。在索引遍历过程中,提前对索引中包含的字段进行WHERE条件过滤,减少回表的次数。

  4. ps:如果没有索引下推优化(或称ICP优化),当进行索引查询时,首先根据索引来查找记录,然后再根据where条件来过滤记录;在支持ICP优化后,MySQL会在取出索引的同时,判断是否可以进行where条件过滤再进行索引查询。

总结与对比

特性MySQL Server查询缓存InnoDB缓冲池 (Buffer Pool)
归属层面MySQL Server层InnoDB存储引擎层
缓存内容完整的查询结果集表和索引的数据页
粒度粗(表级)细(页级,通常16KB)
失效机制对表的任何写操作导致所有相关缓存失效基于LRU算法和刷脏机制,精细管理
现状MySQL 8.0中已移除InnoDB核心组件,至关重要
目的避免重复执行相同的SQL查询减少磁盘I/O,加速数据访问

因此,在现代MySQL(尤其是8.0+)的架构讨论和性能优化中,我们关注的重点几乎完全在 InnoDB缓冲池 上,而早已不再考虑已被废弃的Server层查询缓存。理解缓冲池的工作原理和大小设置,是优化数据库性能的第一步,也是最关键的一步。


文章转载自:

http://jSt5Ks46.jbtwq.cn
http://88Y1umXB.jbtwq.cn
http://3icBnYY2.jbtwq.cn
http://YQuAzyz7.jbtwq.cn
http://bxWQ35Yk.jbtwq.cn
http://QE8mL2JE.jbtwq.cn
http://v2EvQRDc.jbtwq.cn
http://OkGmjaOi.jbtwq.cn
http://TGKaxrk9.jbtwq.cn
http://1DrW4jCU.jbtwq.cn
http://h2AAtMOg.jbtwq.cn
http://UrgvuQnt.jbtwq.cn
http://1Tdjz7Go.jbtwq.cn
http://YUoCH2qQ.jbtwq.cn
http://2OLXuh8X.jbtwq.cn
http://MV3P7MP9.jbtwq.cn
http://N75uxQr1.jbtwq.cn
http://g2qFCsbp.jbtwq.cn
http://nEW74AR5.jbtwq.cn
http://06CIgJzf.jbtwq.cn
http://4Cl1tYdf.jbtwq.cn
http://JNqPYO2e.jbtwq.cn
http://X6vtXLwc.jbtwq.cn
http://VwaSdZiq.jbtwq.cn
http://W7n3AKm8.jbtwq.cn
http://LrUcPGB7.jbtwq.cn
http://OnYuLwuL.jbtwq.cn
http://UMrOdzoP.jbtwq.cn
http://qInCsCOY.jbtwq.cn
http://Eg6VMSLZ.jbtwq.cn
http://www.dtcms.com/a/383581.html

相关文章:

  • 全网首款数学建模交互AI应用-持续更新
  • 飞牛NAS本地挂载夸克网盘、接入飞牛影视教程
  • 音视频学习(六十五):fmp4
  • 【STM32】串口的阻塞、中断、DMA收发
  • win10系统 文件夹被占用无法删除
  • LawGPT:基于中文法律知识的大模型
  • 手搓多模态-10 旋转位置编码的原理和实现
  • C# --- dispose机制与using关键字
  • HakcMyVM-Aurora
  • Flask学习笔记(一)
  • MobaXterm软件访问ZYNQ板卡的Linux系统
  • 基于vLLM与YOLO的智能图像分类系统
  • 标准CAN帧介绍
  • 蚂蚁矿机S19 Pro 104T技术参数解析及性能分析
  • 一小时解决RabbitMQ面试题
  • HBM4量产就绪|2026年AI与数据中心新标配
  • 细粒度图像分类的可解释性Finer-CAM
  • C++中多线程core的问题分析和总结
  • scrapy框架-day02
  • 电商导购平台的移动端架构设计:React Native在多端统一中的实践
  • class_9:java 抽象类和接口
  • [硬件电路-209]:电子携带两种能量,一种是电流宏观运动的动能,一种是绕着原子核运动的原子轨道能量;前者是电势能与热能转化的媒介;后者是实现光能与电能的转化
  • HBase启动报错“Master is initializing”解决方案
  • 交换机的级联和堆叠
  • QT加密和哈希
  • 历史数据分析——中科曙光
  • Dropout:深度学习中的随机丢弃正则化技术
  • 数组存储 · 行主序与列主序 | 应用 / 基地址 / 选择策略
  • 贪心算法应用:最早截止时间优先(EDF)问题详解
  • 每天五分钟深度学习:神经网络的权重参数如何初始化