MySQL梳理:其他

MySQL数据库技术知识合集,涵盖InnoDB存储引擎的区管理机制、缓冲池机制等核心技术要点。本文档将持续补充MySQL相关的重要技术知识点。

📋 目录

模块一:InnoDB区状态管理机制

  • 1.1 核心设计思想
  • 1.2 四种区状态详解
  • 1.3 渐进式空间分配策略
  • 1.4 区状态转换机制
  • 1.5 设计理念总结

模块二:InnoDB缓冲池机制

  • 2.1 缓存机制的重要性
  • 2.2 Buffer Pool核心概念
  • 2.3 Buffer Pool管理机制
  • 2.4 LRU算法优化策略
  • 2.5 脏页刷新机制
  • 2.6 性能配置与监控

模块一:InnoDB区状态管理机制

1.1 核心设计思想

💡 设计挑战:空间效率 vs 访问效率的平衡

InnoDB面临一个核心矛盾:

  • 小表/新表:数据少,如果分配整个区(一个区=64页=64*16KB=1MB)会造成巨大浪费
  • 大表/成熟表:数据多,如果页面分散会导致随机I/O性能差

InnoDB的解决方案是:渐进式空间分配策略 + 多层次区状态管理

InnoDB区状态管理机制
设计目标
核心挑战
解决方案
空间效率最大化
访问性能优化
动态自适应分配
小表空间浪费问题
1MB区 vs 几KB数据
大表随机I/O问题
页面分散影响性能
静态分配策略局限
无法适应数据增长
渐进式空间分配
从页级到区级
四种区状态管理
FREE/FREE_FRAG/FULL_FRAG/FSEG
动态状态转换
基于使用情况自动调整

1.2 四种区状态详解

InnoDB创造了四种区状态来实现渐进式分配机制:

应用场景
小段 → FREE_FRAG区
页面级精细分配
中段 → FULL_FRAG区
混合分配策略
大段 → FSEG区
区级高效分配
InnoDB区状态分类
FREE区
FREE_FRAG区
FULL_FRAG区
FSEG区
64页全部空闲
战略储备库
可转为任何状态
部分页面被使用
精细化服务中心
页面级分配,多段共享
64页全部被使用
历史分配记录
不可再分配新页面
完全归属某个段
高性能专用领域
单段独占,连续空间
🔍 四种状态的本质作用
  1. FREE区 = 战略储备库

    • 表空间的"未分配资源池"
    • 可以灵活转换为任何其他状态
    • 保证系统的可扩展性
  2. FREE_FRAG区 = 精细化服务中心

    • 为小段提供页面级精确分配
    • 多段共享,最大化空间利用率
    • 承担"空间效率优先"的分配任务
  3. FULL_FRAG区 = 历史分配记录

    • 记录过往的碎片分配结果
    • 虽然不能再分配新页面,但仍在正常服务
    • 体现了系统分配策略的演进历史
  4. FSEG区 = 高性能专用领域

    • 为大段提供连续的高效空间
    • 单段独占,优化顺序I/O性能
    • 承担"性能效率优先"的分配任务

1.3 渐进式空间分配策略

跟踪一个真实的表在InnoDB中的空间分配演化过程:

表空间初始化
创建新表
数据量很少
< 32个页面
从FREE_FRAG区
分配零散页面
数据持续增长
≥ 32个页面
开始申请完整区
从FREE区获取
区状态转为FSEG
专属于当前段
FREE区管理
维护空闲区列表
按需分配给段
转换为FSEG状态
FREE_FRAG区管理
维护部分使用的区
提供页面级分配
页面用完转为FULL_FRAG
FULL_FRAG区管理
记录历史分配
仍然正常服务
不可再分配新页面
FSEG区管理
段独占完整区
连续页面布局
优化顺序I/O性能

分配策略的智能性体现

  • 阈值导向:基于32页面阈值决定分配策略转换
  • 性能优先:大段优先使用连续区,小段共享碎片区
  • 资源优化:避免小段占用整个区造成空间浪费
  • 动态调整:根据数据增长自动切换分配模式

1.4 区状态转换机制

