MySQL简解

文章目录

  • 1. MySQL框架
  • 2. 执行流程
    • 2.1. 连接池:
    • 2.2. SQL 前端(SEVER)
      • 2.2.0. 查询缓存
      • 2.2.1. SQL 接口
      • 2.2.2. SQL 解析器
      • 2.2.3. SQL 执行器
      • 2.2.4. INNODB 中读写操作
    • 2.3. 数据的保存形式
  • 3.其他重要概念
    • 3.1. 索引
      • 3.1.1. 简单概念
      • 3.1.2. 索引优化:
      • 1. Using filesort
      • 2. Using temporary
      • 3. Using index
      • 4. Using where
      • 5. Using index condition
      • 6. Using join buffer
      • 7. Impossible WHERE
      • 8. Select tables optimized away
    • 3.2. 页
      • 2. 读写效率
      • 3. 缓冲池管理
      • 4. 事务日志
      • 5. MVCC 支持
      • 6. 索引管理
      • 7. 空间管理
    • 3.2. 段
      • 功能和优势

1. MySQL框架

虽然大部分人都会只用 mysql,但是大部分对于 mysql 的大致框架都不慎了解,虽然我也使用了很久,但是对 mysql 的了解仅仅是皮毛,这里简单对 MySQL 的重要模块进行简单剖析。

在这里插入图片描述
这里以 INNODB 为视角,简单介绍一下 MySQL 的重要某块和简单执行流程。

2. 执行流程

2.1. 连接池:

首先我们需要知道,为什么 MySQL 要有连接池。

客户端一般通过 JDBC 之类的驱动和 Mysql 进行链接。
Mysql 里一般为重要数据,为了可靠性,mysql 和 客户端的交互一般通过 TCP 协议。

不过数据库的连接并非全双工,而是半双工

那么问题来了,TCP 一般要维护链接状态,客户端一般和 MYSQL 需要频繁的数据交互。

  1. 反复重新断开和重建连接的代价是比较高的,
  2. 同样 如果保活所有链接又不现实,因为活跃客户端并非很多。

又因为客户端相对不容易变化,所以 Mysql 使用连接池 作为一个客户端与 Mysql 连接数的一个权衡,作为提升连接效率的方案。

连接池核心参数如下,设计思路和线程池是有些类似的。

  • 最大连接数(Max Connections)

    • 这个参数指定了连接池中允许的最大活跃连接数。当连接池中的活跃连接达到此数值时,新的请求将等待,直到有可用连接。
  • 最小空闲连接数(Min Idle Connections)

    • 这是连接池中应保持空闲状态的最小连接数。连接池会尝试保持至少这么多的连接处于空闲状态,以备不时之需。
  • 初始化连接数(Initial Connections)

    • 启动连接池时,立即创建的连接数量。这可以帮助应用程序快速启动,避免在第一次请求时承受创建连接的延迟。

在 MYSQL 内部大概分为了两层,一层是 SEVER 层,核心是 解析器,优化器,执行器,相当于 MYSQL 的前端;
在这里插入图片描述
一层是,存储引擎,如 INNODB 和 MYSAM,相当于 MYSQL 的后端。
在这里插入图片描述

2.2. SQL 前端(SEVER)

2.2.0. 查询缓存

查询缓存,一般在进入 SQL 的第一步进行哈希查询,如果存在 该 SQL 的 key 就直接返回,不过 MYSQL 中未默认开启工这个功能,且在 8.0 后该功能已经被移除。

原因主要如下:

  1. 会造成过多性能浪费
  2. 有专业的redis去替代
  3. redis 的手动,一致性查询更加灵活

2.2.1. SQL 接口

SQL 接口是一种逻辑概念。MYSQL 为客户端提供了包括创建,修改 表,增删改查表等一系列功能。而这些暴露给客户端统一的进行 sql 操作的逻辑接口。

这些操作具体在进入MYSQL 会进行其他的加工操作。

