活动介绍

【IT专家揭秘】:20年工作经验提炼出的数据库性能优化大法

立即解锁
发布时间: 2025-05-30 03:32:21 阅读量: 26 订阅数: 24
RAR

数据库性能优化经典教程

star4星 · 用户满意度95%
![ollama 模型国内下载](https://blog.radicalloop.com/uploads/large_language_model_2c210720fe.png) # 1. 数据库性能优化概述 在当今这个数据驱动的时代,数据库性能优化已经成为IT专业人员必须掌握的关键技能。随着业务量的增长,数据量的爆发式增长和用户访问量的急剧上升,如何保证数据库的稳定性和高效性,成为了一个亟待解决的问题。本章节首先概述了性能优化的重要性,接着分析了在不同数据库架构和应用环境下性能瓶颈的常见原因,并提供了性能优化的基本原则和方法论。我们将探讨性能优化的全流程,从理论基础到实际应用,从硬件配置到高级优化策略,旨在为读者构建一个全面的数据库性能优化知识框架。 # 2. 数据库理论基础与性能考量 ### 2.1 数据库的内部架构 #### 2.1.1 存储引擎与事务处理机制 数据库的存储引擎是其核心组件之一,它负责数据的存储和索引,并实现事务处理、并发控制以及数据恢复等关键功能。在不同的数据库管理系统(DBMS)中,存储引擎的表现形式不同,但其核心目的都是为了高效地管理和检索数据。 事务处理机制是数据库管理的一个重要组成部分,它保证了数据的完整性与一致性。事务是一系列操作的集合,这些操作要么全部完成,要么全部不执行。事务的四个主要特性是原子性、一致性、隔离性和持久性,通常简称为ACID。 为了进一步理解存储引擎和事务处理机制如何影响性能,以下是一个基于MySQL数据库的例子: - **InnoDB存储引擎**:这是MySQL中最为常用的存储引擎,它支持事务处理,提供行级锁定和外键约束。InnoDB通过多版本并发控制(MVCC)来提高并发性能,并支持热备份。 代码块示例: ```sql CREATE TABLE transactions ( id INT AUTO_INCREMENT PRIMARY KEY, amount DECIMAL(10,2), transaction_date TIMESTAMP ) ENGINE=InnoDB; ``` 在上述代码中,我们创建了一个使用InnoDB存储引擎的表`transactions`。这个表用于存储事务数据,InnoDB会确保数据的ACID特性。 性能考量: 在设计数据库时,选择合适的存储引擎对于性能至关重要。例如,如果应用程序需要事务支持,选择不支持事务的存储引擎会降低性能。此外,存储引擎的选择还需要考虑索引优化、锁定机制和故障恢复能力等因素。 #### 2.1.2 缓存策略与查询执行计划 数据库系统内部使用缓存来存储查询结果和解析后的执行计划,从而提高查询性能。缓存策略直接影响数据库的响应时间和处理能力,合适的缓存策略可以使数据库在面对复杂查询时表现得更加高效。 查询执行计划是数据库执行SQL语句的步骤说明。优化器根据表的统计信息和索引使用情况来生成执行计划。一个好的执行计划可以大幅度降低查询时间。 以MySQL为例,以下是查询执行计划的一个简单分析: ```sql EXPLAIN SELECT * FROM employees WHERE department_id = 10; ``` 执行上述命令后,我们会得到一个执行计划,其中包含Key、Type、Rows等关键信息,这些信息反映了查询的执行效率和方法。 ### 2.2 索引优化的理论与实践 #### 2.2.1 索引的类型与选择标准 索引是数据库优化中最重要的手段之一,它能够显著提升查询的速度。索引类型包括但不限于B-tree索引、哈希索引、全文索引和空间索引等。选择合适的索引类型对于性能优化至关重要。 选择索引的标准应该基于表的使用模式,包括表的大小、数据分布、查询的类型和频率,以及字段是否经常作为查询条件。例如,主键字段通常会自动建立B-tree索引,因为它必须唯一且有序。 #### 2.2.2 索引维护与性能权衡 尽管索引可以提升查询性能,但也会增加数据插入、更新和删除操作的负担,因为索引也需要维护。因此,在添加索引时需要权衡性能收益与维护成本。 维护索引的成本包括写入性能的下降和磁盘空间的增加。索引设计应该遵循最佳实践,例如避免在经常更新的字段上建立索引,或者根据查询模式合理设计复合索引。 具体实践: 在实际应用中,可以使用索引监控工具来跟踪索引的使用情况。例如,在MySQL中,可以使用`SHOW INDEX`命令来查看表的索引信息。 ```sql SHOW INDEX FROM employees; ``` 通过分析查询日志和索引使用情况,我们可以确定哪些索引是必要的,哪些是冗余的。这有助于进行索引的优化,以达到最优的查询性能。 # 3. 查询优化技术与应用 在数据库的性能优化过程中,查询优化是核心环节之一。一个精心设计的查询可以显著提高数据检索速度,减少资源消耗,而一个低效的查询可能会导致系统性能的急剧下降。本章节将深入探讨SQL查询语句的调优技术,以及规范化与反规范化策略的应用。 ## 3.1 SQL查询语句的调优 ### 3.1.1 识别低效查询 在数据库性能调优之前,首先要能够识别出低效的查询语句。低效查询可能包括以下几个方面: - 使用了过多的JOIN操作,尤其是当表之间没有适当的索引时。 - 过度使用SELECT *,这会导致大量不必要的数据检索。 - 查询中包含复杂的子查询或者函数操作,这会增加处理时间。 - 使用了复杂的WHERE条件,尤其是没有合适的索引支撑的情况下。 为了识别这些低效查询,数据库管理员通常会使用数据库的性能监控工具,如MySQL的慢查询日志。通过分析这些日志中的查询,可以找到那些执行时间过长的SQL语句,并进行进一步的优化。 ### 3.1.2 使用EXPLAIN分析执行计划 在确定了低效查询后,下一步是使用EXPLAIN命令来分析查询的执行计划。EXPLAIN命令可以提供SQL查询的详细执行信息,包括如何查询数据、是否使用了索引以及JOIN的类型等。 例如,考虑以下的SQL查询: ```sql EXPLAIN SELECT * FROM employees WHERE department_id = 10; ``` 执行结果可能包含以下几个关键列: - `type`: 显示查询是如何连接表的,比如`ref`、`range`或`ALL`。 - `possible_keys`: 显示可能用于优化查询的索引。 - `key`: 显示实际被优化器选择的索引。 - `key_len`: 显示被使用的索引的长度。 - `rows`: 估计需要检查的行数。 - `Extra`: 包含不适合其他列的额外信息,如是否使用了临时表。 通过EXPLAIN命令提供的信息,可以对查询进行调优,比如添加缺失的索引、修改JOIN的类型或者重写查询语句以减少不必要的数据检索。 ### 表格与代码块的结合使用 为了更好地展示如何使用EXPLAIN命令,下面给出一个示例表格和对应的SQL查询: | Query Part | Example | Notes | |---------------------|-------------------------|------------------------------------------------------------| | SELECT statement | SELECT * FROM employees | The statement is selecting all columns from the employees table. | | WHERE clause | WHERE department_id = 10 | Filtering the rows to only those with a department_id of 10. | | Index usage | Using index | The query is using an index to optimize the search. | ```sql EXPLAIN SELECT * FROM employees WHERE department_id = 10; ``` 在上述表格中,我们列举了一个简单的SELECT查询以及EXPLAIN命令输出的一个可能结果。通过分析EXPLAIN的输出,可以确定查询是否有效利用了索引,以及是否需要对查询进行优化。 ## 3.2 规范化与反规范化策略 数据库规范化是数据库设计的一个重要原则,它旨在消除数据冗余和维护数据的一致性。然而,在某些情况下,过度规范化可能会导致查询性能低下。反规范化则是在满足业务需求的前提下,为了提高数据库的读写性能而故意引入数据冗余的设计方法。 ### 3.2.1 数据库规范化的基本原则 规范化过程主要遵循以下几个范式: - 第一范式(1NF):确保字段的原子性。 - 第二范式(2NF):在1NF基础上消除非主属性对于码的部分函数依赖。 - 第三范式(3NF):在2NF基础上消除非主属性对于码的传递函数依赖。 - BCNF范式(巴斯-科德范式):在3NF基础上消除主属性对码的部分和传递函数依赖。 规范化可以减少数据冗余,避免数据更新时出现不一致的情况。但是,规范化可能会导致大量的JOIN操作,增加了查询的复杂性和时间成本。 ### 3.2.2 反规范化在性能优化中的应用 反规范化通常是针对特定的应用场景,在权衡读写性能与数据冗余之间的关系后所采取的一种设计策略。反规范化的方法包括: - 增加冗余列:在表中添加额外的冗余列以减少JOIN操作。 - 增加派生列:添加用于快速计算的派生列,如预计算的统计信息。 - 增加汇总表:创建汇总表来存储聚合数据,以加速查询。 - 拆分表:将一个大表拆分为两个或多个小表,以减少单个查询所涉及的数据量。 反规范化的实施需要谨慎,并且应该基于对数据库操作的深入了解。下面是一个反规范化的应用示例: 假设有一个规范化设计的订单系统,其中包含`customers`、`orders`、`order_items`三个表,分别存储客户信息、订单信息和订单详情。如果一个查询需要频繁地联合这三个表以获取客户的订单详情和总金额,这可能会导致性能问题。 ```sql SELECT c.customer_name, SUM(oi.item_total) AS total_sales FROM customers c JOIN orders o ON c.customer_id = o.customer_id JOIN order_items oi ON o.order_id = oi.order_id GROUP BY c.customer_name; ``` 通过反规范化,可以在`orders`表中添加一个`total_sales`字段,该字段存储了订单的总销售额。这样,在查询时就不需要进行三个表的联合操作了。 ```sql SELECT customer_name, total_sales FROM orders; ``` ### Mermaid流程图的使用 为了更清晰地展示规范化和反规范化的决策过程,我们可以使用Mermaid流程图来表示: ```mermaid flowchart TB A[开始] --> B{是否数据更新频繁} B -- 是 --> C[规范化数据模型] B -- 否 --> D[评估查询性能] C --> E{性能是否可接受} D --> F{是否引入冗余} F -- 是 --> G[设计反规范化的数据模型] F -- 否 --> H[保持规范化数据模型] E -- 否 --> G E -- 是 --> I[优化查询或添加索引] G --> J[结束] I --> J H --> J ``` 通过上述流程图,我们可以看到规范化和反规范化是根据业务需求和性能要求作出的动态调整,而不是一成不变的设计原则。 在本章节中,我们详细探讨了SQL查询优化和规范化与反规范化策略的应用。下一章节,我们将继续探讨硬件与系统层面的优化策略。 # 4. 硬件与系统层面的优化 在数据库性能优化的领域中,硬件和系统层面的优化往往是被误解为次要因素的部分。实际上,一个高效运行的数据库系统,其背后往往有着精心设计的硬件配置以及与操作系统之间的紧密协同。本章将深入探讨硬件优化的考量以及操作系统与数据库的协同调优方法,为数据库性能优化提供全面的视角。 ## 4.1 硬件优化的考量 硬件是数据库性能的物理基础,因此硬件的优化是提升数据库系统性能的先决条件。这包括了存储系统性能的影响以及CPU和内存配置对数据库性能的影响。 ### 4.1.1 存储系统的性能影响 存储系统是数据库系统的核心,其性能直接影响到数据库的响应时间。SSD硬盘与传统机械硬盘相比,在随机读写性能上有着显著的优势,而数据的读写速度直接关系到数据库查询和事务处理的速度。在选择存储系统时,除了考虑硬盘类型,还需要考虑RAID级别的配置。RAID 10提供了较好的读写性能和数据冗余,适合对性能和数据安全都有要求的数据库系统。而在成本允许的情况下,使用SSD硬盘并配置RAID 10可以大幅提高数据库的IO性能。 ```markdown 表格:存储系统性能比较 | 存储类型 | 读写速度 | 成本 | 数据安全 | |----------|----------|------|----------| | SSD RAID 10 | 高 | 高 | 高 | | HDD RAID 5 | 中 | 低 | 中 | ``` ### 4.1.2 CPU和内存配置对数据库的影响 CPU的处理能力直接关系到数据库系统能够处理的请求数量,是影响数据库吞吐量的主要因素之一。对于CPU的选择,不仅仅要看核心数和主频,还要考虑缓存大小,缓存越大,能更快地处理更多数据。 内存的大小和速度同样对数据库性能有着直接的影响。数据库系统通常会将大量数据载入内存以供快速访问,因此足够的内存容量是必要的。此外,高频率的内存可以降低延迟,进一步提升数据库的响应速度。 ## 4.2 操作系统与数据库的协同调优 操作系统是数据库的运行环境,其设置可以对数据库的性能产生直接的影响。在优化操作系统与数据库协同工作方面,重要的考量包括操作系统的参数设置和数据库文件系统的配置。 ### 4.2.1 操作系统参数设置 操作系统中的一些关键参数,比如文件描述符的数量、TCP/IP设置、调度算法等,都会影响到数据库的性能。例如,设置合适的文件描述符限制可以避免数据库在高并发情况下的连接数限制问题。TCP/IP设置中的TIME_WAIT状态数量也可能影响到数据库连接的创建速度,需要根据实际应用调整。 ```mermaid graph LR A[操作系统参数] --> B[文件描述符限制] A --> C[TCP/IP设置] A --> D[调度算法] ``` ### 4.2.2 数据库文件系统配置 数据库文件系统配置需要确保数据的读写操作尽可能高效。这包括了文件系统的类型选择(如ext4, XFS等),以及相关挂载选项的配置。例如,在XFS文件系统上,通过开启`nobarrier`挂载选项可以显著提高性能,因为这可以绕过文件系统的写缓存机制,减少IO延迟。 ```markdown 代码块:示例Linux挂载命令 mount -t xfs -o nobarrier /dev/sdb1 /var/lib/mysql ``` 在上述命令中,我们挂载了`/dev/sdb1`分区到`/var/lib/mysql`目录,并且添加了`nobarrier`选项,这对于提高数据库写入性能非常有帮助。 ### 4.2.3 小结 硬件优化与系统层面调优是保证数据库高性能运行的基础。合适的存储系统配置、均衡的CPU和内存选择以及精细的操作系统参数设置,都是确保数据库高效运行的关键步骤。通过以上的分析与介绍,我们不难发现,虽然数据库性能优化包含许多软件层面的技巧和策略,但如果忽视了硬件和系统层面的优化,则无法实现数据库性能的全面提升。下一章节我们将进一步探讨高级性能优化策略,包括分布式数据库性能优化和数据库安全与性能平衡等更深层次的内容。 # 5. 高级性能优化策略 ## 分布式数据库的性能优化 在处理大规模数据和高并发场景时,分布式数据库已成为不可或缺的解决方案。其能够通过分布式的架构分散负载,提高系统的可用性和可扩展性。然而,分布式数据库也带来了新的挑战,需要特别的优化策略来维持高性能。 ### 分布式架构的优势与挑战 分布式数据库打破了传统单体数据库的限制,将数据分布在多个节点上。这种分布式的架构有如下优势: - **高可用性**:通过多个节点提供服务,一个或多个节点的故障不会导致整个系统的停止。 - **可扩展性**:能够通过增加节点来线性扩展系统,从而处理更大的数据量。 - **分布式计算**:可以在多个节点上并行处理数据,提高查询效率。 然而,分布式数据库面临的挑战同样不容忽视: - **数据一致性**:多节点间的数据同步与一致性问题较为复杂。 - **网络开销**:节点间通信需要通过网络,这增加了系统的延迟和网络负担。 - **复杂的配置和管理**:相比单体数据库,分布式数据库的部署和维护更加复杂。 ### 负载均衡与数据一致性策略 为了优化分布式数据库的性能,通常需要考虑以下策略: #### 负载均衡 负载均衡能够分散访问请求到多个节点,避免单点压力过大。策略包括: - **静态负载均衡**:根据预设的规则,如权重、节点顺序等分配请求。 - **动态负载均衡**:根据实时系统负载动态调整请求分配。 #### 数据一致性策略 为了确保数据的一致性,可以采取以下策略: - **最终一致性模型**:允许系统在一段时间内处于不一致的状态,但保证最终一致。 - **两阶段提交(2PC)**:保证事务的原子性,适用于对一致性要求较高的场景。 - **向量时钟或版本向量**:跟踪数据变更历史,帮助解决并发更新冲突。 ## 数据库安全与性能平衡 数据库系统中,安全性是不可忽视的因素。但是,过度的安全措施可能会影响性能。因此,我们需要在保证安全的同时,尽可能减少对性能的影响。 ### 审计与监控 审计和监控是数据库安全的重要组成部分,但也带来了额外的性能开销。以下是一些优化建议: - **选择性审计**:根据业务需求,只对重要数据和操作进行审计记录。 - **异步监控**:将监控数据异步写入日志文件,减少对实时性能的影响。 ### 安全措施对性能的影响与优化 数据库的安全措施,如加密、访问控制等,通常会增加CPU的运算负担。以下是一些优化策略: - **硬件加速**:利用具有硬件加密功能的硬件,如TPM(Trusted Platform Module)来减轻CPU负担。 - **批量处理**:对于安全相关的批量操作,如加密文件系统操作,采用批量处理来减少调用次数。 - **缓存机制**:对于频繁访问的数据,使用缓存可以减少加密和解密操作的次数。 通过对上述策略的优化,可以有效地在保证数据库系统安全的同时,也保障其性能的最优。 在本章中,我们探讨了分布式数据库和数据库安全的性能优化策略。这些高级策略有助于在复杂的数据库环境中实现最佳的性能表现。优化是一个持续的过程,需要根据实际的业务需求和环境不断地进行调整和改进。
corwn 最低0.47元/天 解锁专栏
赠100次下载
点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

SW_孙维

开发技术专家
知名科技公司工程师,开发技术领域拥有丰富的工作经验和专业知识。曾负责设计和开发多个复杂的软件系统,涉及到大规模数据处理、分布式系统和高性能计算等方面。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看

最新推荐

编程中的数组应用与实践

### 编程中的数组应用与实践 在编程领域,数组是一种非常重要的数据结构,它可以帮助我们高效地存储和处理大量数据。本文将通过几个具体的示例,详细介绍数组在编程中的应用,包括图形绘制、随机数填充以及用户输入处理等方面。 #### 1. 绘制数组图形 首先,我们来创建一个程序,用于绘制存储在 `temperatures` 数组中的值的图形。具体操作步骤如下: 1. **创建新程序**:选择 `File > New` 开始一个新程序,并将其保存为 `GraphTemps`。 2. **定义数组和画布大小**:定义一个 `temperatures` 数组,并设置画布大小为 250 像素×250 像

AWSLambda冷启动问题全解析

### AWS Lambda 冷启动问题全解析 #### 1. 冷启动概述 在 AWS Lambda 中,冷启动是指函数实例首次创建时所经历的一系列初始化步骤。一旦函数实例创建完成,在其生命周期内不会再次经历冷启动。如果在代码中添加构造函数或静态初始化器,它们仅会在函数冷启动时被调用。可以在处理程序类的构造函数中添加显式日志,以便在函数日志中查看冷启动的发生情况。此外,还可以使用 X-Ray 和一些第三方 Lambda 监控工具来识别冷启动。 #### 2. 冷启动的影响 冷启动通常会导致事件处理出现延迟峰值,这也是人们关注冷启动的主要原因。一般情况下,小型 Lambda 函数的端到端延迟

ApacheThrift在脚本语言中的应用

### Apache Thrift在脚本语言中的应用 #### 1. Apache Thrift与PHP 在使用Apache Thrift和PHP时,首先要构建I/O栈。以下是构建I/O栈并调用服务的基本步骤: 1. 将传输缓冲区包装在二进制协议中,然后传递给服务客户端的构造函数。 2. 构建好I/O栈后,打开套接字连接,调用服务,最后关闭连接。 示例代码中的异常捕获块仅捕获Apache Thrift异常,并将其显示在Web服务器的错误日志中。 PHP错误通常在Web服务器的上下文中在服务器端表现出来。调试PHP程序的基本方法是检查Web服务器的错误日志。在Ubuntu 16.04系统中

Hibernate:从基础使用到社区贡献的全面指南

# Hibernate:从基础使用到社区贡献的全面指南 ## 1. Hibernate拦截器基础 ### 1.1 拦截器代码示例 在Hibernate中,拦截器可以对对象的加载、保存等操作进行拦截和处理。以下是一个简单的拦截器代码示例: ```java Type[] types) { if ( entity instanceof Inquire) { obj.flushDirty(); return true; } return false; } public boolean onLoad(Object obj, Serial

JavaEE7中的MVC模式及其他重要模式解析

### Java EE 7中的MVC模式及其他重要模式解析 #### 1. MVC模式在Java EE中的实现 MVC(Model-View-Controller)模式是一种广泛应用于Web应用程序的设计模式,它将视图逻辑与业务逻辑分离,带来了灵活、可适应的Web应用,并且允许应用的不同部分几乎独立开发。 在Java EE中实现MVC模式,传统方式需要编写控制器逻辑、将URL映射到控制器类,还需编写大量的基础代码。但在Java EE的最新版本中,许多基础代码已被封装好,开发者只需专注于视图和模型,FacesServlet会处理控制器的实现。 ##### 1.1 FacesServlet的

Clojure多方法:定义、应用与使用场景

### Clojure 多方法:定义、应用与使用场景 #### 1. 定义多方法 在 Clojure 中,定义多方法可以使用 `defmulti` 函数,其基本语法如下: ```clojure (defmulti name dispatch-fn) ``` 其中,`name` 是新多方法的名称,Clojure 会将 `dispatch-fn` 应用于方法参数,以选择多方法的特定实现。 以 `my-print` 为例,它接受一个参数,即要打印的内容,我们希望根据该参数的类型选择特定的实现。因此,`dispatch-fn` 需要是一个接受一个参数并返回该参数类型的函数。Clojure 内置的

设计与实现RESTfulAPI全解析

### 设计与实现 RESTful API 全解析 #### 1. RESTful API 设计基础 ##### 1.1 资源名称使用复数 资源名称应使用复数形式,因为它们代表数据集合。例如,“users” 代表用户集合,“posts” 代表帖子集合。通常情况下,复数名词表示服务中的一个集合,而 ID 则指向该集合中的一个实例。只有在整个应用程序中该数据类型只有一个实例时,使用单数名词才是合理的,但这种情况非常少见。 ##### 1.2 HTTP 方法 在超文本传输协议 1.1 中定义了八种 HTTP 方法,但在设计 RESTful API 时,通常只使用四种:GET、POST、PUT 和

响应式Spring开发:从错误处理到路由配置

### 响应式Spring开发:从错误处理到路由配置 #### 1. Reactor错误处理方法 在响应式编程中,错误处理是至关重要的。Project Reactor为其响应式类型(Mono<T> 和 Flux<T>)提供了六种错误处理方法,下面为你详细介绍: | 方法 | 描述 | 版本 | | --- | --- | --- | | onErrorReturn(..) | 声明一个默认值,当处理器中抛出异常时发出该值,不影响数据流,异常元素用默认值代替,后续元素正常处理。 | 1. 接收要返回的值作为参数<br>2. 接收要返回的值和应返回默认值的异常类型作为参数<br>3. 接收要返回

在线票务系统解析:功能、流程与架构

### 在线票务系统解析:功能、流程与架构 在当今数字化时代,在线票务系统为观众提供了便捷的购票途径。本文将详细解析一个在线票务系统的各项特性,包括系统假设、范围限制、交付计划、用户界面等方面的内容。 #### 系统假设与范围限制 - **系统假设** - **Cookie 接受情况**:互联网用户不强制接受 Cookie,但预计大多数用户会接受。 - **座位类型与价格**:每场演出的座位分为一种或多种类型,如高级预留座。座位类型划分与演出相关,而非个别场次。同一演出同一类型的座位价格相同,但不同场次的价格结构可能不同,例如日场可能比晚场便宜以吸引家庭观众。 -

并发编程:多语言实践与策略选择

### 并发编程:多语言实践与策略选择 #### 1. 文件大小计算的并发实现 在并发计算文件大小的场景中,我们可以采用数据流式方法。具体操作如下: - 创建两个 `DataFlowQueue` 实例,一个用于记录活跃的文件访问,另一个用于接收文件和子目录的大小。 - 创建一个 `DefaultPGroup` 来在线程池中运行任务。 ```plaintext graph LR A[创建 DataFlowQueue 实例] --> B[创建 DefaultPGroup] B --> C[执行 findSize 方法] C --> D[执行 findTotalFileS