mysql相关基础知识篇(三)

news2024/11/24 14:40:45

1.一条更新sql语句怎么执行的了解吗?

更新语句的执行是 Server 层和引擎层配合完成,数据除了要写入表中,还要记录相应的日志。
在这里插入图片描述

  • 执行器先找引擎获取 ID=2 这一行。ID 是主键,存储引擎检索数据,找到这一行。如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
  • 执行器拿到引擎给的行数据,把这个值加上 1,比如原来是 N,现在就是 N+1,得到新的一行数据,再调用引擎接口写入这行新数据。
  • 引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
  • 执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
  • 执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。
    从上图可以看出,MySQL 在执行更新语句的时候,在服务层进行语句的解析和执行,在引擎层进行数据的提取和存储;同时在服务层对 binlog 进行写入,在 InnoDB 内进行 redo log 的写入。

不仅如此,在对 redo log 写入时有两个阶段的提交,一是 binlog 写入之前prepare状态的写入,二是 binlog 写入之后commit状态的写入。

2.那为什么要两阶段提交呢?

为什么要两阶段提交呢?直接提交不行吗?

我们可以假设不采用两阶段提交的方式,而是采用“单阶段”进行提交,即要么先写入 redo log,后写入 binlog;要么先写入 binlog,后写入 redo log。这两种方式的提交都会导致原先数据库的状态和被恢复后的数据库的状态不一致。

先写入 redo log,后写入 binlog:

在写完 redo log 之后,数据此时具有crash-safe能力,因此系统崩溃,数据会恢复成事务开始之前的状态。但是,若在 redo log 写完时候,binlog 写入之前,系统发生了宕机。此时 binlog 没有对上面的更新语句进行保存,导致当使用 binlog 进行数据库的备份或者恢复时,就少了上述的更新语句。从而使得id=2这一行的数据没有被更新。
在这里插入图片描述
先写入 binlog,后写入 redo log:
写完 binlog 之后,所有的语句都被保存,所以通过 binlog 复制或恢复出来的数据库中 id=2 这一行的数据会被更新为 a=1。但是如果在 redo log 写入之前,系统崩溃,那么 redo log 中记录的这个事务会无效,导致实际数据库中id=2这一行的数据并没有更新。
在这里插入图片描述
简单说,redo log 和 binlog 都可以用于表示事务的提交状态,而两阶段提交就是让这两个状态保持逻辑上的一致。

3.redo log 怎么刷入磁盘的知道吗?

redo log 的写入不是直接落到磁盘,而是在内存中设置了一片称之为redo log buffer的连续内存空间,也就是redo 日志缓冲区。
在这里插入图片描述
什么时候会刷入磁盘?

在如下的一些情况中,log buffer 的数据会刷入磁盘:

  • log buffer 空间不足时
    log buffer 的大小是有限的,如果不停的往这个有限大小的 log buffer 里塞入日志,很快它就会被填满。如果当前写入 log buffer 的 redo 日志量已经占满了 log buffer 总容量的大约一半左右,就需要把这些日志刷新到磁盘上。

  • 事务提交时
    在事务提交时,为了保证持久性,会把 log buffer 中的日志全部刷到磁盘。注意,这时候,除了本事务的,可能还会刷入其它事务的日志。

  • 后台线程输入
    有一个后台线程,大约每秒都会刷新一次log buffer中的redo log到磁盘。

  • 正常关闭服务器时
    触发 checkpoint 规则
    重做日志缓存、重做日志文件都是以块(block)的方式进行保存的,称之为重做日志块(redo log block),块的大小是固定的 512 字节。我们的 redo log 它是固定大小的,可以看作是一个逻辑上的 log group,由一定数量的log block 组成。
    在这里插入图片描述
    它的写入方式是从头到尾开始写,写到末尾又回到开头循环写。

其中有两个标记位置:

write pos是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。checkpoint是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到磁盘。
在这里插入图片描述
当write_pos追上checkpoint时,表示 redo log 日志已经写满。这时候就不能接着往里写数据了,需要执行checkpoint规则腾出可写空间。