2.2.2. SQL 解析器

  1. SQL 解析(Parsing)
  • 词法分析:此阶段主要将输入的 SQL 语句分解成一系列的令牌(tokens),例如关键字、操作符、标识符等。
  • 语法分析:解析器根据 MySQL 的语法规则检查 SQL 语句的结构是否正确。如果语法有误,将在这一步骤中抛出错误。
  1. 预处理(Preprocessing)
  • 在这一步,预处理器会进行一些额外的检查和转换。它会验证 SQL 语句中引用的数据库对象(如表和列)是否存在,以及用户是否有权执行该语句。预处理器还可能调整语句的结构,以便更有效地执行。
  1. 优化(Optimization)
  • 查询优化器:这是一个核心组件,它负责选择执行查询的最有效路径。优化器会考虑多种可能的查询执行计划,并根据成本估算模型选择一个预期成本最低的计划。

查询优化器通过成本模型(cost model)来估算不同查询执行计划的成本,从而选择最有效的执行方案。这个成本通常是基于估计的资源消耗来计算的,包括磁盘I/O、内存使用、CPU 使用和网络开销

  • 执行计划生成:优化器产生一个详细的步骤计划,称为执行计划,它详细说明了如何访问数据库中的数据(例如选择哪些索引,连接表的顺序等)

2.2.3. SQL 执行器

在这里插入图片描述

  1. 根据优化器提供的执行计划,执行引擎负责执行具体的数据库操作。这包括数据的读取、计算和最终的数据返回。
  2. 执行过程中,执行引擎通过存储引擎的Handler 与 之交互,存储引擎负责管理如何在磁盘上存储和检索数据。

2.2.4. INNODB 中读写操作

在 INNODB 中一般有读写两种原子操作。

在这里插入图片描述
写入操作一般复杂一些。
在这里插入图片描述
MySQL 的读写操作都是面向 Buffer Pool 的。

但是在写的时候一般有 Redo log 和 Undo log 的辅助。

一般在事务提交后未刷入数据页的故障需要重做,事务未提交的故障需要回滚。

  1. redo 日志简解:

Redo log 日志是为了保证 buffer 区数据的意外恢复的,由于 Mysql 的数据处理都是面向 Buffer 的,由于是在内存中,没有持久化到硬盘中,这是不安全的,redo log 在意外停电等情况下用于buffer 区内容的恢复。


为什么 redo log 区需要刷盘? 那为什么不直接把buffer 区内容直接刷入数据页?
答: redo 日志的buffer 默认在内存也不够安全,需要通过刷盘策略刷入到硬盘。 由于redo log 日志保存是顺序保存,比直接随机刷入数据页要快

  1. undo 日志简解:

Undo 日志是事务回滚的关键,并且和 INNODB 的核心并发机制 MVCC 有紧密的关联。

MVCC 机制在这里插入图片描述

  1. 创建 Read View
    当事务开始执行读操作时,数据库会为这个事务创建一个 read view。这个视图包含了以下几个关键信息:
  • 活动事务列表:这个列表包含了在当前事务开始时所有活跃的事务的事务ID。
  • 最小活动事务ID(min-active trx id):所有未完成事务中最小的事务ID。
  • 创建时刻的事务ID(creator trx id):当前事务的ID。
  1. 读取数据时处理版本链

当事务尝试读取某个记录时,数据库系统会遵循以下步骤来确定应该返回哪个版本的数据:

  • 遍历版本链:每条记录可能有多个版本,每个版本由不同的事务在不同时间创建。系统会从最新版本开始,遍历这个记录的版本链。
  • 检查版本可见性:对于链中的每个版本,系统会检查创建该版本的事务ID(trx_id)。
    • 如果trx_id小于 read view 中的最小活动事务ID,并且创建该版本的事务已提交,则这个版本是可见的。
    • 如果trx_id属于 read view 中的活动事务列表,则该版本不可见,因为创建它的事务还未提交。
    • 如果trx_id等于当前事务的ID,这意味着当前事务自己修改了这条记录,所以这个版本是可见的。
  • 选择可见的最新版本:从版本链中选择最新的、对当前事务可见的版本作为读取结果。

在处理删除和插入操作时,版本链的处理会稍有不同。例如,如果一条记录被标记为删除,并且删除操作是在当前事务的 read view
创建之后发生的,则这条记录对当前事务不可见。

2.3. 数据的保存形式

