当前位置: 首页 > news >正文

MySql面试总结(二)

WHERE 子句优化

截至2024年7月,MySQL最新稳定版本是8.2,并不存在MySQL 8.4 。下面从常见的几个方面为你介绍 MySQL 8.x 中 WHERE 子句的优化方法:

1. 确保使用索引

  • 原理:索引可以加快数据的查找速度,当 WHERE 子句中的条件列有索引时,MySQL 可以直接定位到符合条件的数据,而不需要全表扫描。
  • 示例
-- 创建一个表
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50),age INT,email VARCHAR(100)
);-- 为 age 列创建索引
CREATE INDEX idx_age ON users (age);-- 查询 age 大于 20 的用户
SELECT * FROM users WHERE age > 20;

在这个例子中,通过为 age 列创建索引,当执行 WHERE 子句中包含 age 条件的查询时,MySQL 可以利用该索引快速定位符合条件的记录,提高查询效率。

2. 避免在索引列上使用函数

  • 原理:如果在索引列上使用函数,MySQL 无法使用该索引进行快速查找,会导致全表扫描。
  • 错误示例
-- 查询 name 以 'J' 开头的用户,这里使用了函数,无法使用索引
SELECT * FROM users WHERE LEFT(name, 1) = 'J';
  • 正确示例
-- 使用 LIKE 操作符代替函数,可使用索引
SELECT * FROM users WHERE name LIKE 'J%';

3. 优化范围查询

  • 原理:范围查询(如 ><BETWEEN 等)可能会导致索引失效,特别是在复合索引中。尽量将范围查询放在条件的最后。
  • 示例
-- 创建复合索引
CREATE INDEX idx_age_name ON users (age, name);-- 优化后的查询,将范围查询放在最后
SELECT * FROM users WHERE name = 'John' AND age > 20;

在这个例子中,先通过 name 列进行精确匹配,再进行 age 列的范围查询,这样可以更有效地利用复合索引。

4. 避免使用 OR 连接条件

  • 原理:当 WHERE 子句中使用 OR 连接多个条件时,MySQL 可能无法使用索引,导致全表扫描。可以使用 UNION 代替 OR
  • 错误示例
-- 使用 OR 连接条件,可能无法使用索引
SELECT * FROM users WHERE age = 20 OR age = 30;
  • 正确示例
-- 使用 UNION 代替 OR,可使用索引
SELECT * FROM users WHERE age = 20
UNION
SELECT * FROM users WHERE age = 30;

通过以上优化方法,可以显著提高 WHERE 子句的查询性能,减少数据库的响应时间。

范围优化

在 MySQL 中,范围查询(如使用 ><>=<=BETWEEN 等操作符)是常见的查询需求,但如果处理不当,可能会导致性能问题。以下从多个方面介绍范围查询的优化方法:

1. 索引优化

合理创建索引
  • 对于经常用于范围查询的列,应该创建合适的索引。例如,如果经常对 users 表的 age 列进行范围查询,就可以为 age 列创建索引。
-- 创建 users 表
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(50),age INT
);
-- 为 age 列创建索引
CREATE INDEX idx_age ON users (age);
  • 当执行 SELECT * FROM users WHERE age > 20; 这样的范围查询时,MySQL 可以利用 idx_age 索引快速定位到符合条件的记录。
复合索引的使用与顺序
  • 当查询涉及多个列的范围条件时,需要合理创建复合索引。例如,有一个查询 SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31' AND amount > 1000;,可以创建一个包含 order_dateamount 的复合索引。
-- 创建 orders 表
CREATE TABLE orders (order_id INT PRIMARY KEY,order_date DATE,amount DECIMAL(10, 2)
);
-- 创建复合索引
CREATE INDEX idx_order_date_amount ON orders (order_date, amount);
  • 复合索引中列的顺序很重要,一般将选择性高的列放在前面。在这个例子中,order_date 的选择性可能更高,所以放在前面。

2. 查询语句优化

避免在索引列上使用函数
  • 在范围查询的条件中,如果对索引列使用函数,会导致索引失效。例如,以下查询无法使用 age 列的索引:
SELECT * FROM users WHERE YEAR(birth_date) > 1990;
  • 可以将其改写为不使用函数的形式:
SELECT * FROM users WHERE birth_date > '1990-12-31';
范围条件的位置
  • 在复合索引中,范围查询条件尽量放在后面。例如,对于复合索引 (col1, col2, col3),如果查询条件为 col1 = 'value1' AND col2 > 10 AND col3 = 'value3',应该将 col2 > 10 这个范围条件放在最后,因为 MySQL 在使用复合索引时,遇到范围查询后,后续的索引列可能无法有效使用。

3. 数据库配置优化

调整缓冲池大小
  • 缓冲池(InnoDB Buffer Pool)用于缓存数据和索引页,适当增大缓冲池的大小可以提高范围查询的性能。可以通过修改 innodb_buffer_pool_size 参数来调整缓冲池大小。例如,在 my.cnfmy.ini 配置文件中添加或修改以下内容:
[mysqld]
innodb_buffer_pool_size = 2G
  • 上述配置将缓冲池大小设置为 2GB,具体大小需要根据服务器的内存和实际业务情况进行调整。
调整查询缓存
  • 查询缓存可以缓存查询结果,对于相同的范围查询,如果结果已经被缓存,就可以直接返回,减少查询时间。可以通过设置 query_cache_typequery_cache_size 参数来启用和调整查询缓存的大小。例如:
[mysqld]
query_cache_type = 1
query_cache_size = 64M
  • 不过,需要注意的是,查询缓存对于频繁更新的表可能效果不佳,因为每次表更新时,相关的查询缓存都会失效。

4. 数据分区优化

按范围分区
  • 对于数据量较大的表,可以考虑使用数据分区。例如,对于 orders 表,可以按照 order_date 进行范围分区。
-- 创建按范围分区的 orders 表
CREATE TABLE orders (order_id INT,order_date DATE,amount DECIMAL(10, 2)
)
PARTITION BY RANGE (YEAR(order_date)) (PARTITION p2023 VALUES LESS THAN (2024),PARTITION p2024 VALUES LESS THAN (2025),PARTITION p2025 VALUES LESS THAN (2026)
);
  • 当执行范围查询 SELECT * FROM orders WHERE order_date BETWEEN '2024-01-01' AND '2024-12-31'; 时,MySQL 只需要在 p2024 分区中查找数据,减少了扫描的数据量。

索引合并优化

索引合并优化(Index Merge Optimization)是 MySQL 数据库中的一种重要优化策略,当一个查询的 WHERE 子句中包含多个条件,且每个条件都可以使用不同的索引时,MySQL 可以通过索引合并的方式来提高查询效率。以下为你详细介绍索引合并优化的相关内容:

1. 索引合并的类型

交集合并(Intersection Merge)
  • 原理:当查询的条件可以通过多个索引分别筛选出一部分结果,并且这些结果需要同时满足时,MySQL 会使用交集合并。即通过多个索引分别定位到符合各自条件的记录,然后取这些记录的交集。
  • 示例
-- 创建表
CREATE TABLE products (id INT PRIMARY KEY,category_id INT,price DECIMAL(10, 2),INDEX idx_category (category_id),INDEX idx_price (price)
);
-- 插入示例数据
INSERT INTO products (id, category_id, price) VALUES (1, 1, 10.00), (2, 2, 20.00), (3, 1, 30.00);
-- 查询语句
SELECT * FROM products 
WHERE category_id = 1 AND price > 20;

在这个例子中,idx_category 索引可以快速定位 category_id = 1 的记录,idx_price 索引可以快速定位 price > 20 的记录,MySQL 会对这两个索引的结果取交集,得到最终符合条件的记录。

并集合并(Union Merge)
  • 原理:当查询的条件可以通过多个索引分别筛选出一部分结果,并且这些结果只需要满足其中一个条件即可时,MySQL 会使用并集合并。即通过多个索引分别定位到符合各自条件的记录,然后取这些记录的并集。
  • 示例
SELECT * FROM products 
WHERE category_id = 1 OR price > 20;

在这个例子中,idx_category 索引定位 category_id = 1 的记录,idx_price 索引定位 price > 20 的记录,MySQL 会将这两个索引的结果合并,得到最终符合条件的记录。

排序并集合并(Sort-Union Merge)
  • 原理:当并集合并的结果需要排序时,MySQL 会使用排序并集合并。它会先通过多个索引分别定位到符合各自条件的记录,然后将这些记录合并,并进行排序。
  • 示例
SELECT * FROM products 
WHERE category_id = 1 OR price > 20
ORDER BY id;

在这个例子中,除了进行并集合并外,还需要对结果按照 id 进行排序,MySQL 会使用排序并集合并来完成这个操作。