理解区状态转换的精确条件和触发机制:

区初始化
小段申请页面
页面级分配开始
大段申请完整区
≥32页面阈值
所有页面分配完
64页全部使用
继续页面级分配
仍有空闲页面
保持状态
不可再分配
段持续使用
专属状态保持
FREE
FREE_FRAG
FSEG
FULL_FRAG
战略储备库
随时可转换
精细分配中心
多段共享使用
历史记录状态
服务但不分配
高性能专区
单段独占使用

状态转换的触发条件

  1. FREE → FREE_FRAG

    • 触发条件:小段(< 32页面)申请页面
    • 分配方式:页面级精确分配
    • 共享机制:多个段可共享同一区的剩余页面
  2. FREE → FSEG

    • 触发条件:大段(≥ 32页面)申请完整区
    • 分配方式:区级批量分配
    • 独占机制:整个区完全归属于申请段
  3. FREE_FRAG → FULL_FRAG

    • 触发条件:区内64页全部被分配使用
    • 状态变化:从可分配转为不可分配
    • 服务继续:现有页面继续正常服务

1.5 设计理念总结

🎯 核心设计理念

InnoDB区状态管理不是简单的空间分类,而是一套完整的性能优化系统,它通过四种状态实现了:

  • 渐进式分配:从页面级精细分配到区级高效分配
  • 动态平衡:在空间效率和访问性能之间智能权衡
  • 自适应优化:根据数据量增长自动调整分配策略
🌟 机制的精妙之处

这套机制最精彩的地方在于:

  • 没有固定规则:根据实际需求动态决策
  • 没有性能损失:每种状态都服务于特定的性能目标
  • 没有资源浪费:通过状态转换充分利用每一点空间
  • 没有硬性边界:可以平滑过渡和混合使用

打造出了一套动态的、自适应的、性能导向的空间优化系统

模块二:InnoDB缓冲池机制

2.1 缓存机制的重要性

解决磁盘 I/O 性能瓶颈与 CPU 处理速度之间的矛盾

磁盘 I/O 瓶颈的核心问题

  • 性能差距:磁盘读写速度远慢于 CPU 处理速度
  • 访问成本:每次磁盘 I/O 都是昂贵的性能开销
  • 优化策略:InnoDB 将数据以 (16KB)为单位加载到内存中,缓存后可重复使用

缓存策略的智能设计

  • 页面单位:即使只访问页中的一条记录,也会加载整个页到内存
  • 空间局部性:相邻数据通常会被一起访问,批量加载提高效率
  • 时间局部性:近期访问的数据很可能再次被访问,缓存备用

2.2 Buffer Pool核心概念

什么是 Buffer Pool
  • 定义:Buffer Pool 是 InnoDB 向操作系统申请的一块连续内存,用于缓存磁盘上的页面数据
  • 默认大小:128MB,可通过 innodb_buffer_pool_size 参数调整(最小 5MB)
  • 配置示例innodb_buffer_pool_size = 268435456 设置为 256MB
  • 核心作用:存储用户数据(如聚簇索引、二级索引)和系统数据,减少磁盘 I/O
Buffer Pool 内部结构
Buffer Pool
连续内存空间
缓存页区域
16KB * N
控制块区域
808字节 * N
碎片空间
剩余内存
缓存页1
16KB
缓存页2
16KB
...
缓存页N
16KB
控制块1
表空间号、页号
地址、链表节点信息
控制块2
808字节
...
控制块N
808字节
内存分配特点
控制块占用约5%内存
实际申请内存比设定值大5%
缓存页与磁盘页大小一致
碎片空间说明
分配后剩余空间
不足以容纳完整的
控制块+缓存页组合
无法被有效利用

内存组成详解

  • 缓存页:默认大小 16KB,与磁盘页大小一致,用于存储实际数据
  • 控制块:每个缓存页对应一个控制块,包含表空间编号、页号、地址、链表节点信息等,占用约 5% 的内存(808 字节/控制块)
  • 碎片:Buffer Pool 分配后剩余空间不足以容纳一组控制块+缓存页,称为碎片
  • 内存分配innodb_buffer_pool_size 不包含控制块,实际申请内存比设定值大约 5%

