文章目录
- 前言
- 五、持久化全局变量
- 5.1 持久化全局变量特点
- 5.2 持久化全局变量实例
- 5.3 持久化全局变量注意事项
- 六、降序索引(Descending Indexes)
- 6.1 降序索引(Descending Indexes)特点
- 6.2 降序索引(Descending Indexes)实例
- 6.3 降序索引(Descending Indexes)注意事项
- 七、字符集默认为 utf8mb4
- 7.1 字符集默认为 utf8mb4特点
- 7.2 字符集默认为 utf8mb4实例
- 7.3 字符集默认为 utf8mb4注意事项
- 八、安全性增强
- 九、备份锁(Backup Locks)
- 9.1 备份锁(Backup Locks)特点
- 9.2 备份锁(Backup Locks)实例
- 9.3 备份锁(Backup Locks)注意事项
- 十、GIS 功能改进详解
- 十一、资源管理和限制
- 十二、事务性数据字典
- 12.1 事务性数据字典特点
- 12.2 事务性数据字典注意事项
- 献给读者
前言
在这个信息爆炸的时代,数据已经成为我们生活中不可或缺的一部分。无论你是社交媒体的重度使用者、企业中的数据分析员,还是软件开发工程师,都不可避免地与各种各样的数据库打交道。而在众多的关系型数据库管理系统(RDBMS
)中,MySQL
以其开源性、易用性和强大的功能脱颖而出,成为了最受欢迎的选择之一。
但你知道吗?MySQL
不仅仅是一个传统的数据库系统;它一直在进化,不断地引入令人兴奋的新特性和改进,以适应日益增长的数据需求和技术挑战。想象一下,就像一艘宇宙飞船,在浩瀚的数据星空中航行,每一次升级都是对引擎的一次优化,让它飞得更快、更远。而MySQL 8.x
版本系列就像是给这艘飞船装上了超级推进器,准备带你进入一个全新的探索之旅。
从过去到现在
回顾历史,MySQL
自1995年首次发布以来,已经走过了漫长的路程。最初,它的目标是提供一个快速、可靠且易于使用的数据库解决方案。随着时间的发展,MySQL
逐渐成长为支持全球数百万应用的核心技术之一。然而,随着互联网的发展和大数据时代的到来,传统的关系型数据库面临着前所未有的挑战。用户需要处理更大规模的数据集,执行更加复杂的查询操作,并确保数据的安全性和一致性。面对这些需求,MySQL没有停滞不前,而是选择了拥抱变化,不断创新。
迈向未来
那么,MySQL
是如何应对这些挑战的呢?答案在于其不断推出的创新特性。例如,MySQL 8.0引入了窗口函数(Window Functions
),这一功能让开发者能够以前所未有的方式分析数据。你可以轻松地计算排名、移动平均值或累计总和,而无需编写复杂的子查询。这就像是为你的SQL工具箱添加了一把瑞士军刀,让你在处理复杂业务逻辑时游刃有余。
不仅如此,MySQL
还增强了对JSON
的支持。在当今的世界里,非结构化数据越来越普遍,无论是日志文件、社交媒体帖子还是物联网设备生成的信息,都可以方便地存储和查询。通过使用JSON
数据类型和相关函数,你可以高效地管理和检索半结构化数据,为应用程序带来更大的灵活性。
此外,MySQL 8.x
还带来了许多其他激动人心的功能,比如公用表表达式(Common Table Expressions, CTEs
)、持久化的全局变量设置、角色管理以及资源管理等。每一个新特性都是为了帮助你更好地管理和利用数据,提升工作效率的同时也保障了系统的稳定性和安全性。
探索之旅
在这篇博客文章中,我们将一起深入探讨MySQL 8.x
版本中的一些关键新特性。我们将揭开它们背后的秘密,了解如何将这些强大的工具应用到实际工作中去。无论是想要提高查询性能,还是寻求更高级别的安全措施,亦或是希望简化日常维护任务,你都能在这里找到答案。
让我们开始这段奇妙的旅程吧!准备好迎接那些改变游戏规则的技术,学习如何充分利用MySQL
提供的最新功能来解决现实世界中的问题。记住,最好的还在后面——因为正如科技界常说的那样,“唯一不变的就是变化本身”。而MySQL
正是这场变革中最耀眼的明星之一,引领着我们走向一个充满无限可能的未来。所以,系好安全带,打开你的想象力,跟我们一起踏上这条通往数据巅峰的道路吧!
MySQL
不断演进,引入了许多新特性和改进。截至2025年初,MySQL
的最新稳定版本中包含了一系列增强功能和新增特性。本文我们将详细介绍MySQL
中的一些重要新属性和功能。
五、持久化全局变量
5.1 持久化全局变量特点
- 持久性:通过使用
SET PERSIST
命令来设置全局变量,其值会被写入到数据目录下的mysqld-auto.cnf
文件中,确保在MySQL
服务重启之后仍然有效。 - 动态调整:可以在不重启
MySQL
服务器的情况下动态地修改某些系统变量,并且这些更改会自动保存,以便在下次启动时应用。 - 灵活性:提供了两种方式来实现持久化设置:
使用SET PERSIST
:永久改变某个系统变量的值,并将其保存到配置文件中。
使用SET PERSIST_ONLY
:只将变量的新值写入配置文件而不实际改变当前会话中的变量值。
5.2 持久化全局变量实例
- 使用 SET PERSIST 设置变量
SET PERSIST max_connections = 500;
这条命令不仅立即改变了 max_connections 的值,还更新了 mysqld-auto.cnf 文件,以确保该设置在下一次启动时也会生效。
- 查看持久化设置 可以通过查询
performance_schema.persisted_variables
表来查看已经设置的持久化变量:
SELECT * FROM performance_schema.persisted_variables;
- 移除持久化设置 若要取消一个持久化设置,可以使用
RESET PERSIST
命令:
RESET PERSIST max_connections;
此操作会从 mysqld-auto.cnf
文件中删除相应的条目,但不会影响当前正在运行的服务器实例中的变量值。
5.3 持久化全局变量注意事项
- 不是所有全局变量都支持持久化设置;一些关键参数可能仍需手动编辑配置文件。
- 在进行持久化设置前,建议先了解相关变量的作用及其合理范围,避免因不当设置导致数据库性能下降或其他问题。
- 虽然持久化设置提供了一种便捷的方式来管理 MySQL 配置,但在生产环境中进行任何更改之前都应该谨慎评估并备份现有配置。
💡贴士:在
MySQL 8.0
之前,全局系统变量的修改是暂时性的,即这些修改仅在当前MySQL
实例运行期间有效。一旦服务器重启,所有的全局变量都会恢复到默认值或配置文件中指定的值。MySQL 8.0
引入了持久化全局变量的功能,允许用户将对全局变量的修改保存下来,即使数据库重启后这些设置依然保持不变。
六、降序索引(Descending Indexes)
6.1 降序索引(Descending Indexes)特点
- 更高效的排序操作:使用降序索引可以避免额外的排序步骤。当查询要求结果按照某一列或几列的降序排列时,如果存在相应的降序索引,
MySQL
可以直接利用该索引来获取已排序的数据,而无需执行额外的排序操作。 - 支持混合排序方向:降序索引不仅限于全部列都按降序排列,还可以与其他升序排列的列组合使用。例如,在一个多列索引中,部分列可以设置为降序排列,其余列为升序排列,这样可以根据实际查询需求来优化索引设计。
- 提高查询性能:通过精确匹配查询所需的排序顺序,可以显著提升涉及
ORDER BY
子句的查询性能,特别是在处理大数据集时效果尤为明显。
6.2 降序索引(Descending Indexes)实例
要创建一个包含降序索引的表,可以在定义索引时明确指定列的排序方向。以下是创建带有降序索引的例子:
CREATE TABLE example (id INT NOT NULL,name VARCHAR(50),score INT,PRIMARY KEY (id),INDEX idx_score_name (score DESC, name ASC)
);
在这个例子中,idx_score_name
索引首先根据 score
列进行降序排列,然后在 score
相同的情况下,根据 name
列进行升序排列。
也可以通过 ALTER TABLE
或 CREATE INDEX
语句添加降序索引:
ALTER TABLE example ADD INDEX idx_name_desc (name DESC);
或是:
CREATE INDEX idx_name_desc ON example(name DESC);
6.3 降序索引(Descending Indexes)注意事项
尽管降序索引提供了一种强大的工具来优化查询性能,但在实际应用中还需注意以下几点:
- 索引选择性:确保所创建的索引具有良好的选择性,即能够有效地减少查询扫描的数据量。
- 维护成本:索引会增加插入、更新和删除操作的成本,因为每次这些操作发生时都需要相应地更新索引。
- 适用场景:并非所有查询都能从降序索引中受益。分析你的查询模式,确定哪些情况下使用降序索引能带来最大的性能增益。
💡贴士:降序索引是
MySQL 8.0
中的一个重要特性,它为优化查询性能提供了新的可能性,尤其是在需要对数据进行排序的场合。正确地识别和应用降序索引可以帮助你更高效地管理和查询大型数据集。
七、字符集默认为 utf8mb4
在 MySQL 8.0 中,默认字符集从 utf8(实际上是 utf8mb3,即最多支持3字节的UTF-8字符)变更为 utf8mb4。utf8mb4 是一种能够存储更多字符集的编码方式,它完全兼容 utf8(utf8mb3),但额外支持了更多的字符,包括但不限于表情符号(Emojis)、以及其他需要4字节表示的Unicode字符。
7.1 字符集默认为 utf8mb4特点
- 更广泛的字符覆盖:
utf8mb4
支持完整的Unicode
字符集,包括那些需要4字节存储空间的字符,如许多表情符号和其他特殊符号。相比之下,utf8
(准确来说是utf8mb3
)只能正确存储基本多语言平面(Basic Multilingual Plane, BMP
)内的字符,即仅限于3字节以内的字符。 - 未来证明:随着互联网的发展和全球化的推进,越来越多的应用程序需要支持各种语言和地区特有的字符。使用
utf8mb4
可以确保数据库在未来也能很好地适应新的字符需求,无需进行重大更改。 - 与现代应用的需求相符:很多现代应用程序,特别是社交媒体平台、聊天应用等,大量使用了表情符号和其他非
BMP
字符。为了更好地支持这些内容,采用utf8mb4
成为必要选择。
7.2 字符集默认为 utf8mb4实例
- 创建新表时指定字符集: 当创建新表时,可以明确指定使用
utf8mb4
字符集:
CREATE TABLE example (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 修改现有表的字符集: 如果你有一个已经存在的表,并希望将其转换为
utf8mb4
,可以使用如下命令:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 设置服务器或数据库级别默认字符集: 若要在整个数据库或
MySQL
服务器级别上设置默认字符集为utf8mb4
,可以在配置文件(如my.cnf
或my.ini
)中添加以下配置:
7.3 字符集默认为 utf8mb4注意事项
- 索引长度限制:由于每个字符可能占用多达4个字节的空间,在设计表结构时需要特别注意索引长度的限制。例如,对于
InnoDB
存储引擎,默认情况下单列索引的最大长度为767字节。如果使用utf8mb4
,这意味着索引前缀长度将受到更大限制。 - 连接字符集:确保客户端与服务器之间的连接也使用
utf8mb4
编码,否则可能会遇到字符显示问题。可以通过设置连接字符集来解决这个问题:
SET NAMES utf8mb4;
💡贴士:
MySQL 8.0
默认使用utf8mb4
字符集是一个重要的改进,它增强了对多样化字符的支持,满足了现代应用开发中的多种需求。然而,在实施过程中也需要关注相关注意事项,以确保最佳实践。
八、安全性增强
MySQL 8.x 在安全性方面进行了多项增强,旨在保护数据库免受未授权访问、提高数据保密性和完整性,并为用户提供更安全的数据库环境。以下是一些关键的安全性增强措施:
- 默认安全配置
- MySQL 8.x 默认启用了更强的安全设置,包括更严格的密码策略和默认禁用不安全的功能(如旧版的身份验证插件)。
- 安装过程中会自动运行 mysql_secure_installation 脚本,帮助用户快速设置 root 密码、移除匿名用户、禁止 root 远程登录等。
- 密码管理改进
- 更强的密码策略:MySQL 8.x 支持了更为复杂的密码策略,例如要求密码长度至少为8个字符、包含大小写字母、数字及特殊字符等。
- 密码历史和过期:管理员可以设置密码历史记录,防止用户重复使用旧密码,并设定密码有效期,强制用户定期更改密码。
- 双倍SHA-256(caching_sha2_password):这是 MySQL 8.0 引入的新默认身份验证插件,提供比之前版本使用的 mysql_native_password 更高的安全性。
- 角色支持
- MySQL 8.x 引入了对数据库角色的支持,允许创建具有特定权限的角色并将这些角色分配给用户。这简化了权限管理和维护工作,同时减少了因权限过度分配带来的风险。
- SQL 数据加密
- 透明数据加密(TDE):虽然不是所有版本都支持,但企业版提供了对表空间级别的加密功能,保护存储在磁盘上的数据。
- 传输层安全(TLS/SSL):增强了对 TLS 协议的支持,确保客户端与服务器之间通信的安全性。
- 审计日志
- 提供了内置的审计日志功能,能够记录数据库的各种活动,这对于检测潜在的安全威胁非常重要。管理员可以根据需要定制哪些事件应该被记录。
- 资源限制
- MySQL 8.x 允许基于用户或角色来限制资源使用,比如每小时的最大查询数量、连接数等,有助于防御拒绝服务攻击(DoS)。
- 备份锁
- 引入了轻量级的备份锁机制,使得在线备份时可以在不影响读写操作的情况下获取一致性的快照,提高了数据完整性和可用性。
- 增强的数据字典
- MySQL 8.x 的事务性数据字典不仅提升了元数据管理的一致性和可靠性,也间接地增强了安全性,因为所有的元数据变更都被事务所管理,保证了原子性和持久性。
九、备份锁(Backup Locks)
在 MySQL 8.0
中,引入了备份锁作为一种轻量级的锁定机制,旨在简化在线备份过程中的数据一致性问题。传统上,在进行热备份时,为了确保数据的一致性,通常需要使用全局读锁(FLUSH TABLES WITH READ LOCK
),这会阻塞所有写操作直到备份完成,对于高并发的应用来说,这种做法可能会影响性能甚至导致服务中断。而备份锁提供了一种更灵活的方式来解决这个问题。
9.1 备份锁(Backup Locks)特点
备份锁允许你执行一些关键的操作,如快照备份,同时尽量减少对正常数据库操作的影响。具体而言:
- 备份锁不会阻止其他事务的读写操作:这意味着在持有备份锁的同时,其他客户端仍然可以执行插入、更新和删除等操作。
- 防止表结构变更:当一个会话获取了备份锁后,它将阻止其他会话执行可能导致备份不一致的操作,例如 DDL(数据定义语言)操作(创建或删除表等)。这样就可以确保在整个备份过程中,表结构保持不变。
9.2 备份锁(Backup Locks)实例
使用备份锁主要涉及两个步骤:获取锁和释放锁。
- 获取备份锁 使用 LOCK INSTANCE FOR BACKUP 命令来获取备份锁:
LOCK INSTANCE FOR BACKUP;
这个命令会在整个实例级别上获取锁,阻止任何可能影响备份一致性的DDL操作。
- 释放备份锁 在完成备份之后,应尽快释放备份锁以恢复正常操作。使用以下命令释放锁:
UNLOCK INSTANCE;
9.3 备份锁(Backup Locks)注意事项
- 与复制的兼容性:如果您的数据库配置了主从复制,请注意备份锁可能会对复制产生一定的影响。例如,如果在主服务器上执行备份锁期间进行了某些DDL操作,则这些操作会被推迟到锁被释放之后才执行,这可能会导致延迟。
- 与存储引擎的关系:备份锁主要用于InnoDB存储引擎,因为它是为支持事务而设计的,并且能够很好地处理并发读写请求。对于MyISAM这样的非事务性存储引擎,仍需依赖传统的全局读锁来保证备份的一致性。
- 工具支持:一些现代的备份工具已经集成了对备份锁的支持,使得用户可以在不影响业务运行的情况下进行高效的在线备份。
💡贴士:通过使用备份锁,MySQL提供了一种更为高效的方法来实现在线备份,特别是在需要保持高可用性和高性能的环境中,这种方式可以帮助减少备份过程中的停机时间和性能影响。然而,正确理解其工作原理及限制条件是确保成功实施备份策略的关键。
十、GIS 功能改进详解
MySQL 自8.0版本开始,对其地理信息系统(GIS, Geographic Information System)功能进行了显著的改进和增强。这些改进使得 MySQL 在处理空间数据方面更加高效、灵活,并且更符合现代应用的需求。以下是 MySQL 8.x 中 GIS 功能的一些重要改进:
- 支持更多的空间参考系统(SRSs)
- MySQL 8.0 引入了对超过5000个空间参考系统的支持,包括 EPSG 标准中的坐标系。这意味着用户可以更容易地将 MySQL 集成到使用不同地理坐标系统的应用程序中。
- 支持地球坐标系(如 WGS 84)以及投影坐标系,允许进行精确的空间分析。
- 地理计算的精度提高
- MySQL 现在支持更高精度的空间计算,这对于需要精确地理信息的应用至关重要。
- 提供了对地理对象的距离、面积等属性的精确计算方法,比如使用球面模型而非平面模型来计算地球上两点之间的距离。
- 改进的空间索引
- MySQL 8.0 引入了基于 R-Tree 的空间索引支持,这大大提高了涉及空间数据查询的性能。
支持创建空间索引来加速复杂的地理查询,如查找位于特定区域内的所有点或计算两个几何体之间的关系。
- 增强的 ST_ 函数集
- MySQL 扩展了其内置的空间函数库,增加了许多新的 ST_ 开头的函数,用于执行各种空间操作,例如:
ST_Distance_Sphere()
和ST_Distance_Spheroid()
:用于计算球面上两点之间的距离。ST_Buffer()
:生成围绕给定几何图形的一个缓冲区。ST_Centroid()
:返回几何对象的质心。
这些函数增强了 MySQL 处理复杂空间分析任务的能力。
- JSON 文档与空间数据的结合
- MySQL 8.0 允许在 JSON 文档中存储空间数据,并提供了相应的函数来解析和操作这些数据。这种能力使得开发人员可以更灵活地管理和查询包含地理位置信息的数据集。
- 更好的兼容性和标准遵循
- MySQL 8.0 增强了对 OpenGIS 规范的支持,确保其空间功能与其他数据库系统具有良好的互操作性。
- 提高了对 SQL/MM Part 3: Spatial 的遵从度,这是一个关于空间数据库的标准。
💡贴士:MySQL 显著提升了其作为地理信息系统后端的能力,使其能够更好地服务于地图服务、位置追踪、物流规划等领域。对于开发者而言,这意味着可以利用 MySQL更加有效地构建和管理依赖于空间数据的应用程序。
十一、资源管理和限制
资源管理与限制的主要方面
- 账户资源限制
MySQL 允许为每个用户账户设置资源使用限制,包括每小时最大查询数、更新次数、连接次数等。这些限制有助于防止滥用或误用数据库资源。
- 设置资源限制:
CREATE USER 'user_name'@'host_name' WITH MAX_QUERIES_PER_HOUR 20
MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5
MAX_USER_CONNECTIONS 2;
或者对于已有的用户,可以使用 ALTER USER 来调整这些限制。
-
并发连接控制
通过配置 max_connections 系统变量,可以控制同时连接到 MySQL 服务器的最大客户端数量。此外,还可以设置每个用户的最大并发连接数(MAX_USER_CONNECTIONS),以避免单个用户占用过多资源。 -
临时表空间限制
MySQL 提供了对临时表空间使用的限制,可以通过设置 tmp_table_size 和 max_heap_table_size 变量来控制内存中临时表的最大尺寸。如果超过设定大小,则会自动转换为磁盘上的临时表。 -
InnoDB 缓冲池管理
InnoDB 存储引擎使用缓冲池来缓存数据页和索引页,以减少磁盘 I/O。管理员可以通过调整 innodb_buffer_pool_size 来优化内存使用,适应不同规模的工作负载。MySQL 8.x 还支持多个缓冲池实例,可以帮助减少锁竞争。 -
查询缓存
尽管 MySQL 8.0 已经移除了查询缓存特性,但在之前的版本中,它允许将查询结果存储在内存中以便快速检索。考虑到这一点,在升级到 MySQL 8.x 或设计新系统时需要寻找其他方法来优化重复查询的性能,如使用适当的索引或应用程序级别的缓存机制。 -
性能模式 (Performance Schema)
性能模式是一个强大的工具,用于监控 MySQL 服务器的内部执行情况,包括资源消耗。它可以用来收集关于线程、锁、I/O 操作等方面的详细信息,帮助诊断性能瓶颈。 -
资源组 (Resource Groups)
MySQL 8.0 引入了一个新的特性——资源组,它允许创建不同的资源组,并将线程分配给特定的组,以控制 CPU 和 I/O 资源的使用优先级。这对于多租户环境或者有不同优先级任务的应用程序特别有用。
- 创建资源组:
CREATE RESOURCE GROUP mygroup TYPE = USER VCPU_IDS = 1-3 PRIORITY = 30;
然后可以将特定的线程分配给该资源组。
💡贴士:通过上述资源管理和限制措施,数据库管理员可以根据业务需求灵活调整 MySQL的资源配置,既保证了服务的质量,又避免了资源浪费或过度使用的问题。这对于维护高效、稳定运行的数据库环境至关重要。
十二、事务性数据字典
MySQL 8.0 引入了事务性数据字典,这是一个重要的架构改进,它将元数据存储从传统的文件系统迁移到 InnoDB 存储引擎中。这一变化带来了诸多好处,包括增强的数据一致性、简化了元数据管理,并为数据库提供了更强大的功能支持。
12.1 事务性数据字典特点
- 完全事务支持:
在 MySQL 8.0 之前,元数据更改不是原子性的,这意味着如果在修改过程中发生错误,可能会导致元数据不一致。通过将元数据存储在 InnoDB 中,所有对元数据的更改现在都是事务性的,确保了原子性、一致性、隔离性和持久性(ACID 属性)。这使得即使在复杂的多步骤操作中也能保证元数据的一致性。 - 集中化存储:
以前版本的 MySQL 将元数据分散存储在多个地方,如 .frm 文件、.par 文件等。MySQL 8.0 将所有元数据统一存储在 InnoDB 表空间内,简化了管理和维护工作。 - 更好的并发控制:
使用 InnoDB 来管理数据字典提高了对元数据访问的并发处理能力。InnoDB 的行级锁定机制减少了在执行 DDL(数据定义语言)操作时的阻塞情况,从而提升了整体性能和响应速度。 - 增强的安全性:
数据字典表本身也是受权限保护的,只有具有特定权限的用户才能直接访问这些表,增加了安全性。 - 扩展性和灵活性:
新的数据字典设计允许更容易地添加新的特性和改进现有功能,因为它提供了一个更加灵活的基础架构来处理元数据的变化。 - 与复制的更好集成:
由于所有元数据变更都作为事务的一部分被记录到二进制日志中,因此可以更好地支持主从复制环境下的数据同步。
12.2 事务性数据字典注意事项
- 升级考虑:从旧版本升级到 MySQL 8.0 时,必须注意数据字典的迁移过程。这个过程是自动化的,但在升级前应仔细阅读官方文档并备份数据。
- 性能影响:尽管事务性数据字典改善了许多方面,但它也可能对某些类型的查询或操作产生轻微的性能开销。了解这些潜在的影响对于优化数据库配置非常重要。
- 工具兼容性:随着数据字典结构的变化,一些第三方工具可能需要更新以适应新格式。确保使用的任何外部工具都与 MySQL 8.0 兼容。
💡贴士:通过采用事务性数据字典,MySQL 8.0不仅增强了系统的健壮性和可靠性,也为未来的发展奠定了坚实的基础。这对于企业级应用尤其重要,因为它们通常需要处理大量的并发请求并且对数据一致性和完整性有严格要求。
献给读者
💯 计算机技术的世界浩瀚无垠,充满了无限的可能性和挑战,它不仅是代码与算法的交织,更是梦想与现实的桥梁。无论前方的道路多么崎岖不平,希望你始终能保持那份初心,专注于技术的探索与创新,用每一次的努力和进步书写属于自己的辉煌篇章。
🏰在这个快速发展的数字时代,愿我们都能成为推动科技前行的中坚力量,不忘为何出发,牢记心中那份对技术执着追求的热情。继续前行吧,未来属于那些为之努力奋斗的人们。
亲,码字不易,动动小手,欢迎 点赞 ➕ 收藏,如 🈶 问题请留言(评论),博主看见后一定及时给您答复,💌💌💌