2. 索引合并优化的条件

  • 多个独立索引:查询的 WHERE 子句中必须有多个条件,且每个条件都可以使用不同的独立索引。
  • 索引类型支持:目前 MySQL 支持对 BTREE 索引进行索引合并优化,其他类型的索引可能不支持。
  • 查询复杂度:查询的复杂度不能过高,否则 MySQL 可能会选择其他的优化策略。

3. 查看索引合并优化是否生效

可以使用 EXPLAIN 语句来查看查询是否使用了索引合并优化。例如:

EXPLAIN SELECT * FROM products 
WHERE category_id = 1 AND price > 20;

EXPLAIN 的结果中,如果 Extra 列显示 Using index merge; Using intersect(idx_category,idx_price),则表示使用了交集合并优化;如果显示 Using index merge; Using union(idx_category,idx_price),则表示使用了并集合并优化。

4. 索引合并优化的局限性

  • 性能开销:虽然索引合并可以提高查询效率,但在某些情况下,合并多个索引的结果也会带来一定的性能开销,特别是当索引结果集较大时。
  • 复合索引优先:如果可以通过创建复合索引来满足查询需求,通常复合索引的性能会优于索引合并。例如,对于上述 products 表,如果经常执行 WHERE category_id = 1 AND price > 20 这样的查询,可以创建复合索引 CREATE INDEX idx_category_price ON products (category_id, price);

哈希联接优化

哈希联接(Hash Join)是数据库中用于连接两个表的一种重要算法,在 MySQL 等数据库系统中,通过合理运用哈希联接优化策略,可以显著提升查询性能。下面从哈希联接的原理、优化方法、使用场景、局限性等方面详细介绍。

原理

哈希联接主要用于处理两个表之间的连接操作,其基本步骤如下:

  1. 构建阶段(Build Phase):选择较小的表(通常称为构建表),对连接键(用于连接两个表的列)进行哈希运算,将表中的每一行数据根据哈希值存储到对应的哈希桶中,形成一个哈希表。
  2. 探查阶段(Probe Phase):遍历较大的表(通常称为探查表),对探查表中的每一行数据的连接键执行相同的哈希运算,根据哈希值找到对应的哈希桶,然后在该哈希桶中查找匹配的行,从而完成连接操作。

优化方法

1. 表大小选择
  • 原理:由于构建哈希表需要消耗一定的内存和时间,选择较小的表作为构建表可以减少构建哈希表的开销,提高整体性能。
  • 示例:假设有两个表 orderscustomersorders 表数据量较大,customers 表数据量较小,在进行连接查询时,可以让 MySQL 优先选择 customers 表作为构建表。
-- 连接查询示例
SELECT * 
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;
2. 内存分配
  • 原理:足够的内存可以确保哈希表能够完整地存储在内存中,避免频繁的磁盘 I/O 操作。可以通过调整相关的系统参数来增加哈希联接的内存分配。
  • 示例:在 MySQL 中,可以通过修改 join_buffer_size 参数来增加连接缓冲区的大小,该缓冲区可用于存储哈希表。
-- 在 my.cnf 或 my.ini 配置文件中修改参数
[mysqld]
join_buffer_size = 2M
3. 数据类型匹配
  • 原理:确保连接键的数据类型一致,避免在连接过程中进行数据类型转换,因为数据类型转换会增加额外的计算开销,影响性能。
  • 示例:如果 orders 表和 customers 表的 customer_id 列都是 INT 类型,在进行连接操作时就不会有数据类型转换的问题。
-- 创建表时确保数据类型一致
CREATE TABLE orders (order_id INT,customer_id INT
);CREATE TABLE customers (customer_id INT,customer_name VARCHAR(50)
);

使用场景

  • 大数据集连接:当需要连接两个大数据集时,哈希联接通常比嵌套循环联接(Nested Loop Join)等其他连接算法更高效,因为它可以减少不必要的比较次数。
  • 无索引连接:当连接键上没有合适的索引时,哈希联接可以发挥较好的性能,因为它不需要依赖索引来查找匹配的行。

局限性

  • 内存需求:哈希联接需要足够的内存来存储哈希表,如果内存不足,可能会导致哈希表溢出到磁盘,从而产生大量的磁盘 I/O 操作,严重影响性能。
  • 数据倾斜:如果连接键的数据分布不均匀,可能会导致某些哈希桶中的数据过多,而其他哈希桶中的数据过少,这种数据倾斜问题会影响哈希联接的性能。例如,某些 customer_id 出现的频率远高于其他 customer_id,会导致对应的哈希桶数据量过大。