以 INNODB 为例
在这里插入图片描述
.frm 文件

  • 用途.frm 文件用于存储表的结构信息。这包括表的定义,如字段名、数据类型、默认值以及其他表结构相关的元数据。
  • 特点
    • 每个表都有一个对应的 .frm 文件。
    • .frm 文件格式相对独立于存储引擎,这意味着无论表使用的是 InnoDB、MyISAM 或其他存储引擎,.frm 文件都是必需的。
    • 在 MySQL 5.7 及之前的版本中,.frm 文件是表结构存储的唯一方式。

.ibd 文件

  • 用途.ibd 文件是 InnoDB 存储引擎特有的文件,用于存储表的数据和索引。
  • 特点
    • .ibd 文件允许 InnoDB 实现表级别的物理文件存储,这种方式称为“文件-表空间”(file-per-table tablespace)。
    • 使用 .ibd 文件可以使得数据库备份、恢复、迁移以及维护操作更加灵活和高效。
    • innodb_file_per_table 配置选项启用时,每个 InnoDB 表都会有一个独立的 .ibd 文件。如果该选项未启用,所有表的数据和索引将存储在共享的表空间中,通常是 ibdata1 文件。
    • .ibd 文件支持高级功能,如压缩、行格式选择等。

MySQL 8.0 及以后的变化

从 MySQL 8.0 开始,.frm 文件被淘汰,表的结构信息改由数据字典管理,这是一个集中在 InnoDB
引擎内部的系统表集合。这个变化意味着在最新版本的 MySQL
中,表的定义信息不再存储在独立的文件中,而是直接嵌入到数据库引擎的内部结构中。这样的变化带来了更好的性能和更简单的管理。

3.其他重要概念

3.1. 索引

3.1.1. 简单概念

索引可谓是重中之重,在面试中为常问考点。在 INNODB 中索引的数据结构是 B+ 树,一个类似二叉排序树的,一个节点包含更多数据的二叉树。

在这里插入图片描述
由于 B+ 树的特性,在 MySQL 中,索引的使用遵循左前缀匹配的原则。

3.1.2. 索引优化:

tyoe类型

  1. system
  • 含义:表仅有一行(系统表)。这是可能的最优 type,因为 MySQL 实际上把整个表转换为一个常数。
  1. const
  • 含义:通过索引一次性查找一行数据。这通常用于比较主键或唯一索引的查询。因为只返回一行数据,所以效率非常高。
  1. eq_ref
  • 含义:在 JOIN 操作中,对于每个索引键,表中只有一行与之匹配。这通常发生在使用主键或唯一索引作为连接条件时。
  1. ref
  • 含义:这是 JOIN 类型的一种,它返回匹配某个单个值的所有行。ref 可以用于非唯一索引,或者是唯一索引的非唯一部分。
  1. fulltext
  • 含义:查询使用了全文索引。
  1. ref_or_null
  • 含义:这个类型类似于 ref,但 MySQL 会额外搜索包含 NULL 值的行。这在处理包含 NULL 值的联合查询中特别有用。
  1. index_merge
  • 含义:这种类型表示查询使用了两个或更多的索引合并策略。MySQL 会搜索几个索引,并使用索引合并的方法来生成结果集。
  1. unique_subquery
  • 含义:这种类型用在 IN 查询中,其中子查询返回不重复的值,通常涉及到主键或唯一索引。
  1. index_subquery
  • 含义:这种类型也用在 IN 查询中,但子查询可以返回重复的值。使用索引来查找每个键值。
  1. range
  • 含义:MySQL 使用一个索引来检索给定范围的行,比如使用操作符 BETWEEN、<、>等。
  1. index
  • 含义:MySQL 将遍历整个索引来查找匹配的行。这比全表扫描要好,因为索引通常是压缩的,所以IO成本较低。
  1. ALL
  • 含义:全表扫描,MySQL 将遍历全表来找到匹配的行。这通常是最慢的一种类型,应该尽量避免。

EXTRA 关键字

1. Using filesort

  • 含义:MySQL 需要进行外部排序来解决查询,常见于 ORDER BY 操作,表明索引没有被用于排序。
  • 优化策略:尝试调整索引以覆盖排序和查询条件,或重新设计查询以利用索引进行排序。