所谓的checkpoint 规则,就是 checkpoint 触发后,将 buffer 中日志页都刷到磁盘。

4.慢 SQL 如何定位呢?

慢 SQL 的监控主要通过两个途径:
在这里插入图片描述

  • 慢查询日志:开启 MySQL 的慢查询日志,再通过一些工具比如 mysqldumpslow 去分析对应的慢查询日志,当然现在一般的云厂商都提供了可视化的平台。
  • 服务监控:可以在业务的基建中加入对慢 SQL 的监控,常见的方案有字节码插桩、连接池扩展、ORM 框架过程,对服务运行中的慢 SQL 进行监控和告警。

5.有哪些方式优化慢 SQL?

慢 SQL 的优化,主要从两个方面考虑,SQL 语句本身的优化,以及数据库设计的优化。
在这里插入图片描述
避免不必要的列

这个是老生常谈,但还是经常会出的情况,SQL 查询的时候,应该只查询需要的列,而不要包含额外的列,像slect * 这种写法应该尽量避免。

分页优化

在数据量比较大,分页比较深的情况下,需要考虑分页的优化。

例如:

select * from table where type = 2 and level = 9 order by id asc limit 190289,10;

优化方案:

延迟关联
先通过 where 条件提取出主键,在将该表与原数据表关联,通过主键 id 提取数据行,而不是通过原来的二级索引提取数据行

例如:

select a.* from table a, 
 (select id from table where type = 2 and level = 9 order by id asc limit 190289,10 ) b
 where a.id = b.id

书签方式

书签方式就是找到 limit 第一个参数对应的主键值,根据这个主键值再去过滤并 limit