查看哈希联接是否使用

可以使用 EXPLAIN 语句来查看查询是否使用了哈希联接。例如:

EXPLAIN SELECT * 
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;

EXPLAIN 的结果中,如果 Extra 列显示与哈希联接相关的信息,如 Using hash join,则表示使用了哈希联接。

引擎条件下推优化

引擎条件下推优化

定义

引擎条件下推优化(Engine Condition Pushdown Optimization)是数据库管理系统(如 MySQL)中一种重要的查询优化技术。其核心思想是将部分查询条件尽可能早地传递给存储引擎进行处理,而不是在服务器层过滤数据,从而减少从存储引擎传输到服务器层的数据量,提高查询性能。

原理

在传统的查询处理流程中,存储引擎会将满足索引条件的所有数据行返回给服务器层,然后服务器层再根据 WHERE 子句中的其他条件对这些数据行进行过滤。而引擎条件下推优化打破了这种模式,它允许存储引擎在检索数据时就利用额外的查询条件进行过滤,只将符合这些条件的数据行返回给服务器层。

示例

假设有一个 employees 表,包含 employee_iddepartment_idsalaryhire_date 等列,并且在 department_id 列上有索引。执行以下查询:

SELECT * 
FROM employees 
WHERE department_id = 10 AND salary > 5000;
  • 未使用引擎条件下推优化:存储引擎会根据 department_id 索引找到所有 department_id = 10 的数据行,然后将这些行全部返回给服务器层。服务器层再对这些返回的数据行进行筛选,过滤出 salary > 5000 的行。
  • 使用引擎条件下推优化:存储引擎不仅会利用 department_id 索引找到 department_id = 10 的数据行,还会在检索过程中同时检查 salary > 5000 这个条件,只将同时满足这两个条件的数据行返回给服务器层,减少了数据传输量和服务器层的处理负担。
开启和限制
  • 开启:在 MySQL 中,默认情况下引擎条件下推优化是开启的。可以通过设置 optimizer_switch 系统变量来控制其开关状态,例如:
-- 开启引擎条件下推优化
SET optimizer_switch = 'engine_condition_pushdown=on';
  • 限制:并非所有的查询条件都能进行下推,例如包含子查询、函数调用或某些复杂表达式的条件可能无法下推到存储引擎进行处理。

索引条件下推优化(Index Condition Pushdown Optimization)

索引条件下推优化(Index Condition Pushdown Optimization)

定义

索引条件下推(Index Condition Pushdown,简称 ICP)是 MySQL 数据库中一种重要的查询优化技术,主要用于提升查询性能。该优化技术允许 MySQL 在使用索引进行数据检索时,将部分 WHERE 子句中的条件下推到存储引擎层进行过滤,而不是像传统方式那样将所有满足索引范围的记录都返回给服务器层,再由服务器层进行过滤。

原理
  • 传统查询流程:在没有使用 ICP 优化时,存储引擎根据索引定位到符合索引条件的记录后,会将这些记录全部返回给服务器层,服务器层再根据 WHERE 子句中的其他条件进行过滤。
  • ICP 优化流程:当启用 ICP 时,存储引擎会在索引扫描过程中,将 WHERE 子句中可以使用索引进行判断的条件下推到存储引擎层进行过滤。只有满足这些条件的记录才会被读取并返回给服务器层,这样可以显著减少从存储引擎传输到服务器层的数据量,从而提高查询效率。
示例

假设有一个 employees 表,包含 idnamedepartment_idsalary 等列,并且在 department_idname 上创建了复合索引 idx_department_name (department_id, name)。执行以下查询:

SELECT * 
FROM employees 
WHERE department_id = 10 AND name LIKE 'J%';
  • 未使用 ICP 优化:存储引擎根据 idx_department_name 索引找到所有 department_id = 10 的记录,然后将这些记录全部返回给服务器层。服务器层再对这些记录进行过滤,筛选出 name LIKE 'J%' 的记录。
  • 使用 ICP 优化:存储引擎在扫描 idx_department_name 索引时,会同时检查 department_id = 10name LIKE 'J%' 这两个条件。只有同时满足这两个条件的记录才会被读取并返回给服务器层,减少了不必要的数据传输和服务器层的处理负担。