2. Using temporary

  • 含义:执行查询时,MySQL 需要创建一个临时表,通常在执行复杂的 JOIN、排序或者子查询时发生。
  • 优化策略:优化查询逻辑,减少需要使用临时表的操作。例如,简化 SELECT 子句中的表达式,或调整 JOIN 的顺序以减少处理的数据量。

3. Using index

  • 含义:查询能够只通过索引来完成,没有读取表的其他部分,这是一个非常高效的访问方式。
  • 优化策略:这通常是一个良好的指标,表明查询已经很好地利用了索引。确保常用查询维持这种状态。

4. Using where

  • 含义:MySQL 在检索行后还需要进行额外的 WHERE 条件过滤。
  • 优化策略:尽可能地通过索引来满足 WHERE 条件,减少需要后处理的行数。

5. Using index condition

  • 含义:使用了索引条件推送(Index Condition Pushdown),这在 MySQL 5.6 及以后版本中提供,它允许更高效地使用索引来过滤记录。
  • 优化策略:此特性通常自动启用,确保你的 MySQL 版本支持此优化,并且索引适用于查询条件。

6. Using join buffer

  • 含义:用于 JOIN 操作,表明没有使用索引,MySQL 需要使用缓冲区来处理 JOIN
  • 优化策略:调整 JOIN 语句或增加适当的索引,以尽量避免使用大量的 JOIN 缓冲。

7. Impossible WHERE

  • 含义:WHERE 子句的条件永远不为真,查询不会返回任何结果。
  • 优化策略:检查逻辑错误,确保查询条件正确并能返回预期的结果。

8. Select tables optimized away

  • 含义:优化器识别出只需要从优化的表中读取很少的数据或无需实际访问表数据。
  • 优化策略:通常不需要进一步优化,这显示查询已经非常高效。

3.2. 页

在硬盘中一个磁盘块为4k,一个页通常为连续的4个磁盘块,在一次加载的时候加载一个页,由于是顺序读取一般情况下比较快,

  1. 数据存储组织
  • 存储结构:InnoDB 将数据存储在大小固定的页中,通常每页的大小为 16KB(虽然这个大小可以配置)。这种方式允许数据库高效地读取、写入和管理数据。

2. 读写效率

  • I/O 效率:通过以页为单位进行数据读写,数据库能够减少磁盘 I/O 操作的次数。因为即使需要访问的只是页中的少量数据,整个页的数据也会一次性被加载到内存中,这样对同一页面的后续访问不再需要磁盘 I/O。

3. 缓冲池管理

  • 缓冲池(Buffer Pool):InnoDB 使用缓冲池来缓存数据页和索引页,从而提高数据访问速度。这意味着频繁访问的数据可以保留在内存中,提高数据库的响应速度和整体性能。

4. 事务日志

  • Redo 日志:InnoDB 使用页作为 Redo 日志记录的基本单位。这意味着每次事务修改页内容时,修改的内容(或差异)被记录到 Redo 日志中。这有助于确保在数据库崩溃后能够恢复数据。

5. MVCC 支持

  • 多版本并发控制:InnoDB 页中存储了行的多个版本,支持 MVCC。这允许多个事务同时访问同一数据页的不同版本,从而支持无锁读取,提高并发性。

6. 索引管理

  • B+树索引:InnoDB 使用 B+树索引结构来加速数据访问。在这种结构中,索引数据也是按页组织的。索引的叶节点页直接包含或指向实际的数据页,而非叶节点页存储键值和指向子页的指针,从而支持快速数据查找和范围查询。

7. 空间管理

  • 表空间:InnoDB 将所有的页组织在表空间中,表空间可以是单个文件或多个文件,其中包括数据和索引页。这种组织方式为数据文件的管理和扩展提供了灵活性。

3.2. 段

段的概念允许数据库以更高层次的逻辑结构管理数据,而不是单纯依赖于物理存储细节。在 InnoDB 中,常见的段类型包括:

  • 数据段:存储表数据的页。
  • 索引段:存储索引数据的页,每个索引(如主键或二级索引)都会有自己的索引段。
  • 回滚段:存储用于事务回滚和多版本并发控制(MVCC)的旧数据。

