超详细:数据库的基本架构
MySQL基础架构
下面这个图是我给出的一个MySQL基础架构图,可以清楚的了解到SQL语句在MySQL的各个模块进行执行过程。
然后MySQL可以分为两个部分,一个是server层,另一个是存储引擎。
server层
Server层涵盖了MySQL的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等)。所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。Server层主要包括以下几个组件:
连接器
连接器:是一种用于建立和管理与MySQL数据库连接的软件组件。它充当应用程序与MySQL数据库之间的桥梁,允许应用程序执行查询、插入、更新和删除数据等数据库操作。连接器的主要功能包括:
- 连接建立:应用程序通过连接器提供的接口和MySQL服务器建立TCP连接,并配置连接参数,如主机名、端口、用户名和密码。
- 身份验证:连接建立后,MySQL服务器会验证应用程序提供的用户名和密码,以确定是否允许连接。
- 会话管理:一旦连接建立和验证成功,连接器会创建一个会话,该会话用于存储连接状态信息和执行SQL语句。
- SQL执行:应用程序可以通过连接器发送SQL查询和命令,连接器将这些请求传递给MySQL服务器进行处理。
- 结果返回:MySQL服务器执行SQL查询后,连接器负责将结果集返回给应用程序,以便应用程序处理查询结果。
- 事务管理:连接器还负责管理数据库事务,包括事务的开始、提交和回滚。
优点与注意事项:
使用MySQL连接器的优点包括:
- 安全性:连接器提供了安全的数据库连接方式,支持身份验证和权限管理。
- 高效性:连接器允许应用程序与MySQL数据库高效通信,执行各种数据库操作。
- 连接池支持:连接器支持连接池技术,提高了连接的重复利用和性能。
然而,在使用MySQL连接器时,也需要注意以下事项:
- 连接管理:连接建立和关闭需要时间,如果频繁连接和断开,可能会影响性能。因此,需要合理管理连接,如使用连接池来管理连接。
- 资源占用:长时间保持连接可能导致资源占用问题。因此,需要定期关闭连接以释放资源。
- 异常处理:在使用连接器时,需要谨慎处理连接参数和异常,避免泄露敏感信息或导致数据库操作失败。
总结:
负责跟客户端建立连接、获取权限、维持和管理连接。每个客户端连接到MySQL时,都会创建一个对应的连接器。连接命令中的mysql是客户端工具,用来跟服务端建立连接。连接服务包含本地socket通信和基于客户端/服务端工具实现的类似TCP/IP的通信。主要完成一些类似于连接处理、授权认证及相关的安全方案。
查询缓存
查询缓存:是MySQL中的一个内存区域,用于存储SELECT查询的结果集。当客户端发起一个SELECT查询时,MySQL会首先检查查询缓存中是否存在相同的查询及其结果集。如果找到,MySQL会直接返回缓存中的结果,而无需再次执行查询,从而大大提高查询效率。
MySQL查询缓存的工作原理基于哈希表(Hash Table)的映射关系。当客户端发起一个SELECT查询时,MySQL会执行以下步骤:
- 计算哈希值:MySQL会根据查询语句、查询的数据库、客户端协议版本等因素计算出一个哈希值。
- 查找缓存:使用这个哈希值在查询缓存中查找是否有相同的查询及其结果集。
- 权限检查:如果找到匹配的查询,MySQL会检查用户的权限,如果权限允许,则直接返回缓存中的结果。
- 执行查询:如果没有找到匹配的查询,MySQL会执行查询,并将查询结果存入查询缓存中,以便后续相同的查询可以复用。
配置与优化:
- 开启或关闭查询缓存:在MySQL的配置文件中,通过设置
query_cache_type
参数来开启或关闭查询缓存。例如,SET GLOBAL query_cache_type = 1;
表示开启查询缓存,SET GLOBAL query_cache_type = 0;
表示关闭查询缓存。 - 查询缓存大小:可以通过
query_cache_size
参数来设置查询缓存的大小。合理的查询缓存大小应根据服务器的内存大小和查询负载来确定,避免查询缓存过大导致内存不足。 - 优化查询语句:为了提高查询缓存的命中率,应尽量保证查询语句的一致性。避免因为查询语句的微小差异导致缓存无法命中。
- 监控命中率:定期监控查询缓存的命中率。如果命中率较低,可能需要考虑关闭查询缓存或优化查询语句。命中率可以通过
SHOW STATUS LIKE 'Qcache_hits';
和SHOW STATUS LIKE 'Qcache_inserts';
等命令来查看。
注意事项:
- 缓存失效:当查询涉及的表数据发生变化时(如插入、更新、删除操作),与该表相关的所有缓存数据都会失效。这可能导致缓存频繁失效,降低缓存命中率。
- 内存消耗:查询缓存会占用服务器的内存资源。如果查询缓存设置得过大,可能会导致服务器内存不足,影响其他应用的性能。
- 锁竞争:在写操作时,MySQL需要加锁来更新查询缓存,这可能导致锁竞争,影响系统的并发性能。
总结:
用于缓存已经执行过的SELECT语句的结果集。当有相同的查询请求时,MySQL可以直接从缓存中返回结果,提高查询性能。但在实际应用中,由于缓存更新和维护的开销较大,查询缓存并不常用,MySQL 8.0版本已经将其删除。
解析器
解析器:是MySQL数据库管理系统中的一个关键组件,它的主要任务是将用户输入的SQL查询语句转换为系统能够执行的内部数据结构。这包括词法分析、语法分析和语义分析三个主要步骤。
- 词法分析:将SQL查询语句分解成一个个的词法单元(Tokens),如关键词(如SELECT、FROM、WHERE等)、表名、字段名、运算符和常量等。
- 语法分析:根据SQL语言的语法规则,将词法单元组合成一个树状结构,即语法树(Syntax Tree)。语法树表示了SQL查询语句的结构和层次关系。
- 语义分析:对语法树进行语义检查和处理,验证SQL语句的语义正确性。这包括检查表和列的存在性、数据类型是否匹配、权限检查等。
工作流程:
MySQL解析器的工作流程大致如下:
- 接收SQL查询:用户通过客户端提交SQL查询请求。
- 词法分析:解析器对SQL查询语句进行词法分析,生成词法单元序列。
- 语法分析:根据SQL语法规则,解析器将词法单元序列组合成语法树。
- 语义分析:解析器对语法树进行语义检查,确保SQL语句的语义正确性。
- 输出解析结果:解析器将解析后的结果(通常是语法树或经过进一步处理的内部数据结构)传递给查询优化器进行后续处理。
注意事项:
在使用MySQL解析器时,需要注意以下几点:
- 语法正确性:确保SQL查询语句符合SQL语法规则,否则解析器将无法正确解析。
- 语义正确性:除了语法正确外,还需要确保SQL查询语句的语义正确性,包括表和列的存在性、数据类型匹配等。
- 性能优化:对于复杂的SQL查询语句,可能需要优化解析器的性能以提高查询处理的效率。
- 安全性:在处理用户输入的SQL查询语句时,需要注意防止SQL注入攻击等安全问题。
总结:
MySQL解析器是数据库管理系统中的一个核心组件,它负责将用户输入的SQL查询语句转换为系统可执行的内部数据结构。了解解析器的工作原理和实现方式对于优化数据库性能和确保数据安全具有重要意义。
优化器
优化器:是数据库管理系统的核心组件之一,负责选择最有效的执行计划来处理SQL查询。其主要任务是分析查询,并根据统计信息和可用的索引,决定如何以最快的方式访问数据。优化器通过一系列复杂的算法和规则来确定最优的查询执行路径,从而最小化查询执行的成本(通常是时间成本),提高数据库的整体性能。
工作原理:
MySQL优化器的工作原理可以概括为以下几个步骤:
- 接收SQL查询:用户通过客户端提交SQL查询请求。
- 语法解析:优化器首先对SQL语句进行语法解析,确保其符合MySQL的语法规范。这一步通常由解析器(Parser)完成,将SQL文本转换为内部数据结构,如解析树(Parse Tree)或查询树(Query Tree)。
- 语义分析:对语法正确的语句进行语义分析,构建查询的语义结构。这包括消除常量表达式、子查询展开、视图合并等操作,以及权限检查、名称解析等。
- 优化策略选择:基于语义结构,优化器选择合适的优化策略,例如使用合适的索引、连接方式等。这一步涉及索引选择、连接方法选择等多个方面。
- 生成执行计划:最终,优化器生成一个优化过的执行计划。该计划详细描述了如何获取和处理数据,包括表扫描或索引扫描顺序、连接顺序与连接条件、聚合、排序、分组等操作的安排。
优化建议:
为了充分利用MySQL优化器的性能,以下是一些优化建议:
- 合理设计数据库和表结构:包括选择合适的字段类型、设置适当的索引、避免过多的冗余数据等。
- 优化SQL查询语句:尽量使用简单的查询语句,避免复杂的子查询和嵌套查询。同时,要确保查询语句的语法正确性和语义正确性。
- 定期更新统计信息:MySQL会自动收集表的统计信息,但也可以手动更新以确保统计信息的准确性。准确的统计信息有助于优化器生成更优的执行计划。
- 使用EXPLAIN命令:EXPLAIN命令可以帮助用户了解优化器是如何处理查询的,并为进一步的优化提供依据。通过EXPLAIN输出的结果,可以看到优化器选择了哪些索引、使用的连接类型、估计的行数等信息。
总结:
MySQL优化器是数据库管理系统的核心组件之一,它通过解析、预处理、分析、优化等一系列复杂过程,结合统计信息和成本模型,为SQL查询生成最优执行计划。了解优化器的工作原理和特性有助于用户编写出更高效的SQL查询语句,并充分利用数据库的性能优势。
执行器
执行器:是MySQL数据库管理系统中的一个关键组件,它接收优化器生成的执行计划,并按照该计划逐步执行SQL语句。执行器的主要功能包括:
- 权限检查:在执行SQL语句之前,执行器会检查用户是否有足够的权限来访问涉及的表和字段。
- 执行计划执行:根据优化器生成的执行计划,执行器会调用存储引擎的接口来访问数据,并按照计划中的步骤逐步执行查询或更新操作。
- 结果返回:执行器将执行结果返回给用户,这包括查询结果集、受影响的行数等信息。
工作流程:
MySQL执行器的工作流程大致如下:
- 接收执行计划:执行器从优化器接收经过优化的执行计划。
- 准备执行环境:执行器会准备必要的执行环境,如分配内存、打开文件等。
- 执行操作:根据执行计划中的步骤,执行器会调用存储引擎的接口来执行具体的查询或更新操作。这可能包括扫描表、读取索引、过滤数据、执行聚合操作等。
- 处理结果:执行器将执行结果进行处理,如格式化查询结果集、计算受影响的行数等。
- 返回结果:最终,执行器将处理后的结果返回给用户。
优化建议:
为了充分利用MySQL执行器的性能,以下是一些优化建议:
- 优化SQL语句:尽量编写高效的SQL语句,避免复杂的子查询和嵌套查询。同时,要确保查询语句的语法正确性和语义正确性。
- 选择合适的索引:为表和字段选择合适的索引可以显著提高查询性能。在执行查询时,执行器会利用索引来快速定位数据。
- 更新统计信息:确保MySQL的统计信息是最新的,以便优化器能够生成更优的执行计划。这可以通过执行ANALYZE TABLE命令来更新表的统计信息。
- 监控和分析执行计划:使用EXPLAIN命令来查看SQL语句的执行计划,并分析执行计划中的各个步骤。这有助于识别性能瓶颈并进行优化。
总结:
MySQL执行器是数据库管理系统的核心组件之一,它负责执行经过优化器优化后的SQL语句,并将执行结果返回给用户。了解执行器的工作原理和特性有助于用户编写出更高效的SQL查询语句,并充分利用数据库的性能优势。
日志模块
日志模板:MySQL的日志模块包括多种类型的日志,每种日志都有其特定的用途和记录内容。这些日志共同构成了MySQL数据库管理系统的日志体系,为数据库的运维和管理提供了重要的支持。
日志类型及功能:
-
错误日志(Error Log)
- 功能:记录MySQL服务器启动、运行和关闭过程中的错误信息。
- 用途:用于排查MySQL服务器的故障,了解错误发生的原因和上下文。
-
查询日志(Query Log)
- 功能:记录所有执行的SQL语句,包括查询语句、更新语句等。
- 用途:用于分析用户的行为、监控数据库的查询性能,以及审计数据库的使用情况。
-
慢查询日志(Slow Query Log)
- 功能:记录执行时间超过指定阈值的SQL语句。
- 用途:用于识别和优化性能较差的查询语句,提高数据库的查询效率。
-
二进制日志(Binary Log,Binlog)
- 功能:记录所有的数据库更改操作,包括插入、更新和删除等。
- 用途:用于数据恢复、主从复制和增量备份。二进制日志是MySQL数据库高可用性和灾难恢复的重要基础。
-
事务日志(Transaction Log)
- 功能:记录MySQL事务的开始、提交和回滚等操作。事务日志通常与存储引擎相关,例如InnoDB存储引擎有自己的重做日志(Redo Log)和回滚日志(Undo Log)。
- 用途:用于确保事务的原子性、一致性、隔离性和持久性(ACID特性),以及在发生故障时恢复数据。
日志配置与管理:
MySQL的日志功能可以通过配置文件(如my.cnf或my.ini)进行配置。以下是一些常见的日志配置选项:
- 错误日志:通过
log-error
参数指定错误日志文件的路径。 - 查询日志:通过
general_log
和general_log_file
参数开启查询日志并指定日志文件的路径。 - 慢查询日志:通过
slow_query_log
、slow_query_log_file
和long_query_time
参数开启慢查询日志、指定日志文件的路径以及设置慢查询的阈值。 - 二进制日志:通过
log-bin
参数指定二进制日志文件的路径。此外,还可以使用sync_binlog
参数控制二进制日志的写入策略,以确保数据的持久性。
在配置好日志后,可以通过MySQL提供的命令或工具来查看和管理日志。例如,可以使用SHOW VARIABLES LIKE 'log_%'
命令查看各种日志的配置情况;使用mysqlbinlog
工具查看和分析二进制日志文件的内容。
总结:
负责执行查询语句的具体操作。它会根据优化器选择的执行计划,逐步执行各个子操作,获取和返回结果。在执行前,执行器会先判断用户对表是否有执行查询的权限,如果没有,就返回没有权限的错误;如果有权限,就打开表继续执行。然后,执行器根据表的引擎定义,调用对应引擎提供的接口。
缓冲池
缓冲池(Buffer Pool):缓冲池是InnoDB存储引擎中一块连续的内存区域,用于缓存磁盘上的数据页和索引页。由于内存访问速度远快于磁盘访问,因此将经常访问的数据和索引加载到缓冲池中,可以显著提高数据库的读写性能。
组成和结构:
MySQL缓冲池主要由以下几个关键组件组成:
- 数据页:存储了InnoDB表的实际数据行。在InnoDB中,数据是按页存储的,每个数据页通常包含多行数据。当需要读取或修改表中的数据时,相关的数据页会被加载到缓冲池中。
- 索引页:存储了InnoDB表的索引结构,包括主键索引(聚集索引)和辅助索引(非聚集索引)。这些索引页被加载到缓冲池中,以加速对表中数据的查找和访问。
- Undo页:存储了旧版本的数据,用于支持事务的ACID属性中的隔离性(Isolation)和持久性(Durability)。当执行一个事务时,对数据的修改不会立即生效,而是先记录在Undo页中。
- 插入缓存:用于优化非聚集索引插入操作的一种机制。当向一个包含非聚集索引的表中插入数据时,如果相关的索引页不在缓冲池中,InnoDB不会立即将索引键插入到索引页中,而是将其存储在插入缓存中。当相关的索引页被加载到缓冲池时,插入缓存中的索引键会被合并并插入到索引页中。
- 自适应哈希索引:InnoDB存储引擎的一个特性,用于自动根据访问模式创建哈希索引。当某些索引值被频繁访问时,InnoDB会将这些索引值存储在自适应哈希索引中,以加速对这些值的查找。
- InnoDB的锁信息:InnoDB存储引擎使用锁来确保并发访问时的数据一致性和完整性。在缓冲池中,InnoDB会维护锁信息,以跟踪哪些数据页或行被锁定,以及锁的类型(如共享锁或排他锁)。
工作原理:
缓冲池的工作原理主要基于“时间局部性”和“空间局部性”原则,即最近访问过的数据在未来很可能再次被访问,且一个数据项被访问时,与其相邻的数据项也很可能被访问。因此,缓冲池会尽量保留这些经常被访问的数据和索引,以减少磁盘I/O操作。
当MySQL需要读取数据时,会首先在缓冲池中查找,如果数据已经在缓冲池中,则直接返回给用户,称为缓冲池命中;如果数据不在缓冲池中,则从磁盘读取,并将数据保存在缓冲池中以供下次使用,称为缓冲池未命中。
配置与管理:
MySQL缓冲池的大小是可以通过配置参数进行调整的。一般建议缓冲池大小是系统内存的70%-80%,但具体大小需要根据数据库的工作负载和硬件资源进行调整。
可以通过以下步骤来配置MySQL缓冲池的大小:
- 查看当前的缓冲池设置:使用
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
命令。 - 计算并决定一个合适的大小:根据系统内存和数据库的工作负载来计算。
- 修改MySQL的配置文件:在配置文件中添加或修改
innodb_buffer_pool_size
参数。 - 重启MySQL服务:使新的配置生效。
- 验证设置是否成功:再次使用
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
命令来验证。
总结:
用于缓存数据页,提高数据的读取和写入性能。MySQL使用缓冲池来管理内存中的数据页,可以减少对磁盘的访问。InnoDB存储引擎中的缓冲池还分为Buffer Pool、Change Buffer、Adaptive Hash Index等部分。
锁管理器
锁管理器(Lock Manager):用于管理并发访问数据库的锁机制。MySQL使用锁管理器来保证并发事务的隔离性和一致性,防止数据冲突和并发问题。
锁管理器的作用:
锁管理器在MySQL中扮演着至关重要的角色,它主要负责以下任务:
- 管理锁的类型和级别:MySQL支持多种类型的锁,如全局锁、表级锁、行级锁等,每种锁都有其特定的应用场景和性能影响。锁管理器需要确保这些锁的正确使用和有效管理。
- 控制并发访问:当多个事务同时访问同一数据时,锁管理器需要协调这些并发访问,以防止数据冲突和确保事务的隔离性。
- 优化性能:锁管理器需要权衡数据一致性和并发性能之间的关系,通过合理的锁策略和锁粒度来优化数据库的整体性能。
锁的类型和级别:
MySQL中的锁可以分为多种类型和级别,以满足不同的应用场景和性能需求。以下是一些常见的锁类型和级别:
- 全局锁:对整个数据库实例加锁,限制除了超级用户外的所有查询和修改操作。一般用于备份、恢复等操作。
- 表级锁:对整个表加锁,其他连接无法修改或读取该表的数据,但可以对其他表进行操作。表级锁可以进一步分为共享锁(读锁)和排他锁(写锁)。
- 行级锁:对单个行加锁,只锁定需要修改的数据行,其他行可以被同时修改或读取。行级锁可以最大程度地支持并发处理,但锁管理较复杂。行级锁可以进一步分为记录锁、间隙锁和临键锁等。
锁管理器的实现机制:
锁管理器通过一系列复杂的机制和算法来实现锁的管理和并发控制。以下是一些关键的实现机制:
- 锁的申请与释放:当事务需要访问数据时,会向锁管理器申请相应的锁。锁管理器会根据当前的锁状态和策略来决定是否授予锁。事务完成后,锁管理器会释放相应的锁。
- 锁的升级与降级:在某些情况下,事务可能需要改变其持有的锁类型和级别。例如,一个事务开始时可能只需要读取数据(持有共享锁),但后来发现需要修改数据(需要排他锁)。这时,锁管理器需要支持锁的升级操作。相反,如果事务不再需要排他锁,也可以将其降级为共享锁。
- 死锁检测与解决:当两个或多个事务相互等待对方释放锁时,会发生死锁。锁管理器需要能够检测死锁的发生,并采取适当的措施来解决死锁,如回滚其中一个事务或等待其中一个事务释放锁。
- 锁的粒度与策略:锁管理器需要根据具体的应用场景和性能需求来选择合适的锁粒度和策略。例如,在并发度较高的场景下,可以选择行级锁来减少锁冲突;在需要批量更新数据的场景下,可以选择表级锁来提高性能。
锁管理器的优化和调整:
为了充分发挥MySQL的性能优势,需要对锁管理器进行合理的优化和调整。以下是一些常见的优化和调整方法:
- 调整锁粒度:根据具体的业务需求和性能瓶颈,选择合适的锁粒度。例如,在需要高并发读写的场景下,可以优先考虑使用行级锁。
- 优化事务管理:合理设计事务的大小和持续时间,避免长时间占用锁资源。同时,可以使用事务的隔离级别来优化并发性能。
- 监控与分析:使用MySQL提供的监控工具和分析工具来监控锁的使用情况和性能瓶颈。根据监控结果,对锁管理器进行相应的调整和优化。
- 升级硬件与软件:在硬件和软件方面,可以通过升级内存、磁盘等硬件设备以及使用更高版本的MySQL软件来优化锁管理器的性能。
总结:
MySQL的锁管理器是一个功能强大且复杂的组件,它负责管理MySQL中的各种锁,以确保数据的一致性和完整性,同时优化并发性能。通过合理的配置和优化,可以充分发挥MySQL的性能优势,满足各种应用场景的需求。
存储引擎层
存储引擎层是MySQL区别于其他数据库最核心的一点,也是MySQL最具特色的地方。它主要负责MySQL中数据的存储和提取,此外,数据库中的索引也是在存储引擎层实现的。不同的存储引擎具有不同的功能,用户可以根据自己的需要选取合适的存储引擎。MySQL提供了多个不同的存储引擎,其中最常用的有三种:InnoDB、MyISAM和MEMORY。
InnoDB
InnoDB:
- 是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。
- 提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。
- 锁定在行级,并且在SELECT语句中提供一个类似Oracle的非锁定读,增加了多用户部署和性能。
- 完全与MySQL服务器整合,有自己的缓冲池来在主内存中缓存数据和索引。
- 支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放。
- 使用的锁粒度为行级锁,可以支持更高的并发。
- 支持在线热备份。
- 数据的物理组织形式是聚簇表,所有的数据按照主键来组织,数据和索引放在一块,都位于B+树的叶子节点上。
MyISAM
MyISAM:
- 基于ISAM存储引擎,并对其进行扩展,是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。
- 拥有较高的插入、查询速度,但没有事务。
- 每个MyISAM表在磁盘上存储为三个文件:frm文件存储表定义,MYD文件存放表具体记录的数据,MYI文件存储索引。
- 支持全文索引、B树索引和数据压缩。
- 不支持事务,但存储速度更快。
MEMORY
MEMORY:
- 将所有数据保存在RAM中,数据访问速度快,但安全上没有保障。通常用于临时表及缓存。
- 支持的数据类型有限制,例如不支持TEXT和BLOB类型。
- 支持的锁粒度为表级锁,访问量比较大时会成为瓶颈。
- 一旦服务器出现故障,数据会丢失。
总结:
总的来说,MySQL的基础架构通过Server层和存储引擎层的分工合作,实现了高效、灵活的数据管理和查询功能。用户可以根据自己的需求选择合适的存储引擎,以满足不同的应用场景和性能要求。
相关文章:
超详细:数据库的基本架构
MySQL基础架构 下面这个图是我给出的一个MySQL基础架构图,可以清楚的了解到SQL语句在MySQL的各个模块进行执行过程。 然后MySQL可以分为两个部分,一个是server层,另一个是存储引擎。 server层 Server层涵盖了MySQL的大多数核心服务功能&am…...
PCL 边界体积层次结构(Boundary Volume Hierarchy, BVH)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 边界体积层次结构(Boundary Volume Hierarchy, BVH) 是一种高效的空间数据结构,广泛应用于计算机图形学、计算机视觉、机器人学、物理仿真等领域。它的核心思想是通过将空间递归地划分为层次化的包围体(通常是轴…...
【微服务】深入解析spring aop原理
目录 一、前言 二、AOP 概述 2.1 什么是AOP 2.2 AOP中的一些概念 2.2.1 aop通知类型 2.3 AOP实现原理 2.3.1 aop中的代理实现 2.4 静态代理与动态代理 2.4.1 静态代理实现 三、 jdk动态代理与cglib代理 3.1 jdk动态代理 3.1.1 jdk动态代理模拟实现 3.2 CGLIB 代理…...
Python爬虫系统搭建教程,从0开始搭建爬虫系统(附安装包)
文章目录 前言一、Python环境搭建1.Python安装2.选择Python开发环境3. 安装必要库 二、基础爬虫构建1. 发送请求获取网页2. 解析网页提取数据 三、使用 Scrapy 框架搭建系统1. 创建 Scrapy 项目2. 生成爬虫3. 编写爬虫代码4. 运行爬虫 四、应对反爬虫机制1. 常见反爬虫手段2. 解…...
linux -对文件描述符的操作dup、fcntl有五种
dup #include<unistd.h> int dup(int oldfd);作用:复制一个新的文件描述符fd 3, int fd1 dup(fd);f指向的是a.txt,fd1指向的也是a.txt从空闲的文件描述符表中找一个最小的作为新的拷贝的文件描述符返回:成功返回新的文件描述符,失败…...
人工智能(AI)的不同维度分类
人工智能(AI)的分类 对机器学习进行分类的方式多种多样,可以根据算法的特性、学习方式、任务类型等不同维度进行分类这些分类都不是互斥的: 1、按数据模态不同:图像,文本,语音,多态等 2、按目标函数不同:判别式模型…...
MySQL的Union和OR查询
这里写目录标题 **1. 创建表和索引****2. 编写 UNION 查询****3. 使用 EXPLAIN 分析查询****4. 分析 EXPLAIN 结果****可能的结果分析**: **5. 验证索引合并****总结****1. UNION 操作的分析****为什么使用临时表?** 2. OR 条件的分析为什么使用索引合并…...
金融业的AI革命——量化交易与智能风控(五)
第五章 AI驱动的智能投顾与普惠金融服务体系 一、智能投顾技术架构的范式革新 1. 技术演进三阶段 阶段核心技术典型应用局限性规则引擎(2015-2020)决策树、专家系统银行理财风险评估自动化(覆盖率98%)无法应对黑天鹅事件机器学习(2020-2023)…...
机动车授权签字人考试题库及答案
一、单选题 11、 资质认定,是指( )以上质量技术监督部门依据有关法律法规和标准、技术规范的规定,对检验检测机构的基本条件和技术能力是否符合法定要求实施的评价许可。资质认定包括检验检测机构计量认证。 A、县级 B、市级 C、地区 D、省级 答案࿱…...
Kafka系列之:记录一次源头数据库刷数据,造成数据丢失的原因
Kafka系列之:记录一次源头数据库刷数据,造成数据丢失的原因 一、背景二、查看topic日志信息三、结论四、解决方法一、背景 源头数据库在很短的时间内刷了大量的数据,部分数据在hdfs丢失了 理论上debezium数据采集不会丢失,就需要排查数据链路某个节点是否有数据丢失。 数据…...
鸿蒙学习-
鸿蒙数据传值 //* 传值 //* State /**State创建一个响应式的数据,但不是所有的更改都会引起刷新,只有被框架观察到的修改才会被刷新UI* 1. 基本数据类型如 number string boolean等值的变化修改* 2. Object类型,只会观察到第一层的数据变化或…...
【多模态处理篇五】【DeepSeek文档解析:PDF/Word智能处理引擎】
你知道吗?全球每天产生的PDF文档超过10亿份,但90%的上班族还在用复制粘贴的笨办法处理文档!DeepSeek文档解析引擎就像给你的电脑装上了"文档翻译官",能把PDF/Word里的文字、表格、公式甚至排版样式都变成AI能理解的"语言"。举个真实场景:法务小姐姐用…...
WPS中如何批量上下居中对齐word表格中的所有文字
大家好,我是小鱼。 在日常制作Word表格时,经常需要对表格中的内容进行排版。经常会把文字设置成左对齐、居中对齐或者是右对齐,这些对齐方式都比较好设置,有时我们制作的表格需要把文字批量上下居中对齐,那么怎么操作…...
【LLM】增强大模型推理能力的四种范式
note 增强大模型推理能力的四种范式:推理时间扩展、纯强化学习(RL)、SFTRL、蒸馏(distillation) 。其实这几种方法本质就是SFTRL: 低成本做事就直接推理时间扩展稍微肯付出成本就蒸馏SFT,顺便搞点高质量COT SFT数据高级点就先用GRPO等RL学习…...
2025年华为手机解锁BL的方法
注:本文是我用老机型测试的,新机型可能不适用 背景 华为官方已经在2018年关闭了申请BL解锁码的通道,所以华为手机已经无法通过官方获取解锁码。最近翻出了一部家里的老手机华为畅玩5X,想着能不能刷个系统玩玩,但是卡…...
鸿蒙状态管理概述 v2
状态管理v2 概述状态管理之v2ObservedV2 和 Trace状态管理V1版本对嵌套类对象属性变化直接观测的局限性ObservedV2 和 Trace 使用场景 Local状态管理V1版本State装饰器的局限性 Param状态管理V1版本接受外部传入的装饰器的局限性 OnceEventComputedComputed 使用场景 TypePersi…...
阿里云上的网站配置HTTPS
1. 获取SSL证书 创建证书 下载证书 下载 上传 .key .pem 文件 到 阿里云服务器 /etc/nginx/ssl nginx.conf 配置 server { listen 443 ssl; server_name yuming; ssl_certificate /etc/nginx/ssl/*.pem; ssl_certificate_key /etc/nginx/ssl/*.key;...
【部署优化篇十四】【十万字全景拆解:GitHub Actions自动化流水线设计圣经(DeepSeek工业级实践大公开)】
一、从手工作坊到智能工厂:CI/CD的革命之路 想象一下,你所在的公司每天要手工组装1000台手机,每个环节都靠老师傅肉眼检查——这就是没有CI/CD的软件开发现状。GitHub Actions的出现,就像给软件交付装上了特斯拉的超级工厂流水线。 DeepSeek的CI/CD演进史就是一部血泪史:…...
Golang | 每日一练 (3)
💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Golang | 每日一练 (3)题目参考答案map 实现原理hmapb…...
Java+SpringBoot+Vue+数据可视化的综合健身管理平台(程序+论文+讲解+安装+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在当今社会,随着人们生活水平的不断提高和健康意识的日益增强,健…...
深入解析Textual库:打造现代化的终端用户界面(TUI)
深入解析Textual库:打造现代化的终端用户界面(TUI) 在终端应用程序的世界里,过去的交互方式通常是简单的命令行输入和文本输出。然而,随着开发者对更高可用性和更友好界面的追求,现代终端用户界面…...
基于ffmpeg+openGL ES实现的视频编辑工具-opengl相关逻辑(五)
在我们的项目中,OpenGL ES 扮演着至关重要的角色,其主要功能是获取图像数据,经过一系列修饰后将处理结果展示到屏幕上,以此实现各种丰富多样的视觉效果。为了让大家更好地理解后续知识,本文将详细介绍 OpenGL 相关代码。需要注意的是,当前方案将对 OpenGL 的所有操作都集…...
加班限制了进步
今天周六,大家都在加班吗? 做个统计。 最近面试了很多硬件工程师,还没有找到如意的。 这些面试者都很会解决问题,但是不会闭环问题。 EMC不过,加个磁环就过了。为什么加磁环就过了,底层原理不清楚。 改…...
容器化部署tomcat
容器化部署tomcat 需求在docker容器中部署tomcat,并通过外部机器访问tomcat部署的项目 容器化部署要先装好docker容器(docker安装配置) 实现步骤: 拉取tomcat docker pull tomcat用于列出本地Docker主机上存储的所有镜像 docker images在root目录里面创建tomc…...
【HeadFirst系列之HeadFirst设计模式】第7天之命令模式:封装请求,轻松实现解耦!
命令模式:封装请求,轻松实现解耦! 大家好!今天我们来聊聊设计模式中的命令模式(Command Pattern)。如果你曾经需要将请求封装成对象,或者希望实现请求的撤销、重做等功能,那么命令模…...
尚硅谷爬虫note009
一、jsonpath 1.安装 pip install jsonpath 2.使用 只能解析本地文件 .json文件 {"store": {"book": [{"category": "reference","author": "Nigel Rees","title": "Sayings of the Century&qu…...
C语言(11)------------->while循环
一、if与while的区别 在C语言中,有三大结构,分别是顺序、选择和循环。在前面的博客文章中,我们解释了if语句的用法,可以参考:C语言(7)------------>if语句-CSDN博客 从文章中&…...
Unity 全局屏幕点击特效
思路: 1、生成一个点击特效实例,每点击屏幕,就调整特效实例的位置并控制特效的显隐状态即可。 2、需要注意要保证在编辑器开发时或手机上运行时都要显示点击效果。 方案一 (推荐) using UnityEngine; using UnityEn…...
【数据结构初阶第十二节】设计循环队列
云边有个稻草人-CSDN博客 必须有为成功付出代价的决心,然后想办法付出这个代价。 还有最后一道关于队列的习题,这题有点难,准备好迎接挑战吧! 目录 1.【题目】 2.实现循环队列推荐用数组,Why? 3.Q1:如…...
【小白学HTML5】盒模型(一文讲清margin、padding)_第三讲
根据第一讲的内容,我们知道margin是外边距、padding是内边距,那么内外边距该怎么设置呢? 1、margin:外边距 第一种情况:比如设置外边距为上10px、右20px、下30px、左40px 外边距可以分别设置为:margin-t…...
PLC数据采集网关(三格电子)
产品概述 PLC转Modbus网关型号SG-PLC-Private(PLC私有协议网关),是三格电子推出的工业级网关(以下简称网关),主要用于在不需要对PLC编程的情况下将PLC数据映射到Modbus TCP(映射的方式符合PLC工程师使用习惯…...
基于图扑 HT 可视化实现智慧地下采矿可视化
在前端开发领域,不断涌现的新技术为各行业带来了创新变革的可能。今天,让我们聚焦于图扑软件自研的 HT for Web 产品,看看它如何在前端 2D、3D 渲染方面发力,为智慧地下采矿可视化打造令人惊叹的解决方案,为开发者开启…...
【网络】高级IO(2)
或者在某些情况下,它可能是: typedef unsigned int nfds_t; 前言 由于select函数有下面几个特别明显的缺点,就推演出了改进版本——poll函数 比如select监视的fd是有上限的,我的云服务器内核版本下最大上限是1024个fd…...
论文解读 | AAAI'25 Cobra:多模态扩展的大型语言模型,以实现高效推理
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 个人信息 作者:赵晗,浙江大学-西湖大学联合培养博士生 内容简介 近年来,在各个领域应用多模态大语言模型(MLLMs&…...
区块链共识机制详解
区块链共识机制详解 🤝 1. 什么是共识机制? 共识机制是区块链网络中,所有节点就某个状态(如交易的有效性)达成一致的规则和过程。它解决了在去中心化网络中如何确保数据一致性的问题。 2. 主流共识机制 2.1 工作量证…...
Unity游戏制作中的C#基础(1)界面操作基础
1.脚本有关注意事项 (1).进入项目之后,一般创建一个文件夹Scripts用来存放c#脚本; (2).在Scripts中创建脚本,双击脚本,进入VS编辑器,有如下结构: start&#…...
python学习笔记,python处理 Excel、Word、PPT 以及邮件自动化办公
文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python 二、处理 Excel 文件(openpyxl库)三、 处理 Word 文件(python-docx库)四、 处理 PPT 文件(python-pptx库)五、 自动发送邮件(smtplib和…...
欢乐力扣:同构字符串
文章目录 1、题目描述2、 代码 1、题目描述 同构字符串。给定两个字符串 s 和 t ,判断它们是否是同构的。如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符…...
近10年气象分析(深度学习)
这是一个气象数据分析程序,主要用于分析和可视化气象数据。以下是该文件的主要功能: 1. 数据加载 在线数据:尝试从 GitHub 加载气象数据。 示例数据:如果无法加载在线数据,程序会自动生成示例数据。 2. 数据分析 …...
win11系统无法打开软件_组策略无法打开_gpedit.msc不生效_为了对电脑进行保护,已经阻止此应用---Windows工作笔记057
碰到这个问题挺麻烦的,要用的软件打不开了. 其实解决方法就是去组策略中修改一个策略就可以了,但是: 先来说: 而且,使用cmd输入的gpedit.msc也打不开了. 这个怎么解决? @echo off pushd "%~dp0"dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPo…...
【JAVA】封装多线程实现
系列文章目录 java知识点 文章目录 系列文章目录👉前言👉一、封装的目标👉二、常见的封装方式及原理👉壁纸分享👉总结 👉前言 在 Java 中,封装多线程的原理主要围绕着将多线程相关的操作和逻辑…...
长短期记忆网络:从理论到创新应用的深度剖析
一、引言 1.1 研究背景 深度学习在人工智能领域的发展可谓突飞猛进,而长短期记忆网络(LSTM)在其中占据着至关重要的地位。随着数据量的不断增长和对时序数据处理需求的增加,传统的神经网络在处理长序列数据时面临着梯度消失和梯…...
过程监督(Process Supervision)融入到 GRPO (Group Relative Policy Optimization)
下面演示如何把“过程监督(Process Supervision)”的思想融入到 GRPO (Group Relative Policy Optimization) 中,从而对每个输出的中间步骤逐一打分、计算相对优势。本文的示例代码与 grpo_train.py (来源见下文)类似&…...
ES6中Object.defineProperty 的详细用法和使用场景以及例子
ES6 Object.defineProperty() 用法总结 Object.defineProperty() 是 ES5 引入的一个方法,ES6 继续强化了该方法的使用,它允许我们为对象的属性定义或修改 属性描述符。它能够控制对象属性的行为,如读写权限、可枚举性和可配置性。 1. Objec…...
【服务器与本地互传文件】远端服务器的Linux系统 和 本地Windows系统 互传文件
rz 命令:本地上传到远端 rz 命令:用于从本地主机上传文件到远程服务器 rz 是一个用于在 Linux 系统中通过 串口 或 SSH 上传文件的命令,它实际上是 lrzsz 工具包中的一个命令。rz 命令可以调用一个图形化的上传窗口,方便用户从本…...
NVIDIA A100 SXM4与NVIDIA A100 PCIe版本区别深度对比:架构、性能与场景解析
NVIDIA A100 SXM4与PCIe版本深度对比:架构、性能与场景解析 作为NVIDIA Ampere架构的旗舰级数据中心GPU,A100系列凭借强大的计算能力和显存带宽,已成为人工智能训练、高性能计算(HPC)等领域的核心硬件。然而ÿ…...
RAG基本原理
1.RAG全称是Retrieval-Augmented Generation Generation 的含义是 基于用户的输入,生成具有上下文含义的一段文字。 Query 比如说 太阳系中,哪个行星拥有的卫星数目最多? 回答Answer 木星,木星目前有79个卫星 这样的回答存在两个…...
WPS接入deepseek-OfficeAI助手插件下载
功能简介 OfficeAI 助手 是一款免费的智能AI办公工具软件,专为 Microsoft Office 和 WPS 用户打造。 无论你是在寻找如何输入“打勾(√)符号”的方法,还是想知道“怎么在插入表格前添加文字”,或者“该用哪个公式”&a…...
【微中子代理踩坑-前端node-sass安装失败】
微中子代理踩坑-前端node-sass安装失败-windows 1.npm版本2.python2.73.安装Visual Studio 1.npm版本 当前使用node版本13.12.0 2.python2.7 安装python2.7.9并配置环境变量 3.安装Visual Studio 安装Visual Studio 我是直接勾选了3个windows的sdk,然后就好了 最后 npm in…...
在群晖上使用Docker安装思源笔记
最近一段时间,docker的镜像地址都失效了,在群晖系统中,无论是早期版本的docker,还是最新版本中的Container Manager,注册表中都无法链接到docker的镜像,于是,就花了点时间查找资料&#x…...