MySQL 索引设计宝典:原理、原则与实战案例深度解析
目录
- 前言
- 第一章:索引设计的基础原则 (知其然,更要知其所以然)
- 第二章:实战案例:电商订单系统的索引设计
- 第三章:索引设计的实践流程总结
- 结语
🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等
如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning
前言
你好呀,数据库性能优化的同道们!🚀 索引是提升数据库查询性能的“核武器”,但正如“能力越大,责任越大”一样,索引用不好,也可能带来负面影响(比如降低写性能,占用磁盘空间)。所以,如何设计合适的索引,是每个开发者和 DBA 必备的技能。
索引设计没有放之四海而皆准的公式,它高度依赖于你的具体的业务场景和查询负载。但幸运的是,有一些通用的原则和方法论,可以指导我们做出更明智的设计决策。
第一章:索引设计的基础原则 (知其然,更要知其所以然)
就像盖房子得先打地基,设计索引也得先掌握基础原则。
1. 索引不是越多越好,更不是全表索引!
- 成本: 每个索引都需要占用磁盘空间。更重要的是,
INSERT
,UPDATE
,DELETE
操作时,数据库不仅要修改数据行,还要同步修改所有相关的索引。索引越多,写操作的开销越大,可能成为新的瓶颈。 - 优化器负担: 索引越多,查询优化器选择执行计划时需要考虑的可能性就越多,反而可能增加优化器的决策时间,甚至选错索引。
原则: 只为真正能提升性能、且频繁执行的查询创建索引。对写操作频繁的表,索引尤其要谨慎。
2. 索引应建在 WHERE
, JOIN
, ORDER BY
, GROUP BY
子句中引用的列上。
这是索引最主要的受益场景。
WHERE
:用于快速过滤数据行。这是最重要的索引候选区域。JOIN
: 用于快速找到关联表中的匹配行。JOIN
条件中的列在两边表中都应该考虑建索引。ORDER BY
/GROUP BY
:用于避免昂贵的排序(Filesort)和临时表(Using Temporary)操作。
原则: 优先考虑在这些子句中频繁出现的列上建索引。
3. 考虑列的“选择性”(Cardinality,区分度)。
选择性是指列中不重复值的比例。计算公式:COUNT(DISTINCT column) / COUNT(*)
。选择性越高,意味着该列的值越多样,通过该列进行条件过滤时,能越快地排除掉大量不符合条件的行。
- 高选择性: 主键、唯一键(如用户 ID, 订单号, 邮箱, 身份证号等)通常选择性很高,非常适合作为索引。
- 低选择性: 性别 (男/女/未知)、布尔状态 (0/1) 等选择性很低。单独对这类列建索引意义不大,因为查某个值可能还是需要扫描表中近一半的数据。
原则: 高选择性的列是独立的索引或联合索引前缀的优先选择。低选择性的列单独建索引效果有限,但可以在联合索引中与高选择性列组合使用,或者用于覆盖索引。
4. 谨慎选择数据类型。
- 越小越好: 索引存储的是列值,值越小,索引占用的空间越小,每个索引页能存储的索引条目越多,I/O效率越高。考虑使用
INT
而不是BIGINT
(如果数值范围允许),使用VARCHAR
时尽量预估合理长度。 - 固定长度更好:
INT
,CHAR
等固定长度类型比VARCHAR
等变长类型更容易索引和查找。 - 避免在索引中使用过长的字符串。 如果必须索引长字符串,可以考虑使用前缀索引(
VARCHAR(255)
, 索引时只取前 N 个字符,如INDEX (column(10))
)。但要注意前缀索引的选择性损失。
原则: 在满足业务需求的前提下,选择占用空间小、固定长度的数据类型作为索引列。
5. 理解并善用联合索引 (Composite Index)。
当查询条件或排序/分组涉及多个列时,联合索引往往比多个单列索引更有效。
- 最左前缀原则: 这是联合索引最重要的原理。对于联合索引
(colA, colB, colC)
,它可以被用于查询colA
,(colA, colB)
,(colA, colB, colC)
作为查询条件或排序/分组前缀的场景。但不能用于只查colB
,colC
,(colB, colC)
等不包含最左前缀列的场景。 - 列的顺序: 联合索引中列的顺序至关重要!通常将最常用在
WHERE
子句中进行等值过滤、或选择性最高的列放在最前面。然后根据WHERE
的范围过滤、GROUP BY
、ORDER BY
的需求依次排列。
原则: 分析查询模式,如果多个列经常一起出现在 WHERE
, JOIN
, ORDER BY
, GROUP BY
中,考虑建立联合索引。根据最左前缀原则精心设计列的顺序。
6. 追求覆盖索引 (Covering Index)。
如果一个索引包含了查询所需的所有列(SELECT
列表中的列和 WHERE
子句中的列),MySQL 可以直接从索引中返回数据,无需回表查询完整的行。这效率极高!EXPLAIN
的 Extra
列会显示 Using index
。
原则: 对于某些性能要求极高且列数量不多的查询,可以考虑创建包含所有所需列的覆盖索引。但这会增加索引的大小和写开销,需要权衡。
7. 定期审查和优化索引。
业务在发展,数据在变化,查询模式也可能随之改变。过去有效的索引,现在可能不再最优,甚至变成了累赘。
原则: 利用慢查询日志、性能监控工具,定期分析数据库负载,检查索引的使用情况(例如,通过 sys
库或 information_schema
),删除不再使用或效率低下的索引,为新的查询瓶颈创建索引。
8. EXPLAIN
是你的眼睛。
所有索引设计的猜想和优化都需要通过 EXPLAIN
来验证实际的执行计划。
原则: 设计或调整索引后,一定要使用 EXPLAIN
来查看目标查询是否使用了预期的索引,type
, key
, rows
, Extra
列的信息是否符合优化目标(例如,避免 Using filesort
, Using temporary
, ALL
, 减少 rows
,出现 Using index
)。
第二章:实战案例:电商订单系统的索引设计
理论说了不少,现在咱们结合一个具体的电商订单系统场景,来看看如何应用这些原则。
假设我们有以下简化版的表结构:
-- 用户表
CREATE TABLE users (user_id INT PRIMARY KEY AUTO_INCREMENT,username VARCHAR(50) UNIQUE NOT NULL,email VARCHAR(100) UNIQUE NOT NULL,registration_date DATE NOT NULL,city VARCHAR(50),-- ... 其他用户信息INDEX idx_user_regdate (registration_date) -- 按注册日期查找用户
);-- 商品表
CREATE TABLE products (product_id INT PRIMARY KEY AUTO_INCREMENT,product_name VARCHAR(100) NOT NULL,category_id INT,price DECIMAL(10, 2),-- ... 其他商品信息INDEX idx_product_category (category_id) -- 按分类查找商品
);-- 订单表
CREATE TABLE orders (order_id INT PRIMARY KEY AUTO_INCREMENT,user_id INT NOT NULL,order_time DATETIME NOT NULL,total_amount DECIMAL(10, 2) NOT NULL,status ENUM('Pending', 'Paid', 'Shipped', 'Completed', 'Cancelled') NOT NULL,city VARCHAR(50), -- 收货城市-- ... 其他订单信息INDEX idx_order_user_time (user_id, order_time), -- 按用户和时间查找订单INDEX idx_order_time (order_time) -- 按时间范围查找订单
);-- 订单项表 (一个订单包含多个商品)
CREATE TABLE order_items (order_item_id INT PRIMARY KEY AUTO_INCREMENT,order_id INT NOT NULL,product_id INT NOT NULL,quantity INT NOT NULL,price DECIMAL(10, 2) NOT NULL, -- 购买时的价格-- ... 其他订单项信息INDEX idx_item_order (order_id), -- 按订单查找订单项INDEX idx_item_product (product_id) -- 按商品查找订单项 (用于统计商品销量)
);
这些表结构和索引是一些初步的设计,基于一些常见的访问模式。现在,我们考虑一些具体的业务查询场景,并优化索引:
场景一:查询某个用户的订单历史,按时间倒序排列。
-- 业务需求:用户查看自己的订单列表
SELECT order_id, order_time, total_amount, status
FROM orders
WHERE user_id = 12345
ORDER BY order_time DESC;
- 分析:
WHERE
条件是user_id
等值查询,ORDER BY
是order_time
倒序。 - 现有索引:
idx_order_user_time (user_id, order_time)
。这个联合索引完美匹配了WHERE
和ORDER BY
的需求。user_id
作为联合索引的最左前缀用于过滤,order_time
紧随其后用于排序。MySQL 可以利用这个索引直接按照user_id
找到对应的订单,并按照order_time
的倒序读取索引条目,避免 Filesort。 - 优化: 现有索引已经很好。如果希望更进一步(比如查询非常频繁,且只需要这几个列),可以考虑将
total_amount
和status
加入到索引中,形成覆盖索引(user_id, order_time, total_amount, status)
。但这会增加索引大小和写开销。 EXPLAIN
验证:EXPLAIN SELECT order_id, order_time, total_amount, status FROM orders WHERE user_id = 12345 ORDER BY order_time DESC;
应该显示type: ref
,key: idx_order_user_time
,Extra
中没有Using filesort
,如果使用覆盖索引,Extra
会显示Using index
。
场景二:查询某个城市最近一周已支付的订单。
-- 业务需求:运营人员查看某个区域的近期订单情况
SELECT order_id, user_id, order_time, total_amount
FROM orders
WHERE city = 'Beijing'
AND order_time >= '2025-04-01' -- 示例日期
AND status = 'Paid'
ORDER BY order_time DESC
LIMIT 100; -- 通常会限制结果集
- 分析:
WHERE
条件包括city
(等值),order_time
(范围),status
(等值)。ORDER BY
是order_time
倒序。有LIMIT
。 - 现有索引:
idx_order_user_time (user_id, order_time)
(不适用,user_id 不在 WHERE 中),idx_order_time (order_time)
(可以用,但过滤性不够)。 - 问题: 现有的索引无法高效处理
city
和status
的过滤,也无法直接支持city
和order_time
的联合过滤和排序。很可能导致 Filesort 或全表扫描。 - 设计新索引:
- 考虑将
city
放在联合索引最前面(等值过滤,区分度可能不如 user_id 但比 status 高)。 - 然后是
order_time
(范围过滤,且用于排序)。 status
是低选择性,可以放在后面,或者如果查询非常频繁且需要覆盖,可以放在最后。- 考虑覆盖索引所需的列:
order_id
(主键自带),user_id
,total_amount
。 - 方案一 (核心过滤与排序):
INDEX idx_order_city_time (city, order_time)
。这个索引能利用city
过滤,利用order_time
进行范围扫描和排序(倒序扫描)。status
的过滤需要在回表后进行,user_id
和total_amount
也需要回表获取。 - 方案二 (包含状态过滤,可能伴随 ICP):
INDEX idx_order_city_time_status (city, order_time, status)
。这个索引可以利用city
过滤,order_time
范围扫描。理论上status
条件可以在扫描索引时下推过滤(ICP),减少回表。但status
选择性低,ICP 效果可能有限。 - 方案三 (覆盖索引):
INDEX idx_order_city_time_status_cover (city, order_time, status, user_id, total_amount)
。这能避免回表,性能可能最高,但索引体积大,写开销高。
- 考虑将
- 选择: 方案一通常是一个不错的折衷,它解决了主要的
city
过滤和order_time
排序问题。方案二可以尝试验证 ICP 的效果。方案三用于极致优化,但要评估写开销。对于这个场景,先尝试方案一或二,用EXPLAIN
和实际数据测试,如果性能瓶颈仍在,再考虑方案三。 EXPLAIN
验证: 使用EXPLAIN
查看不同索引方案的执行计划,对比type
,key
,rows
,Extra
(特别是看有没有Using filesort
,Using index condition
,Using index
)。
-- 示例新索引
CREATE INDEX idx_order_city_time ON orders (city, order_time);
-- 或者考虑包含 status 的索引
CREATE INDEX idx_order_city_time_status ON orders (city, order_time, status);
场景三:统计每个商品在一个月内的总销量。
-- 业务需求:商品销售报表
SELECT oi.product_id, p.product_name, SUM(oi.quantity) as total_sold
FROM order_items oi
JOIN products p ON oi.product_id = p.product_id
JOIN orders o ON oi.order_id = o.order_id -- 需要根据订单时间过滤
WHERE o.order_time >= '2025-04-01' AND o.order_time < '2025-05-01'
GROUP BY oi.product_id, p.product_name
ORDER BY total_sold DESC; -- 按销量排序(注意:聚合函数排序通常需要 Filesort)
-
分析: 涉及
order_items
,products
,orders
三表 JOIN。过滤条件在orders.order_time
(范围)。GROUP BY
在oi.product_id
和p.product_name
。ORDER BY
是聚合函数结果。 -
现有索引:
orders
表有idx_order_time (order_time)
(可以用于时间范围过滤),order_items
表有idx_item_order (order_id)
和idx_item_product (product_id)
,products
表有idx_product_category (category_id)
(与此查询无关)。 -
问题:
orders
表的时间过滤可以使用idx_order_time
。order_items
和products
的 JOIN 条件oi.product_id = p.product_id
在两表都有索引 (idx_item_product
和主键),JOIN 效率尚可。order_items
和orders
的 JOIN 条件oi.order_id = o.order_id
在order_items
有索引 (idx_item_order
),orders
的主键是order_id
,JOIN 效率也尚可。- 关键在于
GROUP BY oi.product_id, p.product_name
。product_name
在products
表,product_id
在order_items
表。跨表的 GROUP BY 通常难以直接利用一个索引进行分组。聚合结果的排序 (ORDER BY total_sold DESC
) 几乎肯定需要 Filesort。
-
设计新索引:
- 首先确保 JOIN 字段有索引,这已经有了 (
order_id
,product_id
)。 - 考虑
orders
表的时间过滤:idx_order_time (order_time)
是合适的。 - 优化 GROUP BY: 如果
product_id
在order_items
中非常频繁地用于分组,idx_item_product (product_id)
可以帮助按product_id
扫描和分组,但需要结合product_name
。由于product_name
来自products
表,MySQL 需要在 JOIN 后进行分组。 - 对于这种涉及跨表 GROUP BY 和聚合结果排序的复杂报表查询,通常难以完全避免
Using temporary
和Using filesort
。优化的重点在于确保前期的过滤和 JOIN 走索引,减少需要分组和排序的数据量。
- 首先确保 JOIN 字段有索引,这已经有了 (
-
可能的索引优化点:
- 确保
orders.order_time
有效索引,优化时间范围过滤。 - 确保 JOIN 字段 (
orders.order_id
,order_items.order_id
,order_items.product_id
,products.product_id
) 有效索引。现有索引已经覆盖了。 - 如果
product_id
的分组是瓶颈,idx_item_product (product_id)
可以提供帮助。
- 确保
-
EXPLAIN
验证: 运行EXPLAIN
查看 JOIN 顺序、类型 (type
)、使用的索引 (key
)。重点关注Extra
列是否有Using temporary
和Using filesort
。在这个场景下,它们很可能会出现,但如果前期的 JOIN 和过滤优化得当,Filesort 和临时表处理的数据量会大大减少。
-- 确保 JOIN 字段有索引 (已存在)
-- 确保 orders.order_time 有索引 (已存在)
更多场景和索引思考:
- 按商品分类和价格范围查询商品:
WHERE category_id = ... AND price BETWEEN ...
->INDEX (category_id, price)
。 - 按订单状态统计数量:
WHERE status = '...'
。Status 选择性低,单独索引意义不大。但如果经常和时间一起查WHERE status = '...' AND order_time >= ...
,可以考虑INDEX (status, order_time)
,status在前用于等值过滤,虽然过滤性弱,但可以利用order_time
进行范围扫描和排序。或者考虑INDEX (order_time, status)
,优先利用时间范围扫描,然后 status 可以在索引扫描过程中进行过滤(ICP)。哪个更好取决于实际数据分布和查询习惯,需要测试。 - 索引覆盖的评估: 如果某个查询
SELECT colA, colB FROM table WHERE colC = ...
频繁执行,且只需要colA, colB, colC
这三列,可以考虑INDEX (colC, colA, colB)
来实现覆盖索引。
第三章:索引设计的实践流程总结
结合上面的原则和实战,我们可以总结一个索引设计的实践流程:
- 分析业务需求和查询负载: 收集慢查询日志,了解哪些查询是瓶颈,它们涉及哪些表、哪些列,查询频率如何。
- 分析查询语句: 仔细查看慢查询的
WHERE
,JOIN
,ORDER BY
,GROUP BY
,SELECT
子句。 - 识别索引候选列: 找出最可能需要索引的列。
- 评估列的特点: 考虑列的选择性、数据类型、是否经常更新。
- 设计索引方案:
- 考虑单列索引、联合索引。
- 设计联合索引时,根据最左前缀原则和查询模式确定列的顺序。
- 考虑是否需要创建覆盖索引。
- 权衡读(查询)性能和写(写)性能的开销。
- 创建候选索引: 在测试环境创建你设计的索引。
- 使用
EXPLAIN
验证: 对目标慢查询运行EXPLAIN
,查看执行计划是否按照预期走了索引,是否有Using filesort
,Using temporary
等不良信息。对比优化前后的EXPLAIN
结果。 - 性能测试: 在接近生产环境的数据量和负载下进行实际的性能测试,对比查询响应时间。
- 部署到生产环境: 如果测试效果良好,谨慎地将索引变更部署到生产环境。
- 监控和审查: 持续监控数据库性能和索引使用情况,定期回顾和调整索引策略。
结语
索引设计是一个持续优化、不断学习的过程。没有一劳永逸的方案,只有最适合当前业务负载的索引。掌握索引的基础原理,理解 WHERE
, JOIN
, ORDER BY
, GROUP BY
如何利用索引,学会分析 EXPLAIN
输出,并结合具体的业务场景进行实践,你就能设计出高效的索引,让你的数据库查询飞沙走石!💨
希望这篇详细的索引设计宝典对你有所帮助!祝你的数据库永远丝滑流畅!👍
相关文章:

MySQL 索引设计宝典:原理、原则与实战案例深度解析
目录 前言第一章:索引设计的基础原则 (知其然,更要知其所以然)第二章:实战案例:电商订单系统的索引设计第三章:索引设计的实践流程总结结语 🌟我的其他文章也讲解的比较有趣😁,如果喜…...

C#上传文件到腾讯云的COS
测试环境: vs2022 .net 6控制台应用程序 测试步骤如下: 1 添加子用户,目前是为了拿到secretId和secretKey,打开添加子用户界面链接:https://console.cloud.tencent.com/cam 并为子用户添加API 密钥 2 通过链接htt…...
java的Stream流处理
Java Stream 流处理详解 Stream 是 Java 8 引入的一个强大的数据处理抽象,它允许你以声明式方式处理数据集合(类似于 SQL 语句),支持并行操作,提高了代码的可读性和处理效率。 一、Stream 的核心概念 1. 什么是 Str…...

C PRIMER PLUS——第9节:动态内存分配、存储类别、链接和内存管理
目录 1.动态内存分配 1.1 malloc 函数 1.2 calloc 函数 1.3 realloc 函数 1.4 free 函数 1.5常见错误 1.6综合例题 2.C语言的内存结构 3.存储类别 3.1作用域(Scope) 3.2链接(Linkage) 3.3存储期(Storage Du…...

作业...
基础配置 RI R2 R3 R4 R5 例如R1 BGP配置 1,R1和R2之间使用直连接口IP地址来建立EBGP对等体关系 2、R2、R3、R4之间配置OSPF协议,保证各设备之间的网络互通,且通过重发布的方式发布路由 查看R2、R3、R4的OSPF路由表: \ R2、R3、R4使用环…...

IC ATE集成电路测试学习——电流测试的原理和方法
电流测试 我们可以通过电流来判断芯片的工作状态时,首先先了解下芯片的电流是如何产生的。 静态电流 理论上,CMOS结构的芯片静态时几乎不耗电 CMOS基本结构:Pmos Nmos 串联当逻辑电平稳定时: ➜ 要么Pmos导通,Nmo…...
redis数据结构-03 (HMSET、HGET、HGETALL)
Redis 哈希介绍:HMSET、HGET、HGETALL Redis 哈希是一种强大的数据结构,允许您在单个键内存储字段值对的集合。它们对于表示对象、配置或任何可以自然分组到字段中的数据非常有用。本课将向您介绍使用 Redis 哈希的基本命令: HMSET 、 HGET …...
2025年01月09日德美医疗前端面试
目录 vue2 的双向绑定的原理vue3 的双向绑定原理vue 的生命周期vue 子组件为何不能修改父组件的值js delete 删除数组的某一个值会怎么样vue 和 react 的 diff 算法什么是闭包原型链this指向 vue2 的双向绑定的原理 以下是 Vue 2 双向绑定的原理: 1. 核心概念 …...

快速理解动态代理
什么是动态代理(Java核心技术卷1的解释) 动态代理是一种运行时生成代理对象的技术,其本质是通过字节码增强在不修改原始类代码的前提下,动态拦截并扩展目标对象的行为。它通过代理对象对原始方法的调用进行拦截,并在方法执行前后注入自定义逻…...
实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API
实战演练:用 AWS Lambda 和 API Gateway 构建你的第一个 Serverless API 理论千遍,不如动手一遍!在前面几篇文章中,我们了解了 Serverless 的概念、FaaS 的核心原理以及 BaaS 的重要作用。现在,是时候把这些知识运用起来,亲手构建一个简单但完整的 Serverless 应用了。 …...
spark算子介绍
目录 1. 转换算子(Transformation)1.1 常用转换算子 2. 行动算子(Action)2.1 常用行动算子 3. 转换算子与行动算子的区别4. 示例代码5. 总结 在Spark中,算子(Operator)是对数据集(RD…...

AugmentCode 非常昂贵的新定价
AugmentCode 现在的价格比 Cursor 和 Windsurf 的总和还要贵。 AugmentCode 曾是我开发工作流程的常用工具。出乎意料的是,他们改变了定价结构,让开发者们震惊不已。 原来的30 美元月费已经增长为50 美元月费,这是一个67%的增长。 改变我看法的不仅仅是价格上涨,还有他…...

前端面试2
1. 面试准备 1. 建立自己的知识体系 思维导图ProcessOn框架Vue elementUI自查 https://zh.javascript.info/ 借鉴 https://juejin.cn/post/6844904103504527374http://conardli.top/blog/article/https://github.com/mqyqingfeng/Bloghttp://47.98.159.95/my_blog/#html 2.技能…...

大疆卓驭嵌入式面经及参考答案
FreeRTOS 有哪 5 种内存管理方式? heap_1.c:这种方式简单地在编译时分配一块固定大小的内存,在整个运行期间不会进行内存的动态分配和释放。它适用于那些对内存使用需求非常明确且固定,不需要动态分配内存的场景,优点是…...
RAID磁盘阵列的概念(自用留档)
概念 RAID磁盘阵列是由若干个磁盘组成的磁盘组。 磁盘组可以恢复意外丢失的数据,保证了数据的安全性。 种类 根据实际情况的不同,RAID有若干种,以一个具有三块硬盘的硬盘组为例: RAID 0:将文件拆分成三份分别放到三…...
设计模式简述(十八)享元模式
享元模式 描述基本组件使用 描述 当内存中存在大量类似的对象时,可以考虑使用享元模式减少整体内存占用。 可以将相同的部分和不同的部分进行拆分,以达到多个对象共享相同部分内存的目的。 基本组件 通常享元对象通过共享的属性映射一个享元对象。 公…...

架构进阶:74页数据架构设计总体规划方案【附全文阅读】
本文讨论了数据资源规划在信息化战略规划中的重要性,详细阐述了数据资源规划的方法与过程,包括系统架构、业务能力模型、数据架构等。 文章指出,数据资源规划需要梳理企业级数据模型,明确数据分布和流向,建立统一的数据…...

情书大全v3.0.1
《情书大全》是一款致力于情书写作的手机应用程序,内置了丰富的情书范本及定制化服务。用户无论是想要倾诉爱意、交流友情还是传递亲情,都能在这款应用中寻得合适的情书样本。用户还可以根据自己的需求对模板进行编辑和调整,轻松创作出感人至…...

基于OpenCV的人脸识别:LBPH算法
文章目录 引言一、概述二、代码实现1. 代码整体结构2. 导入库解析3. 训练数据准备4. 标签系统5. 待识别图像加载6. LBPH识别器创建7. 模型训练8. 预测执行9. 结果输出 三、 LBPH算法原理解析四、关键点解析五、改进方向总结 引言 人脸识别是计算机视觉领域的一个重要应用&…...

鸿蒙 使用动画 简单使用
鸿蒙 使用动画 简单使用 动画就两个,属性动画和转场动画 属性动画只是组件的属性发生变化,而转场动画是指对将要出现或消失的组件做动画,而文档的其他动画只是给这两个动画效果锦上添花罢了 这篇文章简单介绍这两个动画,其他的…...
MySQL数据库迁移SQL语句指南
MySQL数据库迁移SQL语句指南 一、基础迁移方法 1. 使用mysqldump进行全量迁移 -- 导出源数据库(在命令行执行) mysqldump -u [源用户名] -p[源密码] --single-transaction --routines --triggers --events --master-data2 [数据库名] > migration…...

arcgis和ENVI中如何将数据输出为tif
一、arcgis中转换为tif 右键图层: Data -> Export Data, 按照图示进行选择,选择tiff格式导出即可,还可以选择其他类型的格式,比如envi。 二、 ENVI中转换为tif File -> Save As -> Save As (ENVI, NITF, TIFF, DTED) …...

RagFlow 完全指南(一):从零搭建开源大模型应用平台(Ollama、VLLM本地模型接入实战)
文章目录 1. 相关资源2. 核心特性3. 安装与部署3.1 环境准备3.2 部署RagFlow3.3 更新RagFlow3.4 系统配置 4. 接入本地模型4.1 接入 Ollama 本地模型4.1.1 步骤4.1.2 常见问题 4.2 接入 VLLM 模型 5. 应用场景6. 总结 1. 相关资源 官网GitHub文档中心 2. 核心特性 …...

计算机网络 4-2-1 网络层(IPv4)
2 IPv4分组 各协议之间的关系 IP协议(Internet Protocol, 网际协议)是互联网的核心! ARP协议用于查询同一网络中的<主机IP地址,MAC地址>之间的映射关系 ICMP协议用于网络层实体之间相互通知“异常事件” IGMP协议用于实现IP组播 2.1 结构<首…...
Python赋能自动驾驶:如何打造高效的环境感知系统
Python赋能自动驾驶:如何打造高效的环境感知系统 大家好,我是 Echo_Wish,今天我们来聊聊自动驾驶里的“眼睛”——环境感知系统,以及如何用 Python 实现它。 自动驾驶的核心目标是让车辆在没有人工干预的情况下安全行驶,而要做到这一点,环境感知系统必须实时获取并理解…...
ST表(稀疏表)
对ST表进行一个简单的总结,它可以实现O(1)的静态区间查询,可以适用于查询操作频繁但数据不修改的场景 题目来源 https://www.luogu.com.cn/problem/P3865 题目介绍 给定一个长度为 N 的数列,和 M 次询问,求出每一次询问的区间…...
Java常用类-比较器
目录 一、为什么需要比较器?二、核心差异速记表三、Comparable:对象自带的 “默认规则”1. 核心作用2. 源码定义3. 实战:给Student类加默认规则4. 源码验证(以Integer为例) 四、Comparator:临时的 “外部规…...

Python----机器学习(模型评估:准确率、损失函数值、精确度、召回率、F1分数、混淆矩阵、ROC曲线和AUC值、Top-k精度)
一、模型评估 1. 准确率(Accuracy):这是最基本的评估指标之一,表示模型在测试集上正确 分类样本的比例。对于分类任务而言,准确率是衡量模型性能的直观标准。 2. 损失函数值(Loss)࿱…...

Linux工作台文件操作命令全流程解析(高级篇之vim和nano精讲)
全文目录 1 简单易用的 Nano (入门之选)1.1 适用场景1.2 安装命令1.3 基础操作1.4 优点 2 功能强大的 Vim2.1 适用场景2.2 安装命令2.3 模式说明2.4 常用命令2.4.1 普通模式2.4.2 编辑模式2.4.3 可视模式2.4.4 命令行模式 3 参考文献 写在前面 作为运维或者研发,日…...

大数据产品销售数据分析:基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现
文章目录 大数据产品销售数据分析:基于Python机器学习产品销售数据爬虫可视化分析预测系统设计与实现一、项目概述二、项目说明三、研究意义四、系统总体架构设计总体框架技术架构数据可视化模块设计图后台管理模块设计数据库设计 五、开发技术介绍Flask框架Python爬…...