功能和优势

逻辑上的段组织带来了几个关键优势:

  1. 性能优化:通过逻辑组织段,数据库能够更有效地管理数据和索引的存储,优化访问模式和查询性能。
  2. 数据管理:段使得数据和索引的管理变得更为灵活,例如,在增加或删除数据时,数据库可以更有效地分配和回收空间。
  3. 事务处理:段的使

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【复现代码——环境配置】

目录 一、复现代码举例二、创建环境——选择一个Python版本2.1 创建基本环境2.1.1 基于AutoDL2.1.2 基于PyCharm 2.2 终端激活环境2.3 退出环境2.4 删除环境 三、PyTorch安装3.1 查看cuda3.2 安装PyTorch 四、其他依赖安装4.1 tensorboardX4.2 matplotlib4.3 medpy4.4 visdom4.…

stable-diffusion-webui安装与使用过程中的遇到的error合集

stable-diffusion-webui1.9.2踩坑安装 1. 安装过程1.1 stable-diffusion-webui1.2 在win11或win10系统安装&#xff0c;需修改两个启动脚本1.2.1 修改webui-user.bat1.2.2 修改webui.bat 1.3 双击 webui-user.bat 启动脚本1.3.1 no module xformers. Processing without on fre…

实体书营销:“三三裂变”,实操细节分享……

实体书营销:“三三裂变”,实操细节分享 一、实验结果 “三三裂变”的实验,结果比较好。就是我们大概有300人报名,但实际行动的只有109人,大概有103人都完成了三个人的目标,也就是说我们通过109人裂变了475人,利润率是1:4.5左右,整个裂变的效率还是可以的,也就是说: …

阿赵UE学习笔记——30、HUD简单介绍

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎&#xff0c;这次来学习一下HUD的基础使用。 一、 什么是HUD HUD(Head-Up Display)&#xff0c;也就是俗称的抬头显示。很多其他领域里面有用到这个术语&#xff0c;比如开车的朋友可能会接触过&#xf…

后端工程师——Java工程师岗位要求

在国内,Java 程序员是后端开发工程师中最大的一部分群体,其市场需求量也是居高不下,C++ 程序员也是热门岗位之一,此二者的比较也常是热点话题,例如新学者常困惑的问题之一 —— 后端开发学 Java 好还是学 C++ 好。读完本文后,我们可以从自身情况、未来的发展,岗位需求量…

适用于手机蓝牙的热敏晶体FA1612AS

EPSON推出的一款1612小尺寸无源热敏晶体:FA1612AS。FA1612AS的额定频率为38.4Mhz的晶体单元&#xff0c;采用无铅材料&#xff0c;符合ROHS标准&#xff0c;内置热敏电阻&#xff0c;可用于移动电话&#xff0c;蓝牙等。热敏晶体FA1612AS的产品特性:额定频率:38.4MHZ外部尺寸规…

上海亚商投顾:沪指缩量调整 有色、煤炭等周期股集体大跌

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日缩量调整&#xff0c;午后一度跌近1%&#xff0c;黄白二线走势分化&#xff0c;微盘股指数涨超3%。军…

SpringBoot 启动控制台 --banner.txt实现打印炫酷控制台图案

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 分析源代码&#xff0c;banner.txt实现打印控制台 控制台图案生成网址&#xff1a;Ascii艺术字实现个性化Spring Boot启动banner图案&#xff0c;轻松修改更换banner.txt文件内容&#xff0c;收集了丰富…

ASP.NET Core 3 高级编程(第8版) 学习笔记 04

第 19 章主要介绍 Restful Service 的相关知识。Restful Service 的核心内容是&#xff1a;&#xff08;1&#xff09;HTTP 请求或 HTTP 动词&#xff0c;用 HTTP 请求表达不同的操作&#xff0c;最好遵守惯例。&#xff08;2&#xff09;资源&#xff0c;通过 PATH 结合 paylo…

C语言学习/复习31--简单通讯录功能的实现/结构体的运用/strcmp函数的运用/memset函数