开启和关闭
  • 默认情况:在 MySQL 5.6 及以上版本中,索引条件下推优化默认是开启的。
  • 手动控制:可以通过设置 optimizer_switch 系统变量来开启或关闭 ICP 优化。例如:
-- 开启 ICP 优化
SET optimizer_switch = 'index_condition_pushdown=on';
-- 关闭 ICP 优化
SET optimizer_switch = 'index_condition_pushdown=off';
适用场景和限制
  • 适用场景:当查询条件中包含可以使用索引进行过滤的部分,且表的数据量较大时,ICP 优化可以显著提高查询性能。
  • 限制:ICP 优化只适用于 MyISAMInnoDB 存储引擎。对于某些复杂的查询条件,如包含子查询、函数调用等,可能无法进行有效的 ICP 优化。

引擎条件下推优化和索引条件下推优化(Index Condition Pushdown Optimization)感觉是同一个东西?

引擎条件下推优化和索引条件下推优化有相似之处,但并不是同一个东西,下面从概念、条件应用范围、适用场景等方面来详细分析它们的区别和联系:

相似点

  • 核心目标一致:二者的主要目的都是为了减少从存储引擎传输到服务器层的数据量,从而提高查询性能。它们都尝试将原本在服务器层进行的部分过滤操作提前到存储引擎层执行,避免不必要的数据传输和处理。
  • 优化方式类似:都是通过将查询条件下推到更底层(存储引擎)来进行过滤,使得服务器层可以处理更少的数据,进而加快查询速度。

不同点

概念范畴
  • 引擎条件下推优化:是一个更宽泛的概念,它指的是将查询中的部分条件尽可能早地传递给存储引擎进行处理,这些条件不局限于索引相关的条件。只要存储引擎能够处理这些条件,就可以进行下推。
  • 索引条件下推优化(ICP):是一种特定的、基于索引的优化技术。它主要针对 WHERE 子句中那些可以利用索引进行判断的条件,将这些条件下推到存储引擎在索引扫描过程中进行过滤。
条件应用范围
  • 引擎条件下推优化:可以处理更多类型的条件,不仅仅依赖于索引。例如,一些不涉及索引列但存储引擎能够处理的条件也可能会被下推。
  • 索引条件下推优化:只关注那些可以利用索引来评估的条件。如果查询条件不能通过索引进行判断,就不会应用 ICP 优化。
适用场景
  • 引擎条件下推优化:适用于各种存储引擎和查询场景,尤其是当查询条件较为复杂,包含非索引列的过滤条件时,该优化可以发挥作用。
  • 索引条件下推优化:主要适用于存在合适索引的查询场景。当查询可以使用索引来定位数据,并且 WHERE 子句中有基于索引列的过滤条件时,ICP 优化能够显著提高性能。
示例对比
  • 引擎条件下推优化示例
SELECT * 
FROM products 
WHERE category = 'electronics' AND weight > 10;

如果存储引擎能够在数据读取时同时处理 category = 'electronics'weight > 10 这两个条件,那么引擎条件下推优化会将这两个条件都下推到存储引擎进行过滤。

  • 索引条件下推优化示例
SELECT * 
FROM employees 
WHERE department_id = 10 AND name LIKE 'J%';

假设在 department_idname 上有复合索引,索引条件下推优化会将 department_id = 10name LIKE 'J%' 这两个基于索引列的条件下推到存储引擎在索引扫描时进行过滤。

嵌套循环连接算法(Nested - Loop Join Algorithms)

在 MySQL 中,嵌套循环连接算法(Nested - Loop Join Algorithms)是用于执行表连接操作的基本算法之一,它有多种变体,每种变体在不同场景下具有不同的性能表现。下面为你详细介绍这些算法及其在 MySQL 中的应用。

1. 简单嵌套循环连接(Simple Nested - Loop Join,SNLJ)

原理

简单嵌套循环连接是最基础的嵌套循环连接算法。它使用两层嵌套循环,外层循环遍历驱动表的每一行,对于驱动表的每一行,内层循环遍历被驱动表的所有行,检查是否满足连接条件,若满足则将这两行组合添加到结果集中。

示例 SQL 及分析
SELECT * 
FROM table1
JOIN table2 ON table1.id = table2.id;

当 MySQL 采用简单嵌套循环连接算法执行该查询时,会逐行读取 table1 中的每一行,然后针对 table1 中的每一行,遍历 table2 中的所有行,比较 table1.idtable2.id 是否相等。

