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 索引设计宝典:原理、原则与实战案例深度解析
目录 前言第一章:索引设计的基础原则 (知其然,更要知其所以然)第二章:实战案例:电商订单系统的索引设计第三章:索引设计的实践流程总结结语 🌟我的其他文章也讲解的比较有趣😁,如果喜…...
如何租用服务器并通过ssh连接远程服务器终端
这里我使用的是智算云扉 没有打广告 但确实很便宜 还有二十小时免费额度 链接如下 注册之后 租用新实例 选择操作系统 选择显卡型号 点击租用 选择计费方式 选择镜像 如果跑深度学习的话 就选项目对应的torch版本 没有的话 就创建纯净的cuda 自己安装 点击创建实例 创建之后 …...
TikTok 账号运营干货:AI 驱动优化
TikTok 账号运营是一项需要全方位精心雕琢的工作。首先,账号资料的打造至关重要,务必保证完整且富有吸引力。头像要清晰醒目,能够直观传达账号的核心特色;昵称需简洁易记,方便用户快速识别与记忆;简介则要精…...
Redis 分布式锁
什么是分布式锁 在一个分布式的系统中, 也会涉及到多个节点访问同一个公共资源的情况. 此时就需要通过 锁 来做互斥控制, 避免出现类似于 "线程安全" 的问题 而 java 的 synchronized 或者 C 的 std::mutex, 这样的锁都是只能在当前进程中生效, 在分布式的这种多个进…...
Redis爆肝总结
一、基础 1.介绍 本质上是一个Key-Value类型的内存数据库,数据的加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。 速度快的根本原因 纯内存操作,性能非常出色,每秒可以处理超过10万次读写操作&a…...
Qt模块化架构设计教程 -- 轻松上手插件开发
概述 在软件开发领域,随着项目的增长和需求的变化,保持代码的可维护性和扩展性变得尤为重要。一个有效的解决方案是采用模块化架构,尤其是利用插件系统来增强应用的功能性和灵活性。Qt框架提供了一套强大的插件机制,可以帮助开发者轻松实现这种架构。 模块化与插件系统 模…...
[项目总结] 抽奖系统项目技术应用总结
🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏: 🧊 Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection与…...
【运维】基于Python打造分布式系统日志聚合与分析利器
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在分布式系统中,日志数据分散在多个节点,管理和分析变得复杂。本文详细介绍如何基于Python开发一个日志聚合与分析工具,结合Logstash和F…...
MySql(基础)
表名建议用 反引号 包裹(尤其是表名包含特殊字符或保留字时),但如果表名是普通字符串(如 user),可以省略。 注释(COMMENT 姓名) 数据库 1.查看数据库:show databases…...
怎样选择成长股 读书笔记(一)
文章目录 第一章 成长型投资的困惑一、市场不可预测性的本质困惑二、成长股的筛选悖论三、管理层评估的认知盲区四、长期持有与估值波动的博弈五、实践中的认知升级路径总结:破解困惑的行动框架 第二章 如何阅读应计制利润表一、应计制利润表的本质与核心原则1. 权责…...
系统思考:个人与团队成长
四年前,我交付的系统思考项目,今天学员的反馈依然深深触动了我。 我常常感叹,系统思考不仅仅是一场培训,更像是一场持续的“修炼”。在这条修炼之路上,最珍贵的,便是有志同道合的伙伴们一路同行࿰…...
并行发起http请求
1. 使用 axios Promise.all <template><input type"file" multiple change"handleFileUpload" /> </template><script> import axios from axios;export default {methods: {async handleFileUpload(event) {const files event…...
【数据结构入门训练DAY-31】组合的输出
本文介绍了如何使用深度优先搜索(DFS)算法解决数的组合问题。题目要求从1到n的自然数中选取r个数,输出所有可能的组合,并按字典顺序排列。文章详细描述了解题思路,包括建立数组存储数字、使用DFS递归处理候选数、以及如…...
leetcode0815. 公交路线-hard
1 题目: 公交路线 官方标定难度:难 给你一个数组 routes ,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路,第 i 辆公交车将会在上面循环行驶。 例如,路线 routes[0] [1, 5, 7] 表示第 0 辆公…...
花朵识别系统Python+深度学习+卷积神经网络算法+TensorFlow+人工智能
一、介绍 花朵识别系统。本系统采用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,并基于前期收集到的5种常见的花朵数据集(向日葵、玫瑰、蒲公英、郁金香、菊花)进行处理后进行模型训练,最…...
LLM 论文精读(四)LLM Post-Training: A Deep Dive into Reasoning Large Language Models
这是一篇2025年发表在arxiv中的LLM领域论文,是一篇非常全面的综述类论文,介绍了当前主流的强化学习方法在LLM上的应用,文章内容比较长,但建议LLM方面的从业人员反复认真阅读。 写在最前面 为了方便你的阅读,以下几点的…...
网址为 http://xxx:xxxx/的网页可能暂时无法连接,或者它已永久性地移动到了新网址
这是由于浏览器默认的非安全端口所导致的,所谓非安全端口,就是浏览器出于安全问题,会禁止一些网络浏览向外的端口。 避免使用6000,6666这样的端口 6000-7000有很多都不行,所以尽量避免使用这个区间 还有在云服务器中,…...
【C++】16.继承
C三大特性:封装,继承,多态 在前面的章节中,我们讲过了封装,也就是通过类和访问修饰符来进行封装。 接下来我们就来认识一下新的特性——继承 1. 继承的概念及定义 1.1 继承的概念 继承(inheritance)机制是面向对…...
LlamaIndex 第七篇 结构化数据提取
大型语言模型(LLMs)在数据理解方面表现出色,这也促成了它们最重要的应用场景之一:能够将常规的人类语言(我们称之为非结构化数据)转化为特定的、规范的、可被计算机程序处理的格式。我们将这一过程的输出称…...
PHP API安全设计四要素:构建坚不可摧的接口防护体系
引言:API安全的重要性 在当今前后端分离和微服务架构盛行的时代,API已成为系统间通信的核心枢纽。然而,不安全的API可能导致: 数据泄露:敏感信息被非法获取篡改风险:传输数据被中间人修改重放攻击&#x…...
英语16种时态
时态应用场合格式例子一般现在时表示经常、反复发生的动作,客观事实或普遍真理主语 动词原形(第三人称单数作主语时动词加 -s/-es)The sun rises in the east.一般过去时表示过去某个时间发生的动作或存在的状态主语 动词的过去式I visited…...
使用 goaccess 分析 nginx 访问日志
介绍 goaccess 是一个在本地解析日志的工具, 可以直接在命令行终端环境中使用 TUI 界面查看分析结果, 也可以导出为更加丰富的 HTML 页面. 官网: https://goaccess.io/ 下载安装 常见的 Linux 包管理器中都包含了 goaccess, 直接安装就行. 以 Ubuntu 为例: sudo apt instal…...
什么是中央税
中央税(又称国家税)是指由中央政府直接征收、管理和支配的税种,其收入全额纳入中央财政,用于保障国家层面的财政支出和宏观调控。中央税通常具有税基广泛、收入稳定、涉及国家主权或全局性经济调控的特点。 --- 中央税的核心特征…...
AI Agent(10):个人助手应用
引言 本文聚焦AI Agent在个人助手领域的应用,探讨其如何在个人生产力提升、健康与生活管理、学习与教育辅助以及娱乐与社交互动四个方面,为用户创造价值并解决实际问题。 AI个人助手正从简单的指令执行者逐渐发展为具有自主性、适应性和个性化能力的智能伙伴。这一转变不仅…...
力扣70题解
记录 2025.5.8 题目: 思路: 1.初始化:p 和 q 初始化为 0,表示到达第 0 级和第 1 级前的方法数。r 初始化为 1,表示到达第 1 级台阶有 1 种方法。 2.循环迭代:从第 1 级到第 n 级台阶进行迭代: p 更新为前…...
2025御网杯wp(web,misc,crypto)
文章目录 miscxor10图片里的秘密被折叠的显影图纸 Cryptoeasy_rsagift**1. 礼物数学解析****最终答案** 草甸方阵的密语easy-签到题baby_rsa webYWB_Web_xffYWB_Web_未授权访问easywebYWB_Web_命令执行过滤绕过反序列化 misc xor10 ai一把梭 根据题目中的字符串和提示&#…...
【深度学习】将本地工程上传到Colab运行的方法
1、将本地工程(压缩包)上传到一个新的colab窗口:如下图中的 2.zip,如果工程中有数据集,可以删除掉。 2、解压压缩包。 !unzip /content/2.zip -d /content/2 如果解压出了不必要的文件夹可以递归删除: #…...
多模态大语言模型arxiv论文略读(六十九)
Prompt-Aware Adapter: Towards Learning Adaptive Visual Tokens for Multimodal Large Language Models ➡️ 论文标题:Prompt-Aware Adapter: Towards Learning Adaptive Visual Tokens for Multimodal Large Language Models ➡️ 论文作者:Yue Zha…...
Lua再学习
因为实习的项目用到了Lua,所以再来深入学习一下 函数 函数的的多返回值 Lua中的函数可以实现多返回值,实现方法是再return后列出要返回的值的列表,返回值也可以通过变量接收到,变量不够也不会影响接收对应位置的返回值 Lua中传…...
Linux计划任务与进程
at 命令使用方法 at 命令可在指定时间执行任务,适用于一次性任务调度。以下是基本用法: 安装 atd 服务(如未安装) # Debian/Ubuntu sudo apt-get install at# CentOS/RHEL sudo yum install at启动服务 sudo systemctl start atd…...
JavaEE--文件操作和IO
目录 一、认识文件 二、 树型结构组织和目录 三、文件路径 1. 绝对路径 2. 相对路径 四、文件类型 五、文件操作 1. 构造方法 2. 方法 六、文件内容的读写——数据流 1. InputStream概述 2. FileInputStream概述 2.1 构造方法 2.2 示例 3. OutputStream概述 3.…...
k8s的节点是否能直接 curl Service 名称
在 Kubernetes 中,节点(Node)默认情况下不能直接通过 Service 的 DNS 名称(如 my-svc.default.svc.cluster.local)访问 Service。以下是详细分析和解决方案: 1. 默认情况下节点无法解析 Service 的 DNS 名…...
Mask-aware Pixel-Shuffle Down-Sampling (MPD) 下采样
来源 简介:这个代码实现了一个带有掩码感知的像素重排下采样模块,主要用于图像处理任务(如图像修复或分割)。 论文题目:HINT: High-quality INpainting Transformer with Mask-Aware Encoding and Enhanced Attentio…...
本贴会成为记录贴
这几天有些心力交瘁了 一方面带着对互联网下行的伤心,一方面是对未来的担忧 一转眼好像就是20 21那个 可以在宿舍肆意玩手机 大学生活 可是我不小了 是个26岁的人了 时间很快 快的就好像和自己开了一个玩笑 我以为可以找到一个自己足够喜欢的 可爱的人 可是我没有 …...
redis数据结构-04 (HINCRBY、HDEL、HKEYS、HVALS)
哈希操作:HINCRBY、HDEL、HKEYS、HVALS Redis 中的哈希功能极其丰富,让您能够以类似于编程语言中对象的方式存储和检索数据。本课将深入探讨具体的哈希操作,这些操作为操作以下结构中的数据提供了强大的工具: HINCRBY 、 HDEL 、…...
python 写一个工作 简单 番茄钟
1、图 2、需求 番茄钟(Pomodoro Technique)是一种时间管理方法,由弗朗西斯科西里洛(Francesco Cirillo)在 20 世纪 80 年代创立。“Pomodoro”在意大利语中意为“番茄”,这个名字来源于西里洛最初使用的一个…...
复现MAET的环境问题(自用)
我的配置是3090,CUDA Version: 12.4 配置环境时总有冲突,解决好的环境如下 如果你的配置也是CUDA12.4,可以把下面的配置信息保存成 environment.yml 文件 然后执行下面的代码创建环境即可 conda env export > environment.yml name:…...
PDF2zh插件在zotero中安装并使用
1、首先根据PDF2zh说明文档,安装PDF2zh https://github.com/guaguastandup/zotero-pdf2zh/tree/v2.4.0 我没有使用conda,直接使用pip安装pdf2zh (Python版本要求3.10 < version <3.12) pip install pdf2zh1.9.6 flask pypd…...
第二十三节:图像金字塔- 图像金字塔应用 (图像融合)
一、引言:视觉信息的层次化表达 在数字图像处理领域,图像金字塔(Image Pyramid)作为一种多尺度表示方法,自20世纪80年代提出以来,始终在计算机视觉领域扮演着关键角色。这种将图像分解为不同分辨率层次的结构化表示方法,完美地模拟了人类视觉系统对场景的多尺度感知特性…...
一种混沌驱动的后门攻击检测指标
摘要 人工智能(AI)模型在各个领域的进步和应用已经改变了我们与技术互动的方式。然而,必须认识到,虽然人工智能模型带来了显著的进步,但它们也存在固有的挑战,例如容易受到对抗性攻击。目前的工作提出了一…...
LeetCode 高频题实战:如何优雅地序列化和反序列化字符串数组?
文章目录 摘要描述题解答案题解代码分析编码方法解码方法 示例测试及结果时间复杂度空间复杂度总结 摘要 在分布式系统中,数据的序列化与反序列化是常见的需求,尤其是在网络传输、数据存储等场景中。LeetCode 第 271 题“字符串的编码与解码”要求我们设…...
leetcode 15. 三数之和
题目描述 代码: class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());int len nums.size();int left 0;int right 0;vector<vector<int>> res;for(int i 0;i <len…...
HTML难点小记:一些简单标签的使用逻辑和实用化
HTML难点小记:一些简单标签的使用逻辑和实用化 jarringslee 文章目录 HTML难点小记:一些简单标签的使用逻辑和实用化简单只是你的表象标签不是随便用的<div> 滥用 vs 语义化标签的本质嵌套规则的隐藏逻辑SEO 与可访问性的隐形关联 暗藏玄机的表单…...
Linux : 31个普通信号含义
Linux : 31个普通信号 信号含义特殊的两个信号 信号含义 信号编号信号名信号含义1SIGHUP如果终端接口检测到一个连接断开,则会将此信号发送给与该终端相关的控制进程,该信号的默认处理动作是终止进程。2SIGINT当用户按组合键(一般…...
软件测试都有什么???
文章目录 一、白盒测试(结构测试)二、黑盒测试(功能测试)三、灰盒测试四、其他测试类型五、覆盖准则对比六、应用场景 软件测试主要根据测试目标、技术手段和覆盖准则进行分类。分为白盒测试、黑盒测试、灰盒测试及其他补充类型 一…...
LangGraph框架中针对MCP协议的变更-20250510
MCP(Model Context Protocol)的出现为AI Agent与外部工具及数据源的集成提供了标准化接口,而LangGraph作为基于LangChain的智能体开发框架,在MCP协议的影响下也进行了适配性调整,主要体现在工具调用、异步交互和多步推…...
YashanDB(崖山数据库)V23.4 LTS 正式发布
2024年回顾 2024年11月我们受邀去深圳参与了2024国产数据库创新生态大会。在大会上崖山官方发布了23.3。这个也是和Oracle一样采用的事编年体命名。 那次大会官方希望我们这些在一直从事在一线的KOL帮助产品提一些改进建议。对于这样的想法,我们都是非常乐于合作…...
二、transformers基础组件之Tokenizer
在使用神经网络处理自然语言处理任务时,我们首先需要对数据进行预处理,将数据从字符串转换为神经网络可以接受的格式,一般会分为如下几步: - Step1 分词:使用分词器对文本数据进行分词(字、字词);- Step2 构建词典:根据数据集分词的结果,构建…...
git 报错:错误:RPC 失败。curl 28 Failed to connect to github.com port 443 after 75000
错误:RPC 失败。curl 28 Failed to connect to github.com port 443 after 75000 ms: Couldnt connect to server致命错误:在引用列表之后应该有一个 flush 包 方法一: 直接换一个域名:把 git clone https://github.com/zx59530…...
软考 系统架构设计师系列知识点之杂项集萃(56)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(55) 第91题 商业智能关注如何从业务数据中提取有用的信息,然后采用这些信息指导企业的业务开展。商业智能系统主要包括数据预处理、建立()、数据分…...