0、分文件/结构体定义初始化/成员变量的访问/结构体地址传参/switch/for()/do while()/数组中元素的添加与删除/assert/const/宏/字符与内存函数 一、结构体运用---通讯录 1.基本功能 2.项目文件 二.具体操作方法 1.test.c文件 包含菜单与输入界面 2.contact.h头文件 …

中霖教育:二建考试哪些地区查社保?

想要报考二级建造师考试的同学都知道&#xff0c;在个别省份报名参加二建是需要核查社保信息的&#xff0c;也有一些省份对社保不做强制要求。 以下这几个省份查社保&#xff0c;如果不满足条件可以避开这几个省份&#xff0c;具体规定可参考当地发布的二建考试公告。 山东、…

阿里云官方综合优惠平台,官方云小站平台最新优惠政策汇总

阿里云官方云小站平台是阿里云为用户提供的优惠聚集地&#xff0c;这里不仅有丰富的优惠活动&#xff0c;还有不定期发布的云产品通用代金券。本文为您详细介绍阿里云官方综合优惠平台——官方云小站2024年的最新优惠政策&#xff0c;帮助您以更优惠的价格享受到高品质的云服务…

影响肉类口感的关键指标:肉嫩度的深度解析与检测方法

影响肉类口感的关键指标&#xff1a;肉嫩度的深度解析与检测方法 一、引言&#xff1a;肉类嫩度与食用体验 在饮食文化中&#xff0c;肉类的嫩度一直被视为影响口感的重要因素。对于消费者而言&#xff0c;嫩滑多汁的肉质往往能带来更好的食用体验。因此&#xff0c;准确评估…

如何在官网查看Qt5的所有模块?

2024年4月23日&#xff0c;周二上午 如果你不想一步步来的话&#xff0c;可以直接去这个Qt官方链接 https://doc.qt.io/qt-5/qtmodules.html 第一步&#xff1a;去到Qt官网 https://www.qt.io/ 第二步&#xff1a;点击文档链接 第三步&#xff1a;选择文档中的“Qt5” 第四步…

探索ChatGPT在提高人脸识别与软性生物识准确性的表现与可解释性

概述 从GPT-1到GPT-3&#xff0c;OpenAI的模型不断进步&#xff0c;推动了自然语言处理技术的发展。这些模型在处理语言任务方面展现出了强大的能力&#xff0c;包括文本生成、翻译、问答等。 然而&#xff0c;当涉及到面部识别和生物特征估计等任务时&#xff0c;这些基于文…

(007)Blender 根据顶点组分离模型

1.选中模型&#xff0c;并且进入【3D视图】【编辑模式】&#xff1a; 2.选择顶点组&#xff1a; 3.分离选中项&#xff1a;

齐护K210系列教程(四)_串口输出

串口输出打印数据 文章目录 串口输出打印数据1&#xff0c;什么是串口通信2&#xff0c;串口通常的应用3&#xff0c;AIstart的串口编程3-1 打印数据输出3-2 打印数据输出与输入 4&#xff0c;课程资源 1&#xff0c;什么是串口通信 在设计程序的过程中&#xff0c;经常要查看…

【中邦兴业】如何进行气流流型测试?一篇文章告诉你

气流流型&#xff0c;作为反应无菌操作的关键测试&#xff0c;其测试方法和结果是否合理直接关系到无菌保障水平是否达到要求。一个科学的气流流型设计&#xff0c;能够正确反应关键区域和关键操作下的气流流动是否符合要求&#xff0c;能否有效减少产品微生物的污染风险。如今…

Redis系列:内存淘汰策略

1 前言 通过前面的一些文章我们知道&#xff0c;Redis的各项能力是基于内存实现的&#xff0c;相对其他的持久化存储&#xff08;如MySQL、File等&#xff0c;数据持久化在磁盘上&#xff09;&#xff0c;性能会高很多&#xff0c;这也是高速缓存的一个优势。 但是问题来了&am…

【预测】小米汽车电子电气架构的猜想

文章目录 前言 整车EEA 硬件平台 软件平台 总结 参考资料 前言 见《【Review】小米汽车发布会》 整车EEA 小米汽车整车电子电气架构方面的信息&#xff0c;小米官方并没有对外介绍&#xff0c;但是从近日流出的整车BOM和供应商列表中看到&#xff0c;车上各种控制器一个都…