性能特点

时间复杂度为 O ( m ∗ n ) O(m * n) O(mn),其中 m m m 是驱动表的行数, n n n 是被驱动表的行数。当表的数据量较大时,性能会非常差,因为需要进行大量的比较操作。

2. 块嵌套循环连接(Block Nested - Loop Join,BNLJ)

原理

为了减少内层循环中被驱动表的扫描次数,块嵌套循环连接引入了一个缓冲区。它将驱动表的数据分成多个块,每次将一个块的数据加载到缓冲区中,然后对被驱动表进行一次扫描,将缓冲区中的每一行与被驱动表的每一行进行比较。

示例 SQL 及分析
SELECT * 
FROM orders
JOIN customers ON orders.customer_id = customers.customer_id;

假设 orders 表是驱动表,customers 表是被驱动表。MySQL 会将 orders 表的数据按一定大小分成块,每次将一个块的数据放入 join_buffer 中,然后扫描 customers 表,将 join_buffer 中的

相关文章:

MySql面试总结(二)

WHERE 子句优化 截至2024年7月,MySQL最新稳定版本是8.2,并不存在MySQL 8.4 。下面从常见的几个方面为你介绍 MySQL 8.x 中 WHERE 子句的优化方法: 1. 确保使用索引 原理:索引可以加快数据的查找速度,当 WHERE 子句中的条件列有索引时,MySQL 可以直接定位到符合条件的数…...

Pytorch中的主要函数

目录 一、torch.manual_seed(seed)二、torch.cuda.manual_seed(seed)三、torch.rand(*size, outNone, dtypeNone, layouttorch.strided, deviceNone, requires_gradFalse)四、给大家写一个常用的自动选择电脑cuda 或者cpu 的小技巧五、torch.version.cuda&#xff1b;torch.bac…...

Java实现大数据量导出报表

一、实现方式 在Java中&#xff0c;导出数据到Excel有多种方式&#xff0c;每种方式都有其优缺点&#xff0c;适用于不同的场景。以下是常见的几种方式及其特点&#xff1a; 1.1 Apache POI Apache POI 是 Java 中最流行的库&#xff0c;支持读写 Excel 文件&#xff08;包括…...

大语言模型 智能助手——既能生成自然语言回复,又能在必要时调用外部工具获取实时数据

示例代码&#xff1a; import json from langgraph.graph import Graph, END,StateGraph from langchain_core.utils.function_calling import convert_to_openai_function from langchain_community.tools.openweathermap import OpenWeatherMapQueryRun from langchain_core…...

PyTorch 系统教程:理解机器学习数据分割

数据分割是机器学习中的一个基本概念&#xff0c;它直接影响模型的性能和泛化。在本文中&#xff0c;我们将深入研究为什么数据分割在机器学习中很重要&#xff0c;并演示如何使用PyTorch有效地实现它。 理解数据分割 数据分割是将数据集划分为单独的组以进行训练、验证和测试…...

分水岭算法(Watershed Algorithm)教程:硬币分割实例

import cv2 import numpy as np# 1. 图像预处理 img cv2.imread("./water/water_coins.jpeg") gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV cv2.THRESH_OTSU) kernel np.ones((3, 3), np.int8)…...

【STM32项目实战系列】基于STM32G474的FDCAN驱动配置

前言&#xff1a;本周工作中用到了CANFD的驱动&#xff0c;由于以前都是用到的CAN2.0&#xff0c;所以过程并不是特别的顺利&#xff0c;所以中间遇到几个比较小的问题导致自己卡住了一段时间&#xff0c;特此记录一下并完全奉上自己的配置的源码。 1&#xff0c;CANFD配置与简…...

shell文本处理

shell文本处理 一、grep ​ 过滤来自一个文件或标准输入匹配模式内容。除了 grep 外&#xff0c;还有 egrep、fgrep。egrep 是 grep 的扩展&#xff0c;相当于 grep -E。fgrep 相当于 grep -f&#xff0c;用的比较少。 用法 grep [OPTION]... PATTERN [FILE]...支持的正则描述…...

如何利用客户端双向TLS认证保护云上应用安全

双向TLS(mTLS)通过要求服务器和客户端双方使用数字证书来验证彼此身份&#xff0c;从而扩展了传统TLS的安全性。常规的TLS只会验证服务器的身份(如大家的浏览器在验证网站时的场景)&#xff0c;而mTLS确保在任何数据交换发生之前&#xff0c;双方都对彼此持有信任。在本文中&am…...