2.3 Buffer Pool管理机制

InnoDB通过多种链表结构来高效管理Buffer Pool中的页面:

页面生命周期流程
1.磁盘加载
2.Free链表分配
3.哈希表注册
4.LRU链表管理
5.成为脏页
6.Flush链表追踪
7.刷回磁盘
Buffer Pool管理机制
Free链表
哈希表
Flush链表
LRU链表
空闲页面管理
启动时全空闲
分配时移除节点
基节点存储元信息
快速页面定位
Key: 表空间号+页号
Value: 缓存页地址
O(1)时间复杂度
脏页管理
修改但未刷盘
异步批量刷新
避免频繁写入
页面淘汰策略
最近使用在头部
最少使用在尾部
Young/Old区域优化
核心管理机制详解

1. Free 链表管理

  • 作用:管理空闲缓存页,确保有页面可供分配
  • 初始化:启动 MySQL 时,Buffer Pool 初始化,所有缓存页为空闲,控制块加入 Free 链表
  • 使用流程:从磁盘加载页时,从 Free 链表取空闲缓存页,填入表空间号、页号等信息后移除该节点
  • 基节点:存储链表头尾地址和节点数量,独立于 Buffer Pool 内存(40 字节/基节点)

2. 哈希表快速定位

  • 作用:快速定位页面是否在 Buffer Pool 中,避免重复加载
  • 实现:以 表空间号 + 页号 作为 key,缓存页地址作为 value,构建哈希表
  • 查询流程:查询哈希表,检查页面是否已缓存。若命中,直接使用;若未命中,从 Free 链表取空闲页并加载

3. Flush 链表脏页管理

  • 脏页定义:Buffer Pool 中被修改但未同步到磁盘的页面
  • 管理策略:脏页的控制块加入 Flush 链表,异步刷新到磁盘以减少性能开销
  • 性能优化:避免频繁磁盘写入,定期由后台线程批量处理

2.4 LRU算法优化策略

传统LRU算法的问题与优化
区域功能详解
Young区域(63%)
• 热点数据保护区
• 频繁访问页面
• 前1/4访问不移动
Old区域(37%)
• 新页面缓冲区
• 预读页面存放
• 全表扫描过滤
时间控制机制
• innodb_old_blocks_time
• 默认1000ms间隔
• 防止瞬时页面污染
LRU算法演进
传统LRU问题
优化后的LRU
简单LRU策略
新页面→头部,旧页面→尾部
无空闲时淘汰尾部
预读问题
线性预读≥56页面
随机预读13页面
加载未使用页面
全表扫描问题
大量低频页面
挤占热点数据
命中率下降
Young/Old区域划分
Young 63% + Old 37%
新页面策略
先进Old区域头部
满足时间间隔才进Young
访问优化
Young前1/4不移动
降低调整开销
LRU优化的具体实现

1. 区域划分策略

  • Young区域:占总空间的 63%(innodb_old_blocks_pct 默认 37% 给 Old 区域)
  • Old区域:占总空间的 37%,作为新页面的缓冲区域
  • 分界点:动态维护,根据页面访问情况调整

2. 页面升级规则

  • 新加载页面:直接放入 Old 区域头部,而非 Young 区域
  • 首次访问间隔:页面在 Old 区域首次访问后,需满足 innodb_old_blocks_time(默认 1000ms)时间间隔才会移到 Young 区域头部
  • Young区域优化:Young 区域前 1/4 的页面访问不移动到头部,降低频繁调整开销

3. 优化效果

  • 预读保护:预读页面留在 Old 区域,不会立即挤占 Young 区域热点数据
  • 全表扫描隔离:全表扫描的大量页面被限制在 Old 区域,保护真正的热点数据
  • 性能提升:减少链表调整开销,提高整体缓存命中率

2.5 脏页刷新机制

脏页刷新是Buffer Pool管理的关键环节,直接影响系统性能:

性能影响等级
刷新触发条件
✅ 最佳:后台异步
用户查询无影响
系统负载平滑
⚠️ 一般:批量刷新
短暂性能波动
整体可接受
❌ 最差:同步阻塞
用户查询延迟
系统性能下降
定期刷新触发
• CheckPoint机制
• 定时器触发
• 系统负载评估
压力刷新触发
• Free链表空间不足
• Buffer Pool使用率高
• 脏页比例超阈值
事务刷新触发
• 事务日志空间压力
• 崩溃恢复优化
• 数据一致性保障
脏页刷新机制
异步刷新策略
同步刷新策略
BUF_FLUSH_LRU
LRU链表尾部扫描
即将淘汰的脏页
innodb_lru_scan_depth控制
BUF_FLUSH_LIST
Flush链表批量刷新
后台线程定期执行
根据系统负载调速
BUF_FLUSH_SINGLE_PAGE
紧急情况触发
用户线程同步执行
严重影响查询性能
刷新策略详解

1. 后台异步刷新(推荐)

  • BUF_FLUSH_LRU:定期扫描LRU链表尾部,刷新即将被淘汰的脏页
  • BUF_FLUSH_LIST:根据系统负载动态调整刷新速率,批量处理Flush链表中的脏页
  • 优势:用户查询不受影响,系统负载平滑分布

2. 紧急同步刷新(避免)

  • BUF_FLUSH_SINGLE_PAGE:当无空闲页面时,用户线程被迫同步刷新脏页
  • 触发条件:Free链表为空,且需要加载新页面
  • 性能影响:严重阻塞用户查询,应通过合理配置避免

2.6 性能配置与监控

多实例Buffer Pool配置

目的与设置

  • 并发优化:通过 innodb_buffer_pool_instances 指定实例数(默认 1)
  • 限制条件:若 innodb_buffer_pool_size < 1GB 强制为 1 个实例
  • 分配公式:每个实例大小 = innodb_buffer_pool_size / innodb_buffer_pool_instances
  • 推荐配置:Buffer Pool ≥ 1GB 时设置 4-8 个实例
Chunk机制(MySQL 5.7.5+)