例如:

  select * from table where id >
  (select * from table where type = 2 and level = 9 order by id asc limit 190

索引优化

合理地设计和使用索引,是优化慢 SQL 的利器。

利用覆盖索引

InnoDB 使用非主键索引查询数据时会回表,但是如果索引的叶节点中已经包含要查询的字段,那它没有必要再回表查询了,这就叫覆盖索引

例如对于如下查询:

select name from test where city='上海'

我们将被查询的字段建立到联合索引中,这样查询结果就可以直接从索引中获取

alter table test add index idx_city_name (city, name);

低版本避免使用 or 查询

在 MySQL 5.0 之前的版本要尽量避免使用 or 查询,可以使用 union 或者子查询来替代,因为早期的 MySQL 版本使用 or 查询可能会导致索引失效,高版本引入了索引合并,解决了这个问题。

避免使用 != 或者 <> 操作符

SQL 中,不等于操作符会导致查询引擎放弃查询索引,引起全表扫描,即使比较的字段上有索引

解决方法:通过把不等于操作符改成 or,可以使用索引,避免全表扫描

例如:把column<>’aaa’,改成column>’aaa’ or column<’aaa’,就可以使用索引了

适当使用前缀索引

适当地使用前缀所云,可以降低索引的空间占用,提高索引的查询效率。

比如,邮箱的后缀都是固定的“@xxx.com”,那么类似这种后面几位为固定值的字段就非常适合定义为前缀索引

alter table test add index index2(email(6));

PS:需要注意的是,前缀索引也存在缺点,MySQL 无法利用前缀索引做 order by 和 group by 操作,也无法作为覆盖索引

避免列上函数运算

要避免在列字段上进行算术运算或其他表达式运算,否则可能会导致存储引擎无法正确使用索引,从而影响了查询的效率

select * from test where id + 1 = 50;
select * from test where month(updateTime) = 7;

正确使用联合索引

使用联合索引的时候,注意最左匹配原则。

#JOIN 优化

优化子查询

尽量使用 Join 语句来替代子查询,因为子查询是嵌套查询,而嵌套查询会新创建一张临时表,而临时表的创建与销毁会占用一定的系统资源以及花费一定的时间,同时对于返回结果集比较大的子查询,其对查询性能的影响更大。

小表驱动大表

关联查询的时候要拿小表去驱动大表,因为关联的时候,MySQL 内部会遍历驱动表,再去连接被驱动表。

比如 left join,左表就是驱动表,A 表小于 B 表,建立连接的次数就少,查询速度就被加快了。

 select name from A left join B ;

适当增加冗余字段

增加冗余字段可以减少大量的连表查询,因为多张表的连表查询性能很低,所有可以适当的增加冗余字段,以减少多张表的关联查询,这是以空间换时间的优化策略。

避免使用 JOIN 关联太多的表

《阿里巴巴 Java 开发手册》规定不要 join 超过三张表,第一 join 太多降低查询的速度,第二 join 的 buffer 会占用更多的内存。

如果不可避免要 join 多张表,可以考虑使用数据异构的方式异构到 ES 中查询。

#排序优化

利用索引扫描做排序

MySQL 有两种方式生成有序结果:其一是对结果集进行排序的操作,其二是按照索引顺序扫描得出的结果自然是有序的

但是如果索引不能覆盖查询所需列,就不得不每扫描一条记录回表查询一次,这个读操作是随机 IO,通常会比顺序全表扫描还慢

因此,在设计索引时,尽可能使用同一个索引既满足排序又用于查找行

例如:

--建立索引(date,staff_id,customer_id)
select staff_id, customer_id from test where date = '2010-01-01' order by staff_id,customer_id;

UNION 优化
条件下推

MySQL 处理 union 的策略是先创建临时表,然后将各个查询结果填充到临时表中最后再来做查询,很多优化策略在 union 查询中都会失效,因为它无法利用索引

最好手工将 where、limit 等子句下推到 union 的各个子查询中,以便优化器可以充分利用这些条件进行优化

此外,除非确实需要服务器去重,一定要使用 union all,如果不加 all 关键字,MySQL 会给临时表加上 distinct 选项,这会导致对整个临时表做唯一性检查,代价很高。

6.怎么看执行计划(explain),如何理解其中各个字段的含义?

explain 是 sql 优化的利器,除了优化慢 sql,平时的 sql 编写,也应该先 explain,查看一下执行计划,看看是否还有优化的空间。

直接在 select 语句之前增加explain 关键字,就会返回执行计划的信息。
在这里插入图片描述
在这里插入图片描述

  1. id 列:MySQL 会为每个 select 语句分配一个唯一的 id 值
  2. select_type 列,查询的类型,根据关联、union、子查询等等分类,常见的查询类型有 SIMPLE、PRIMARY。
  3. table 列:表示 explain 的一行正在访问哪个表。
  4. type 列:最重要的列之一。表示关联类型或访问类型,即 MySQL 决定如何查找表中的行。
    性能从最优到最差分别为:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
  • system
    system:当表仅有一行记录时(系统表),数据量很少,往往不需要进行磁盘 IO,速度非常快

  • const
    const:表示查询时命中 primary key 主键或者 unique 唯一索引,或者被连接的部分是一个常量(const)值。这类扫描效率极高,返回数据量少,速度非常快。

  • eq_ref
    eq_ref:查询时命中主键primary key 或者 unique key索引, type 就是 eq_ref。

  • ref_or_null
    ref_or_null:这种连接类型类似于 ref,区别在于 MySQL会额外搜索包含NULL值的行。

  • index_merge
    index_merge:使用了索引合并优化方法,查询使用了两个以上的索引。

  • unique_subquery
    unique_subquery:替换下面的 IN子查询,子查询返回不重复的集合。

  • index_subquery
    index_subquery:区别于unique_subquery,用于非唯一索引,可以返回重复值。

  • range
    range:使用索引选择行,仅检索给定范围内的行。简单点说就是针对一个有索引的字段,给定范围检索数据。在where语句中使用 bettween…and、<、>、<=、in 等条件查询 type 都是 range。

  • index
    index:Index 与ALL 其实都是读全表,区别在于index是遍历索引树读取,而ALL是从硬盘中读取。

  • ALL
    就不用多说了,全表扫描。

  1. possible_keys 列:显示查询可能使用哪些索引来查找,使用索引优化 sql 的时候比较重要。
  2. key 列:这一列显示 mysql 实际采用哪个索引来优化对该表的访问,判断索引是否失效的时候常用。
  3. key_len 列:显示了 MySQL 使用
  4. ref 列:ref 列展示的就是与索引列作等值匹配的值,常见的有:const(常量),func,NULL,字段名。
  5. rows 列:这也是一个重要的字段,MySQL 查询优化器根据统计信息,估算 11. SQL 要查到结果集需要扫描读取的数据行数,这个值非常直观显示 SQL 的效率好坏,原则上 rows 越少越好。
  6. Extra 列:显示不适合在其它列的额外信息,虽然叫额外,但是也有一些重要的信息:
  7. Using index:表示 MySQL 将使用覆盖索引,以避免回表
  8. Using where:表示会在存储引擎检索之后再进行过滤
  9. Using temporary :表示对查询结果排序时会使用一个临时表。

7.能简单说一下索引的分类吗?

从三个不同维度对索引分类:
在这里插入图片描述
例如从基本使用使用的角度来讲:

  • 主键索引: InnoDB 主键是默认的索引,数据列不允许重复,不允许为 NULL,一个表只能有一个主键。
  • 唯一索引: 数据列不允许重复,允许为 NULL 值,一个表允许多个列创建唯一索引。
  • 普通索引: 基本的索引类型,没有唯一性的限制,允许为 NULL 值。
  • 组合索引:多列值组成一个索引,用于组合搜索,效率大于索引合并

8.为什么使用索引会加快查询?

传统的查询方法,是按照表的顺序遍历的,不论查询几条数据,MySQL 需要将表的数据从头到尾遍历一遍。

在我们添加完索引之后,MySQL 一般通过 BTREE 算法生成一个索引文件,在查询数据库时,找到索引文件进行遍历,在比较小的索引数据里查找,然后映射到对应的数据,能大幅提升查找的效率。

和我们通过书的目录,去查找对应的内容,一样的道理。
在这里插入图片描述

9.创建索引有哪些注意点?

索引虽然是 sql 性能优化的利器,但是索引的维护也是需要成本的,所以创建索引,也要注意:

  1. 索引应该建在查询应用频繁的字段
    在用于 where 判断、 order 排序和 join 的(on)字段上创建索引。

  2. 索引的个数应该适量
    索引需要占用空间;更新时候也需要维护。

  3. 区分度低的字段,例如性别,不要建索引。
    离散度太低的字段,扫描的行数降低的有限。

  4. 频繁更新的值,不要作为主键或者索引
    维护索引文件需要成本;还会导致页分裂,IO 次数增多。

  5. 组合索引把散列性高(区分度高)的值放在前面
    为了满足最左前缀匹配原则

  6. 创建组合索引,而不是修改单列索引。
    组合索引代替多个单列索引(对于单列索引,MySQL 基本只能使用一个索引,所以经常使用多个条件查询时更适合使用组合索引)

  7. 过长的字段,使用前缀索引。当字段值比较长的时候,建立索引会消耗很多的空间,搜索起来也会很慢。我们可以通过截取字段的前面一部分内容建立索引,这个就叫前缀索引。

  8. 不建议用无序的值(例如身份证、UUID )作为索引
    当主键具有不确定性,会造成叶子节点频繁分裂,出现磁盘存储的碎片化

10.索引哪些情况下会失效呢?

  • 查询条件包含 or,可能导致索引失效
  • 如果字段类型是字符串,where 时一定用引号括起来,否则会因为隐式类型转换,索引失效
  • like 通配符可能导致索引失效。
  • 联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
  • 在索引列上使用 mysql 的内置函数,索引失效。
  • 对索引列运算(如,+、-、*、/),索引失效。
  • 索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
  • 索引字段上使用 is null, is not null,可能导致索引失效。
  • 左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
  • MySQL 优化器估计使用全表扫描要比使用索引快,则不使用索引。

11.索引不适合哪些场景呢?

  • 数据量比较少的表不适合加索引
  • 更新比较频繁的字段也不适合加索引
  • 离散低的字段不适合加索引(如性别)

12.索引是不是建的越多越好呢?

当然不是。
索引会占据磁盘空间
索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL 不仅要保存数据,还有保存或者更新对应的索引文件。

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

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

相关文章

工业服务被忽视的销售力量:他们的技术人员

目录 1.从销售到服务的普遍 2.从服务到销售的滞后 3.是什么阻碍了售后服务时销售行为的发生 3.如何改善这种状况 1.从销售到服务的普遍 服务销售窗口的提前在工业企业已经是非常普遍的现象&#xff0c;特别是在互联网经济高度发达的今天&#xff0c;销售的触角已经直达消费…

MySQL如何确定查询处理各个阶段所消耗的时间

使用profile set profiling1; 启动profile 这是一个session级的配置 执行查询 show profiles; 查询每一个查询所消耗的总时间信息 show profile for query N; 查询的每个阶段所耗的时间 show profile cpu for query 1; 但是每次使用都会有一个warning 使用performanc…

59 - 类模板与函数模板的深度剖析

---- 整理自狄泰软件唐佐林老师课程 1. 多参数模板 类模板可以定义 任意多个不同的 类型参数 2. 类模板可以被 特化 模板本来是一组通用逻辑的实现&#xff0c;但是可能存在特定的参数类型下&#xff0c;通用的逻辑实现不能满足要求&#xff0c;这时就需要针对这些特殊的类型&…

【密码学基础】RSA加密算法

1 RSA介绍 RSA是一种非对称加密算法&#xff0c;即加密和解密时用到的密钥不同。加密密钥是公钥&#xff0c;可以公开&#xff1b;解密密钥是私钥&#xff0c;必须保密保存。基于一个简单的数论事实&#xff1a;两个大质数相乘很容易&#xff0c;但想要对其乘积进行因式分解却…

IIS 部署 SSL 证书提示证书链中的一个或多个中间证书丢失

现象描述 IIS Web 服务部署免费 SSL 证书时提示 “证书链中的一个或多个中间证书丢失&#xff0c;要解决此问题&#xff0c;请确保安装了所有中间证书”。 下载中间证书文件&#xff0c;根据您的证书加密算法类型下载中间证书至您的云服务器中。 安装中间证书 1. 在您需要部…

Arcgis地理配准栅格数据

前提 有时候获取的不同数据没有坐标,而却有共同点,这时候需要对数据进行配准校正,数据才能最终拼接镶嵌在一起 效果 1、准备数据 2、打开地理配准工具 3、地理配准中设置待配准数据 4、添加控制点 这份数据目测很容易找到控制点 在待配准数据上先选择控制点,再在基准数…

JavaScript_BOM

JavaScript_BOM BOM&#xff1a;Browser Object Model 浏览器对象模型。也就是 JavaScript 将浏览器的各个组成部分封装为对象。 我们要操作浏览器的各个组成部分就可以通过操作 BOM 中的对象来实现。 BOM 中包含了如下对象&#xff1a; Window&#xff1a;浏览器窗口对象N…

JavaScript基础语法(类型转换)

JavaScript基础语法&#xff08;类型转换&#xff09; 使用运算符的时候会发生类型转换。 其他类型转为number string转换为 number类型&#xff1a;按照字符串的字面值&#xff0c;转为数字。如果字面值不是数字&#xff0c;则转为NaN 将 string转换为 number有两种方式&…

存储器管理

文章目录存储器的层次结构存储器的指标多层结构的存储器系统主存储器与寄存器高速缓存和磁盘缓存程序的装入和链接对用户程序的处理步骤程序的装入程序的链接连续分配的存储管理方式单一连续分配固定分区分配动态分区分配基于顺序搜索的动态分区分配算法基于索引搜索的动态分区…

EventLoop

1.javascript是一门单线程语言 任务1 ---> 任务2--->任务3 单线程执行任务队列的问题&#xff1a; 如果前一个任务非常耗时&#xff0c;则后面的任务不得不一直等待&#xff0c;从而导致程序假死问题 2.同步任务和异步任务 同步任务&#xff1a;js主线程直接执行 同…

沉睡者IT - 什么是Web3.0?

欢迎关注沉睡者IT&#xff0c;点上面关注我 ↑ ↑ 什么是Web3.0&#xff1f; Web3&#xff08;也称为Web 3&#xff09;用最简单的话来解释就是&#xff0c;第三代互联网。 那么有朋友要问了&#xff0c;那么什么是第一代&#xff0c;什么是第二代&#xff1f;第三代又有什么…

2.1 Redis中SDS的定义

每个sds.h/sdshdr 结构表示一个SDS值 struct sdshdr { //记录 buf 数组中已经使用的字节数量 //等于SDS所保存字符串的长度 int len;//记录buf数组中未使用字节的数量 int free;//字节数组,用于保存字符串 char buf[]; };图2-1 展示了一个SDS 示例: 1、free 属性值为0&#x…

Kotlin 开发Android app(十三):RadioGroup和ViewPager控件实现底层分页按钮

安卓的控件是挺多的&#xff0c;没有办法一个一个的来说明&#xff0c;我们挑出了一些重点的控件&#xff0c;组成一些常见的布局&#xff0c;这样以后在遇到相同功能的界面时&#xff0c;就会有自己的思路&#xff0c;或者进行复用。 在这一节中&#xff0c;我们实现一个底层分…

CANoe-vTESTstudio之State Diagram编辑器(元素介绍)

State Diagram编辑器里的工具箱,有多个图形符号,它们是组成状态图表的图形元素,具有不同的作用。图形元素能够高效并快速地创建状态图表,然后生成测试用例 1. 基本测试设计元素 1.1 Setup Setup元素的测试代码能够执行一次,在检查测试用例之前。例如,用于建立诊断连接 …

uni-app接入mPaas扫码

目录 原因 配置mPaas应用 包名和打签名APK 使用云端插件 打自定义基座 原因 可以用uni.scanCode扫一下下面的二维码&#xff0c;会发现&#xff0c;左边的识别不了&#xff0c;而右边的能识别&#xff0c;其实人眼看&#xff0c;两个二维码应该是一样的。 只不过左边的会有…

String的几个面试题

1.. 第一个只出现一次的字符 class Solution {public int firstUniqChar(String s) {int []count new int[125];for(int i0;i<s.length();i){char chs.charAt(i);count[ch];}for(int i0;i<s.length();i) {char ch s.charAt(i);if (count[ch] 1) {return i;}}return -1…

网站被DDOS攻击怎么办?防护经验!

为了能够及时发现ddos攻击&#xff0c;下面我们就详细介绍一下网站受ddos攻击的症状&#xff1a; 网站遇到ddos攻击的表现之一&#xff1a;服务器CPU被大量占用 ddos攻击其实是一种恶意性的资源占用攻击&#xff0c;攻击者利用肉鸡或者攻击软件对目标服务器发送大量的无效请求&…

详解设计模式:代理模式

代理模式&#xff08;Proxy Pattern&#xff09;&#xff0c;Java 常见的设计模式之一&#xff0c;是 GoF 的 23 种设计模式中的一种结构型设计模式。 代理模式 是指客户端并不直接调用实际的对象&#xff0c;而是通过调用代理对象&#xff0c;来间接的调用实际的对象。代理对象…

矢量三维电磁铁的技术参数

产品介绍&#xff1a; 锦正茂自主研发的多极电磁铁以四极电磁铁居多&#xff0c;也有五极、六极、八极等多极的应用&#xff0c;主要应用于多极磁环充磁、径向梯度磁场、旋转磁场磁导向等多种应用。 产品用途&#xff1a; 电磁铁/电磁场发生器主要用于磁滞现象研究、磁化系数测…

SAP-S4 BP 业务伙伴(客户与供应商)管理后台配置

目录 一、定义业务伙伴角色 二、客户和BP主数据同步配置 三 、激活对话中平台对象的PPo请求 四、勾选活动的同步选项 五、定义编码范围 ​编辑 六、 设置客户与供应商的编码范围 一、定义业务伙伴角色 业务伙伴 IMG路径 &#xff1a; 跨应用组件->SAP业务伙伴 -> …