nlp第十节——LLM相关

一、模型蒸馏技术 本质上是从一个大模型蒸馏出小模型&#xff0c;从小模型训练出来的概率分布&#xff08;如自回归模型预测下一个字的概率分布&#xff09;分别与大模型预测的概率分布和ground label求loss。与大模型预测的概率分布用KL散度求loss&#xff0c;与ground label用…...

T-SQL 语言基础: SQL 数据库对象元数据及配置信息获取

目录 介绍目录视图 获取表和架构名称获取列信息 信息架构视图 获取表信息获取列信息 系统存储过程和函数 获取对象列表获取对象详细信息获取约束信息获取数据库属性信息 总结引用 介绍 在 SQL 数据库管理中&#xff0c;获取数据库对象的元数据信息是至关重要的。元数据提供了…...

ue5 创建多列StreeView的方法与理解

创建StreeView的多列样式怎么就像是创建单行单列差不多&#xff1f;貌似就是在单行单列中加入了多列widget? 示例代码 DetailTabWidget #pragma once #include "TreeViewItemBase.h"class SDetailTabWidget : public SCompoundWidget {SLATE_BEGIN_ARGS(SDetailT…...

C# OnnxRuntime部署DAMO-YOLO香烟检测

目录 说明 效果 模型信息 项目 代码 下载 参考 说明 效果 模型信息 Model Properties ------------------------- --------------------------------------------------------------- Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Floa…...

陕西省地标-DB61/T 1121-2018 政务服务中心建设和运营规范

揭秘陕西省智慧政务服务中心新标准&#xff1a;打造高效便捷的服务新体验 随着信息化时代的深入发展&#xff0c;智慧政务已成为提升政府服务效率、优化营商环境的重要举措。陕西省作为全国政务改革的先行者&#xff0c;近期颁布了《陕西省地标-DB61_T 1121-2018 政务服务中心…...

UDP协议(20250303)

1. UDP UDP:用户数据报协议&#xff08;User Datagram Protocol&#xff09;&#xff0c;传输层协议之一&#xff08;UDP&#xff0c;TCP&#xff09; 2. 特性 发送数据时不需要建立链接&#xff0c;节省资源开销不安全不可靠的协议 //一般用在实时性比较高…...

【四.RAG技术与应用】【12.阿里云百炼应用(下):RAG的云端优化与扩展】

在上一篇文章中,我们聊了如何通过阿里云百炼平台快速搭建一个RAG(检索增强生成)应用,实现文档智能问答、知识库管理等基础能力。今天咱们继续深入,聚焦两个核心问题:如何通过云端技术优化RAG的效果,以及如何扩展RAG的应用边界。文章会穿插实战案例,手把手带你踩坑避雷。…...

Docker新手入门(持续更新中)

一、定义 快速构建、运行、管理应用的工具。 Docker可以帮助我们下载应用镜像&#xff0c;创建并运行镜像的容器&#xff0c;从而快速部署应用。 所谓镜像&#xff0c;就是将应用所需的函数库、依赖、配置等应用一起打包得到的。 所谓容器&#xff0c;为每个镜像的应用进程创建…...

【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架

【星云 Orbit • STM32F4】08. 用判断数据头来接收据的串口通用程序框架 1. 引言 本教程旨在帮助嵌入式开发小白从零开始&#xff0c;学习如何在STM32F407微控制器上实现一个基于串口的数据接收程序。该程序能够通过判断数据头来接收一串数据&#xff0c;并将其存储到缓冲区中…...

HSPF 水文模型建模方法与案例分析实践技术应用

在水文模拟领域&#xff0c;HSPF 模型&#xff08;Hydrological Simulation Program Fortran&#xff09;与 SWAT 模型一样&#xff0c;都是备受瞩目的水文模型软件。HSPF 模型因其强大的功能和简便的操作&#xff0c;在全球范围内得到了广泛应用。该模型不仅能够在缺乏测量数据…...

设置 CursorRules 规则

为什么要设置CursorRules&#xff1f; 设置 CursorRules 可以帮助优化代码生成和开发流程&#xff0c;提升工作效率。具体的好处包括&#xff1a; 1、自动化代码生成 &#xff1a;通过定义规则&#xff0c;Cursor 可以根据你的开发需求自动生成符合规定的代码模板&#xff0c…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...