动态调整支持

  • 实现原理:Buffer Pool 由多个 Chunk 组成,每个 Chunk 是固定大小的连续内存
  • 默认配置:128MB per Chunk(innodb_buffer_pool_chunk_size
  • 约束要求innodb_buffer_pool_size 必须是 innodb_buffer_pool_chunk_size × innodb_buffer_pool_instances 的整数倍
  • 自动调整:若配置不符合要求,服务器自动调整为最近的整数倍
性能监控与诊断

查看Buffer Pool状态

SHOW ENGINE INNODB STATUS\G

关键性能指标

  • Total memory allocated:Buffer Pool 总内存(含控制块、碎片)
  • Buffer pool size:缓存页总数(单位:页)
  • Free buffers:Free 链表中的空闲页数
  • Database pages:LRU 链表页数(Young + Old)
  • Old database pages:Old 区域页数
  • Modified db pages:脏页数(Flush 链表)
  • Buffer pool hit rate:缓存命中率(接近 1000/1000 为最佳)
常见配置问题与解决方案

1. 如何设置 Buffer Pool 大小?

[server]
innodb_buffer_pool_size = 8G  # 建议为物理内存的 50%-70%

2. 如何优化缓存命中率?

  • 增大 innodb_buffer_pool_size
  • 调整 innodb_old_blocks_pct(如 40%)和 innodb_old_blocks_time(如 1000ms)
  • 避免频繁全表扫描,优化查询使用索引

3. 多实例 vs 单实例选择?

  • 多实例:适合高并发场景,建议 Buffer Pool ≥ 1GB 时设置 4-8 个实例
  • 单实例:管理开销低,适合小规模系统

4. 命中率低的诊断方法?

  • 检查 Buffer pool hit rate 指标
  • 若命中率低,可能是全表扫描或预读加载了大量无用页面
  • 需优化查询语句或调整 innodb_old_blocks_time 参数

📚 知识点总结

模块一要点

  • 区状态管理:FREE、FREE_FRAG、FULL_FRAG、FSEG四种状态实现渐进式分配
  • 智能平衡:在空间效率与访问性能之间动态权衡
  • 自适应机制:基于32页面阈值自动调整分配策略

模块二要点

  • 缓冲池设计:通过多链表结构高效管理内存页面
  • LRU优化:Young/Old区域划分,解决预读和全表扫描问题
  • 脏页管理:异步刷新机制,平衡写入性能与数据一致性

实践建议

  1. 区状态监控:关注区状态分布,避免过度碎片化
  2. 缓存池配置:合理设置大小和实例数,优化命中率
  3. 系统调优:建立监控体系,持续优化数据访问模式

持续更新:本文档将根据需要持续添加MySQL相关的重要技术模块,敬请关注

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

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

相关文章

影刀 —— 飞书电子表格

以获取列上第一个可用行为例我们需要获取的分别是 凭证 和 表格唯一标识首先来看如何获取凭证在飞书开发者后台创建应用然后添加权限发版拿App ID 和 App Secret下面来创建电子表格&#xff01;&#xff01;&#xff01;注意这个表格一定不要创建到知识库里面如果创建到知识库里…

1.二维图像处理(完整版)

目录 1.变换矩阵 2.在矩阵的基础上添加各种变换形式 3.开始变换 4.计算变换矩阵参数 新算子 二、阈值分割 新算子 三、blob分析案例 1.焊点 2.石头 3.木材 4.车牌 5.骰子 新算子 四、傅里叶变换频域分析 问题一 五、滤波处理 1.均值滤波 2.中值滤波 3.高斯…

【linux基础】Linux 文本处理核心命令指南

Linux 文本处理核心命令指南 文本处理是 Linux 系统管理的核心能力&#xff0c;约 80% 的配置文件操作都依赖于文本处理技术。本指南详细讲解 echo、重定向、cat、grep、wc 和 vim 等关键命令&#xff0c;涵盖从基础操作到高级技巧的完整知识体系&#xff0c;并配有实用案例演示…

基于深度学习YOLOv12的草莓成熟度检测系统(YOLOv12+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)https://www.bilibili.com/video/BV1

一、项目介绍 本项目构建了一套基于深度学习 YOLOv12 的草莓成熟度识别检测系统&#xff0c;旨在实现对草莓在不同成熟阶段的高精度、实时检测与分类。系统采用 YOLO 格式数据集&#xff0c;将草莓分为 3 个类别&#xff1a;生&#xff08;raw&#xff09;、半熟&#xff08;tu…

深入理解Android Kotlin Flow:响应式编程的现代实践

引言在现代Android开发中&#xff0c;处理异步数据流是一个核心需求。Kotlin Flow作为协程库的一部分&#xff0c;提供了一种声明式的、可组合的异步数据流处理方式。本文将深入探讨Flow的设计理念、核心组件、高级用法以及在实际项目中的最佳实践。一、Flow基础概念1.1 什么是…

功能测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试项目启动与研读需求文档&#xff08;一&#xff09; 组建测试团队1、测试团队中的角色2、测试团队的基本责任尽早地发现软件程序、系统或产品中所有的问题…

算法73. 矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用原地算法。 示例 1&#xff1a;输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 示例2&#xff1a; 输入&#xf…

【力扣22】括号生成

数字n代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且有效的括号组合。 源代码&#xff1a; class Solution { public:int n;vector<string> ans;string path;vector<string> generateParenthesis(int n) {this->n n;d…

ELK分布式日志采集系统

* 系统架构&#xff1a;filebeat 采集各服务器日志&#xff1b;Logstash-docker 过滤整理日志&#xff1b; Elasticsearch-docker 存储和索引数据&#xff1b; Kibana-docker 提供可视化展示和操作。* FileBeat简介&#xff1a;Filebeat是本地文件的日志数据采集器。* Kafka简介…

Python生产环境部署指南:专业级应用启动方案

在生产环境中部署Python应用需要考虑稳定性、性能和安全性。本文将详细介绍多种专业部署方案,助你构建可靠的生产环境。 一、核心部署架构 标准Python生产环境包含三个核心组件: 应用服务器:运行Python代码(Gunicorn/uWSGI/Uvicorn) 进程管理器:保障服务持续运行(Supe…

C语言:结构体、共用体与枚举详解

在 C 语言编程中&#xff0c;结构体&#xff08;struct&#xff09;、共用体&#xff08;union&#xff09;与枚举&#xff08;enum&#xff09;是三种非常重要的用户自定义数据类型。它们能帮助我们更好地组织、管理和表达复杂的数据结构。本文将结合实例&#xff0c;深入介绍…

Linux Web服务器与WordPress部署笔记

web服务器 nginx 配置基本认证 用户名和密码使用plain text发送&#xff0c;所以最好配置SSL/TLS。 # 安装工具[rootserver ~ 09:21:43]# yum -y install httpd-tools[rootserver ~ 09:28:30]# vim /etc/nginx/conf.d/ssl.confserver {​location /auth-basic/ {auth_basic …

贪心----3. 跳跃游戏 II

45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; /** 维护变量: max_reachable,遍历过的元素的最远可达位置 end,当前区间终点(随max_reachable变化) 遍历过程: 遍历时迭代遍历过的元素最远可达位置,利用end记录当前区间终点(随max_reachable变化) 当移动至end即当前…

RabbitMQ面试精讲 Day 13:HAProxy与负载均衡配置

【RabbitMQ面试精讲 Day 13】HAProxy与负载均衡配置 开篇 欢迎来到"RabbitMQ面试精讲"系列的第13天&#xff01;今天我们将聚焦RabbitMQ集群架构中的关键组件——HAProxy及其负载均衡配置。在大型分布式系统中&#xff0c;如何实现RabbitMQ集群的高可用和负载均衡是…

C# 中常用集合以及使用场景

1. 数组 (Array)‌‌特点‌&#xff1a;固定大小、内存连续、访问速度快‌使用场景‌&#xff1a;需要高性能的固定大小集合数值计算&#xff08;如矩阵运算&#xff09;存储已知长度的数据&#xff08;如配置文件参数&#xff09;‌2. List<T>‌‌特点‌&#xff1a;动态…

量化实战学习 Day 2:双均线策略实现与回测分析

一、前言在完成第一天的环境搭建和基础认知后&#xff0c;今天将进入真正的策略开发环节。本文将记录我从数据处理到第一个量化策略实现的全过程&#xff0c;包含完整的代码示例和深度思考。二、复习与环境检查1.1 环境复查首先确认了Day 1搭建的环境运行正常&#xff1a; cond…

ubuntu 安装内核模块驱动 DKMS 介绍

DKMS&#xff08;Dynamic Kernel Module Support&#xff0c;动态内核模块支持&#xff09;是一个用于管理 Linux 内核模块的工具&#xff0c;主要作用是在系统内核更新时&#xff0c;自动重新编译和安装依赖于特定内核版本的驱动程序&#xff08;内核模块&#xff09;&#xf…

adb使用指南

adb使用指南一、介绍二、连接一、有线连接方式二、无线连接方式**Android 10及以下版本****Android 11及以上版本**三、指令1、设备连接管理2、应用调试3、文件传输4、系统控制6、日志分析7、其他速查表总结python脚本实例&#xff1a;提示&#xff1a;以下是本篇文章正文内容&…

C语言实战:二级指针与文件操作的完美邂逅——动态管理文件数据

资料合集下载链接: ​https://pan.quark.cn/s/472bbdfcd014​ 在上一篇文章中,我们探讨了二级指针作为函数“输出特性”的强大功能。今天,我们将更进一步,通过一个完整的实战项目,将二级指针与文件I/O操作结合起来,学习如何动态、高效地读取和管理文件内容。 这个项目…

低代码开发实战案例,如何通过表单配置实现数据输入、数据存储和数据展示?

JVS低代码轻应用快速开发采用所见即所得的配置思路&#xff0c;表单是低代码中最基础的业务配置引擎之一&#xff0c;快速的通过表单配置实现数据输入、数据存储&#xff0c;数据展示。那么在轻应用下直接点开菜单打开的表单&#xff0c;录入数据提交到数据模型&#xff0c;后续…