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

【MongoDB篇】MongoDB的索引操作!

在这里插入图片描述

目录

    • 引言
    • 第一节:天生的“索引小能手”——`_id` 索引 🆔
    • 第二节:自己动手,丰衣足食——创建索引 🔑🛠️
    • 第三节:索引的“类型”——因“材”施“索”!🌳🔑
    • 第四节:索引的“体检”——看看我的索引们!👁️‍🗨️
    • 第五节:索引的“移除”——清理不再需要的索引!🧹
    • 第六节:索引的“诊断”——你的查询真的用了索引吗?📊🤔
    • 第七节:索引策略与最佳实践——让索引发挥最大效用!🏆
    • 第八节:总结索引操作!🔑💪

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning

看之前可以先了解一下MongoDB是什么:【MongoDB篇】万字带你初识MongoDB!

引言

咱们的 MongoDB 探索之旅一路走来,已经认识了仓库(数据库)、文件柜(集合),也掌握了对文件(文档)的 CRUD 操作。现在,是时候给我们的文件柜装上一个“快速检索系统”了!

了解数据库操作请看:【MongoDB篇】MongoDB的数据库操作!
了解集合操作请看:【MongoDB篇】MongoDB的集合操作!
了解文档操作请看:【MongoDB篇】MongoDB的文档操作!

没错,我们要讲解的,是让 MongoDB 查询飞起来的“秘密武器”——索引 (Index)!🔑


想象一下,你的文件柜里装了几百万个包裹📦。如果有人问你:“找出所有名字里包含‘架构师’的包裹”,如果你没有索引,你得把文件柜里所有的包裹一个一个拿出来,打开,看看名字,再放回去… 这得多慢啊!😩 这就是数据库里的全集合扫描 (Full Collection Scan - COLLSCAN),速度慢、效率低,特别是在数据量大的时候,简直是性能杀手!🐢💥

那索引是干啥的呢?索引就像是:

  • 图书馆的书籍目录:你可以快速找到某本书在哪里,而不用翻遍整个图书馆。📚➡️🔍
  • 书本后面的索引页:你想找书里某个特定词或概念出现的地方,查索引页能直接告诉你页码。📖➡️📍

在 MongoDB 里,索引是一种特殊的数据结构(通常是 B-tree),它存储了集合中一个或多个字段的值,并且这些值是有序的!每个索引项都指向原始文档在集合中的位置。

当你在一个有索引的字段上进行查询时,MongoDB 不用再扫描整个集合,而是去扫描这个有序的、通常比集合小得多的索引。在索引中找到匹配项后,直接通过索引项指向的“指针”快速定位到原始文档的位置,大大提高了查询速度!⚡️

核心目的: 提高读取 (Read) 操作的性能,特别是查询 (find) 和排序 (sort) 的速度。

第一节:天生的“索引小能手”——_id 索引 🆔

首先,MongoDB 有一个天生自带的、非常特殊的索引:_id 字段上的索引

在你创建任何集合时,MongoDB 会自动在 _id 字段上创建一个唯一的 (Unique)单字段索引 (Single Field Index)

这意味着:

  • 每个文档的 _id 都是唯一的,MongoDB 会强制保证这一点。
  • 通过 _id 查找文档速度飞快,因为 MongoDB 可以直接通过索引定位到目标文档!⚡

所以,如果你知道文档的 _id,通过 db.collection.findOne({ _id: ... })db.collection.find({ _id: { $in: [...] } }) 进行查询是最高效的方式!

第二节:自己动手,丰衣足食——创建索引 🔑🛠️

除了自带的 _id 索引,你可以根据你的查询需求,为其他字段或字段组合创建索引。

创建索引使用 db.collection.createIndex(keys, options) 命令。

  • keys: <document>:一个文档,指定要在哪些字段上创建索引,以及索引的方向。
    • { field: 1 }:在 field 字段上创建升序 (Ascending) 索引。
    • { field: -1 }:在 field 字段上创建降序 (Descending) 索引。
    • 可以指定多个字段来创建复合索引 (Compound Index){ field1: 1, field2: -1, ... }。字段的顺序非常重要!🔑➡️➡️➡️
  • options: <document>:一个可选的文档,用于指定索引的额外配置。

创建索引示例:

use mydatabase;// 在 name 字段上创建升序索引
db.users.createIndex({ name: 1 });// 在 age 字段上创建降序索引
db.users.createIndex({ age: -1 });// 在 city 和 age 字段上创建复合索引 (先按 city 升序,再按 age 降序)
db.users.createIndex({ city: 1, age: -1 });// 在 email 字段上创建唯一索引 (确保 email 不重复)
db.users.createIndex({ email: 1 }, { unique: true });// 在 status 字段上创建稀疏索引 (只索引存在 status 字段的文档)
db.users.createIndex({ status: 1 }, { sparse: true });// 在 created_at 字段上创建 TTL 索引,文档在创建后 3600 秒 (1小时) 自动过期删除
db.users.createIndex({ created_at: 1 }, { expireAfterSeconds: 3600 });// 在 tags 数组字段上创建多键索引 (Multikey Index) - 通常只需指定字段和方向
db.products.createIndex({ tags: 1 });// 在 content 字段上创建文本索引,用于全文搜索
db.articles.createIndex({ content: "text" });// 在 location 字段上创建 2dsphere 地理空间索引
db.places.createIndex({ location: "2dsphere" });// 创建一个带自定义名称的索引
db.users.createIndex({ name: 1, city: 1 }, { name: "name_city_idx" });

常用索引选项详解:

  • unique: <boolean>:如果设置为 true,MongoDB 会强制确保索引字段的值在集合中是唯一的。插入或更新时,如果某个文档的该字段值与已有文档重复,操作会失败。可以用作强制数据唯一性约束,比如邮箱、用户名等。🎯
  • sparse: <boolean>:如果设置为 true,索引只会包含那些文档中存在被索引字段的条目。对于那些不包含该字段的文档,则不会创建索引条目。这可以节省索引空间,特别是当某个字段在很多文档中是可选或不存在的时候。比如一个 spouse_name 字段,只有已婚用户才有,为它创建稀疏索引就很合适。👍
  • name: <string>:为你的索引指定一个人类可读的名称。如果不指定,MongoDB 会根据索引字段和方向自动生成一个名称(比如 name_1, city_1_age_-1)。自定义名称可以让你更容易地管理和删除索引!强烈推荐在复合索引或带有特殊选项的索引上使用自定义名称!📝
  • expireAfterSeconds: <number>:将索引创建为 TTL (Time To Live) 索引。该索引用于让文档在创建或最后修改一段时间后自动过期并从集合中删除。时间基于被索引字段(通常是日期类型)的值加上指定的秒数。非常适合存储会过期的缓存数据、日志、会话信息等等。⏳💥
  • weights: <document>:仅用于文本索引。当你对多个字段创建文本索引时,可以使用 weights 指定不同字段的权重,影响搜索结果的相关性评分。权重越高,该字段中的匹配项对评分影响越大。⚖️
  • default_language: <string>:仅用于文本索引。指定文本索引使用的默认语言,影响分词和词干提取规则。
  • collation: <document>:在创建字符串字段上的索引时,可以指定排序规则。这样,基于该索引的查询、排序、分组等操作就会按照指定的语言规则进行字符串比较。这对于处理中文、德文等非英文语言非常重要!🌍🗣️

第三节:索引的“类型”——因“材”施“索”!🌳🔑

MongoDB 支持多种索引类型,每种类型都有其特定的用途和优势:

  1. 单字段索引 (Single Field Index):最简单也最常见的索引,只在一个字段上创建。适用于对单个字段进行频繁查询和排序的场景。
  2. 复合索引 (Compound Index):在多个字段上创建的索引。字段的顺序非常重要! 复合索引首先按照第一个字段的值排序,然后在第一个字段值相同的情况下,再按照第二个字段的值排序,以此类推。
    • Prefix Compression (前缀压缩):复合索引可以支持对索引前缀字段的查询。比如你在 { city: 1, age: -1 } 上创建了索引,那么基于 { city: "北京" } 的查询可以使用这个索引,基于 { city: "北京", age: { $gt: 30 } } 的查询也可以使用这个索引。但基于 { age: { $gt: 30 } } 的查询则无法完全使用这个索引(可能只能进行全索引扫描或全集合扫描)。
    • ESAR 规则:通常,创建复合索引时,遵循 “Equality, Sort, Array, Range” (相等、排序、数组、范围) 的字段顺序规则,可以最大限度地发挥索引的效率。先放用于相等匹配的字段,再放用于排序的字段,然后是数组字段,最后是用于范围查询的字段。
  3. 多键索引 (Multikey Index):当你对一个数组字段创建索引时,MongoDB 会自动创建多键索引。它会为数组中的每个元素创建独立的索引条目,使得你可以通过数组中的任何元素快速查找包含该元素的文档。非常适合查询包含特定标签、技能等列表的文档。🏷️
  4. 文本索引 (Text Index):专门用于支持全文搜索 (Full-Text Search)。它会对字符串字段进行分词、词干提取等处理,然后建立索引。你可以使用 $text 操作符进行搜索,并可以通过 $meta: "textScore" 获取相关性评分。注意一个集合只能有一个文本索引。📖🔍
  5. 地理空间索引 (Geospatial Index):用于支持对地理位置数据的查询。
    • 2dsphere:基于球面几何,适用于查询地球表面上的位置数据(如经纬度),支持 $geoWithin, $geoIntersects, $nearSphere 等操作符。推荐使用! 🌍📍
    • 2d:基于平面几何,适用于处理平面坐标系中的位置数据。
  6. 哈希索引 (Hashed Index):在字段值的哈希值上建立索引。哈希索引只支持等值匹配查询,不支持范围查询。主要用途之一是用于分片 (Sharding),作为分片键时可以实现更均匀的数据分布。🔑➡️🔢
  7. TTL 索引 (Time To Live Index):如前所述,基于时间自动删除文档。
  8. 唯一索引 (Unique Index):如前所述,强制字段值的唯一性。
  9. 稀疏索引 (Sparse Index):如前所述,只索引存在字段的文档。

理解这些索引类型以及它们的适用场景,是设计高效数据库模式和优化查询性能的关键!🏆

第四节:索引的“体检”——看看我的索引们!👁️‍🗨️

想知道你的集合上已经创建了哪些索引?就像体检报告一样,看看你的数据库健康状况!🩺

使用 db.collection.getIndexes() 命令。

use mydatabase;
db.users.getIndexes();

这个命令会返回一个数组,其中包含了该集合上所有索引的详细信息,包括索引名称、键定义、是否唯一、是否稀疏、是否 TTL 等等。

示例输出:

[{"v" : 2,"key" : { "_id" : 1 },"name" : "_id_","ns" : "mydatabase.users"},{"v" : 2,"key" : { "name" : 1 },"name" : "name_1","ns" : "mydatabase.users"},{"v" : 2,"key" : { "city" : 1, "age" : -1 },"name" : "city_1_age_-1","ns" : "mydatabase.users"},// ... 其他索引
]

你可以通过查看这里的 name 字段来获取索引的名称,方便后续删除索引。

第五节:索引的“移除”——清理不再需要的索引!🧹

某个索引不再用于查询了?或者你创建了更优的复合索引,旧的单字段索引可以删除了?就像清理旧书一样,可以删除不再需要的索引。

删除索引使用 db.collection.dropIndex(index) 命令。

  • index: 可以是索引名称(推荐!通过 getIndexes() 获取)或者索引键文档
use mydatabase;// 按索引名称删除索引 (假设前面创建了名为 name_city_idx 的索引)
db.users.dropIndex("name_city_idx");// 按索引键删除索引 (如果你没有给索引起名称)
db.users.dropIndex({ name: 1 });

警告: 删除索引也会影响依赖该索引的查询性能!在删除索引之前,请确保你了解该索引的作用以及删除后可能的影响!不要随意删除生产环境的索引! 💥

第六节:索引的“诊断”——你的查询真的用了索引吗?📊🤔

创建了索引不代表你的查询就一定能飞起来!有时候,你的查询语句或者索引的设计有问题,MongoDB 可能依然会进行全集合扫描!

如何知道你的查询有没有用上索引,以及它是如何执行的?请出 MongoDB 的“X 光机”——.explain() 方法!射线扫过你的查询语句,执行计划一览无余!🩺

在任何查询(find, aggregate, updateOne, deleteOne 等)后面加上 .explain() 方法,就可以看到 MongoDB 执行该操作的详细计划,而不会实际执行操作

db.users.find({ city: "北京", age: { $gt: 30 } }).sort({ age: 1 }).explain("executionStats");

explain() 方法可以接受不同的模式 (queryPlanner, executionStats, allPlansExecution),executionStats 模式会实际运行查询一小部分来收集更详细的统计信息,通常用于性能分析。

.explain() 的输出是一个复杂的文档,但最核心的部分是查看 winningPlan (MongoDB 最终选择的执行计划) 和其中的 stage (执行阶段)。

  • stage: "COLLSCAN":危险信号!表示进行了全集合扫描!你的查询没有有效地利用索引!🚨
  • stage: "IXSCAN":好信号!表示使用了索引扫描!🚀
  • stage: "FETCH":表示根据索引找到文档位置后,去拉取完整的文档数据。
  • stage: "SORT":如果在 IXSCAN 之后出现 SORT 阶段,表示索引未能满足排序需求,MongoDB 不得不将结果加载到内存中进行排序,这可能很慢,特别是结果集很大时。如果索引能够覆盖排序字段(复合索引的排序字段在查询字段之后),SORT 阶段可能会被优化掉。

通过分析 .explain() 的输出,你可以了解你的索引是否被正确使用,你的查询语句是否高效,从而进行针对性的优化!这是 MongoDB 性能调优的必修课!🎓

慢查询日志 (Profiler): MongoDB 还有一个 Profiler 工具,可以记录执行时间超过阈值的操作,帮助你发现慢查询。在 Shell 中可以通过 db.setProfilingLevel(level, slowms) 来开启和配置。

第七节:索引策略与最佳实践——让索引发挥最大效用!🏆

创建索引是门艺术,也是门科学。遵循一些最佳实践,可以让你的索引发挥最大的效用:

  1. 为常用查询字段创建索引:所有在 find() 的查询条件、sort() 的排序字段,以及聚合管道中 $match 阶段的过滤字段,都是索引的重点关注对象。
  2. 理解复合索引的顺序 (ESAR):优先放置用于相等匹配的字段,然后是排序字段,接着是数组字段,最后是范围查询字段。这能让一个复合索引支持更多不同类型的查询。
  3. 考虑覆盖查询 (Covered Queries):如果你的索引包含了查询需要的所有字段,包括查询条件中的字段和投影中需要的字段,MongoDB 可以直接从索引中返回结果,而无需去拉取原始文档!这称为覆盖查询,速度非常快!⚡️
  4. 不要创建过多的索引:索引虽然能提高读性能,但会降低写性能(插入、更新、删除),因为每次写操作都需要更新索引结构。同时,索引也会占用磁盘空间和内存。权衡读写比例,只为真正需要优化的查询创建索引。🔪
  5. 监控索引的使用情况:使用 .explain() 或 Profiler 监控索引是否被有效使用。MongoDB 也有命令可以查看索引的使用统计信息。
  6. 定期审查和优化索引:随着应用的发展和查询模式的变化,定期审查现有的索引是否仍然有效,删除不必要的索引,创建新的索引。
  7. 在后台创建索引:对于大型集合,创建索引是一个耗时的操作,可能会阻塞其他数据库操作。在旧版本中,可以使用 background: true 选项在后台创建索引(创建过程中不阻塞读写)。在新版本中,索引创建默认就是在线的,不会阻塞读写(除了某些特定情况)。

创建和管理索引是 MongoDB 性能调优的核心。投入时间和精力去学习和实践索引的使用,会让你的 MongoDB 数据库运行得更顺畅、更高效!🎢

第八节:总结索引操作!🔑💪

太棒了!我们深入了解了 MongoDB 的“加速器”——索引!从它的原理、各种类型、创建、查看、删除,到如何通过 .explain() 诊断索引的使用,以及一些重要的索引策略和最佳实践!

核心要点回顾:

  • 索引通过有序结构加速查询和排序。
  • _id 字段自动带唯一索引。
  • createIndex() 创建索引,可以指定单字段复合等类型。
  • 选项unique, sparse, expireAfterSeconds, weights, collation 控制索引行为。
  • 常见索引类型包括单字段、复合、多键、文本、地理空间、哈希、TTL
  • getIndexes() 查看集合上的索引。
  • dropIndex() 删除索引(按名称或键)。
  • .explain() 诊断查询执行计划,查看是否使用了索引 (IXSCAN vs COLLSCAN)。
  • 最佳实践包括为查询字段建索引、理解复合索引顺序、考虑覆盖查询、避免过多索引等。

掌握了索引,就像给你的查询装上了涡轮增压引擎!💨 现在,你可以开始分析你的应用中的慢查询,并为它们创建合适的索引了!

继续加油!让你的 MongoDB 数据库飞沙走石吧!🚀


相关文章:

【MongoDB篇】MongoDB的索引操作!

目录 引言第一节&#xff1a;天生的“索引小能手”——_id 索引 &#x1f194;第二节&#xff1a;自己动手&#xff0c;丰衣足食——创建索引 &#x1f511;&#x1f6e0;️第三节&#xff1a;索引的“类型”——因“材”施“索”&#xff01;&#x1f333;&#x1f511;第四节…...

写劳动节前的 跨系统 文件传输

功能说明&#xff1a; 协议隐身&#xff1a;流量伪装为HTTPS图片传输 动态混淆&#xff1a;每个数据包添加随机填充 军用级擦除&#xff1a;临时文件三次覆写清除 抗分析&#xff1a;随机传输时间间隔和端口跳跃 隐蔽通道&#xff1a;ALTSHIFTC触发隐藏控制台 网络架构建…...

腾讯元宝桌面客户端:基于Tauri的开源技术解析

2025年3月,腾讯元宝宣布上线电脑客户端版本,支持Windows和macOS系统。作为腾讯旗下的AI助手产品,腾讯元宝桌面端采用了Tauri而非传统的Electron作为其跨平台开发框架,这一技术选择体现了腾讯对应用性能、安全性和用户体验的重视。本文将依据腾讯元宝桌面客户端的用户规则中…...

重塑驾乘体验!哈曼Ready系列引爆「人车交互革命」

AI定义汽车趋势下&#xff0c;AI加速赋能整车辅助驾驶、智能座舱、智能底盘等各域。 以智能座舱为例&#xff0c;AI大模型的快速应用与迭代&#xff0c;推动智能座舱加速迈入“多模交互”阶段&#xff0c;融合视觉、听觉、触觉等感知技术&#xff0c;智能座舱向着终极形态演进…...

第二章-科学计算库NumPy

第二章-科学计算库NumPy Numpy 作为高性能科学计算和数据分析的基础包,是其他重要数据分析工具的基础, 掌握 NumPy 的功能及其用法, 将有助于后续其他数据分析工具的学习. 2.1 认识 NumPy 数组对象 NumPy 中最重要的一个特点就是其 N 维数组对象, 即 ndarray(别名 array) 对象…...

3.2goweb框架GORM

GORM 是 Go 语言中功能强大的 ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;支持 MySQL、PostgreSQL、SQLite、SQL Server 等主流数据库。以下是 GORM 的核心概念和用法详解&#xff1a; ​​一、基础入门​​ 1. 安装 go get -u gorm.io/gorm go get -u gorm.io…...

KUKA机器人不同的用户权限详细介绍

对于KUKA机器人&#xff0c;主菜单里有一个“用户组”的登录&#xff0c;不同的用户组对应不同的权限。 一、KUKA示教器正常开机后显示以下界面&#xff0c;对于8.5及以上的系统&#xff0c;增加了快捷登录用户组的符号 &#xff0c;直接点击即可打开。在 smartHMI 上&…...

AI对IT行业的重塑:挑战与机遇并存的技术革命

一、必要性&#xff1a;AI成为IT行业的基础设施 在云计算、大数据和物联网构成的数字生态中&#xff0c;AI技术已成为IT行业的"水电煤"。以微软Azure为例&#xff0c;其AI云服务支撑着全球超过85%的《财富》500强企业&#xff0c;通过机器学习模型自动优化服务器集群…...

利用IEEE异常机制优化Fortran浮点数计算

利用IEEE异常机制优化Fortran浮点数计算 在Fortran程序中&#xff0c;IEEE浮点异常机制可以帮助你检测和优化浮点数计算&#xff0c;提高数值稳定性和程序健壮性。以下是几种利用IEEE异常机制优化浮点数计算的方法&#xff1a; 1. 启用和检测IEEE异常 现代Fortran&#xff0…...

构建网页版IPFS去中心化网盘

前言&#xff1a;我把它命名为无限网盘 Unlimited network disks&#xff08;ULND&#xff09;&#xff0c;可以实现简单的去中心化存储&#xff0c;其实实现起来并不难&#xff0c;还是依靠强大的IPFS&#xff0c;跟着我一步一步做就可以了。 第一步&#xff1a;准备开发环境…...

【solidity基础】一文说清楚合约函数的大小事

在 Solidity 里,函数是合约的关键构成部分,用于执行特定任务或操作的代码块,可以包含逻辑、访问状态变量、进行计算,并且可以接受参数和返回值。 但是solidity 的函数与其他语言不太一样,经常会有同学搞混,这里开一篇文章完整介绍一下 solidity 函数的用法。 1. 函数定…...

用Python构建自动驾驶传感器融合算法:从理论到实践

用Python构建自动驾驶传感器融合算法:从理论到实践 随着自动驾驶技术的飞速发展,传感器在自动驾驶系统中的作用愈发重要。传感器不仅是车辆感知外部环境的“眼睛”,它们提供的信息也是自动驾驶决策系统的基础。然而,单一传感器的感知能力是有限的。为了提升自动驾驶系统的…...

PLC与工业电脑:有什么区别?

随着工业部门的快速发展&#xff0c;自动化已经从奢侈品转变为绝对必需品。世界各地的工业越来越多地采用工业自动化来提高效率、提高精度并最大限度地减少停机时间。这场自动化革命的核心是两项关键技术&#xff1a;可编程逻辑控制器&#xff08;PLC&#xff09;和电脑&#x…...

机器学习:在虚拟环境中使用 Jupyter Lab

机器学习&#xff1a;在虚拟环境中使用 Jupyter Lab 第一步&#xff1a;激活虚拟环境 打开终端&#xff08;CMD/PowerShell&#xff09;并执行&#xff1a; $cmd #激活虚拟环境 $conda activate D:\conda_envs\mll_env 激活后&#xff0c;终端提示符前会显示环境名称&…...

Arduino项目实战与编程技术详解

一、智能避障小车:超声波传感器与PWM电机控制 1.1 硬件需求与工作原理 智能避障小车的核心在于超声波传感器与电机驱动模块的协同工作。超声波传感器(HC-SR04)通过发射高频声波并接收回波来测量距离,而L298N电机驱动模块则负责控制两个直流电机的转向与速度。 1.1.1 超声…...

AI数字人:人类身份与意识的终极思考(10/10)

文章摘要&#xff1a;AI数字人技术正在引发从"像素复刻"到"意识投射"的范式革命&#xff0c;多模态交互、神经辐射场等技术突破推动数字人从工具属性迈向虚拟主体。其发展伴随身份认同危机、伦理困境&#xff0c;促使人类重新思考自我认知与"人之为人…...

【单例模式】简介

目录 概念理解使用场景优缺点实现方式 概念理解 单例模式要保证一个类在整个系统运行期间&#xff0c;无论创建多少次该类的对象&#xff0c;始终只会有一个实例存在。就像操作系统中的任务管理器&#xff0c;无论何时何地调用它&#xff0c;都是同一个任务管理器在工作&#…...

安凯微以创新之芯,赋能万物智能互联新时代

在全球半导体产业步入深度调整期的当下&#xff0c;安凯微用一份“技术浓度”远超“财务数字”的年报&#xff0c;向市场传递出其作为物联网智能硬件核心SoC芯片领军者的战略定力。面对行业短期波动&#xff0c;公司选择以技术纵深突破与生态价值重构为锚点&#xff0c;在逆势中…...

TIME_WAIT状态+UDP概念及模拟实现服务器和客户端收发数据

目录 一、TIME_WAIT状态存在的原因 二、TIME_WAIT状态存在的意义 三、TIME_WAIT状态的作用 四、UDP的基本概念 4.1 概念 4.2 特点 五、模拟实现UDP服务器和客户端收发数据 5.1 服务器udpser 5.2 客户端udpcil 一、TIME_WAIT状态存在的原因 1.可靠的终止TCP连接。 2.…...

高并发内存池(五):性能测试与性能优化

前言 在前几期的实现中&#xff0c;我们完成了tcmalloc基础的内存管理功能&#xff0c;但还存在两个关键问题&#xff1a; 未处理超过256KB的大内存申请。 前期测试覆盖不足&#xff0c;导致多线程场景下隐藏了一些bug。 本文将修复这些问题&#xff0c;并实现三个目标&…...

景联文科技牵头起草的《信息技术 可扩展的生物特征识别数据交换格式 第4部分:指纹图像数据》国家标准正式发布

2025年3月28日&#xff0c;由景联文科技作为第一起草单位主导编制的国家标准GB/T 45284.4-2025 《信息技术 可扩展的生物特征识别数据交换格式 第4部分&#xff1a;指纹图像数据》正式获批发布&#xff0c;将于2025年10月1日开始实施。该标准的制定标志着我国生物特征识别领域标…...

完美解决 mobile-ffmpeg Not overwriting - exiting

在使用ffmpeg库 &#xff0c;有pcm转换到 aac的过程中报错 mobile-ffmpeg Not overwriting - exiting终于在网上翻到&#xff0c;在output 输出文件的地方加 -y, 重复覆盖的意思&#xff0c;完美解决。...

4:QT联合HALCON编程—机器人二次程序抓取开发(九点标定)

判断文件是否存在 //判断文件在不在 int HandEyeCalib::AnsysFileExists(QString FileAddr) {QFile File1(FileAddr);if(!File1.exists()){QMessageBox::warning(this,QString::fromLocal8Bit("提示"),FileAddrQString::fromLocal8Bit("文件不存在"));retu…...

C语言之操作符

目录 1. 操作符的分类 2. 移位操作符 2.1 左移操作符 << 2.2 右移操作符 >> 3. 位操作符 3.1 按位与 & 3.2 按位或 | 3.3 按位异或 ^ 3.4 按位取反 ~ 3.5 例题 3.5.1 按位异或 ^ 拓展公式 3.5.2 不能创建临时变量&#xff08;第三个变量&#xff…...

【优选算法 | 前缀和】前缀和算法:高效解决区间求和问题的关键

算法相关知识点可以通过点击以下链接进行学习一起加油&#xff01;双指针滑动窗口二分查找 在本篇文章中&#xff0c;我们将深入解析前缀和算法的原理。从基础概念到实际应用&#xff0c;带你了解如何通过前缀和高效解决数组求和、区间查询等问题。无论你是刚接触算法的新手&am…...

『深夜_MySQL』详解数据库 探索数据库是如何存储的

1. 数据库基础 1.1 什么是数据库 存储数据用文件就可以了&#xff0c;那为什么还要弄个数据库&#xff1f; 一般的文件缺失提供了数据的存储功能&#xff0c;但是文件并没有提供非常好的数据管理能力&#xff08;用户角度&#xff0c;内容方面&#xff09; 文件保存数据有以…...

Microsoft Entra ID 免费版管理云资源详解

Microsoft Entra ID(原 Azure AD)免费版为企业提供了基础的身份管理功能,适合小型团队或预算有限的组织。以下从功能解析到实战配置,全面展示如何利用免费版高效管理云资源。 1. 免费版核心功能与限制 1.1 功能概览 功能免费版支持情况基础用户与组管理✔️ 支持创建、删除…...

k8s -hpa

hpa定义弹性自动伸缩 1、横向伸缩,当定义的cpu、mem指标达到hpa值时,会触发pods伸展 2、安装metrics-server 收集pods的cpu。mem信息供hpa参照 安装helm curl -fsSl -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 用helm安装metr…...

Web应用开发指南

一、引言 随着互联网的迅猛发展&#xff0c;Web应用已深度融入日常生活的各个方面。为满足用户对性能、交互与可维护性的日益增长的需求&#xff0c;开发者需要一整套高效、系统化的解决方案。在此背景下&#xff0c;前端框架应运而生。不同于仅提供UI组件的工具库&#xff0c…...

Vue3 + TypeScript 实现 PC 端鼠标横向拖动滚动

功能说明 ​​拖动功能​​&#xff1a; 鼠标按下时记录初始位置和滚动位置拖动过程中计算移动距离并更新滚动位置松开鼠标后根据速度实现惯性滚动 ​​滚动控制​​&#xff1a; 支持鼠标滚轮横向滚动&#xff08;通过 wheel 事件&#xff09;自动边界检测防止滚动超出内容…...

MyBatis的SQL映射文件中,`#`和`$`符号的区别

在MyBatis的SQL映射文件中,#和$符号用于处理SQL语句中的参数替换,但它们的工作方式和使用场景有所不同。 #{} 符号 预编译参数:#{} 被用来作为预编译SQL语句的占位符。这意味着MyBatis会将你传入的参数设置为PreparedStatement的参数,从而防止SQL注入攻击,并允许MyBatis对…...

Python----卷积神经网络(池化为什么能增强特征)

一、什么是池化 池化&#xff08;Pooling&#xff09;是卷积神经网络&#xff08;CNN&#xff09;中的一种关键操作&#xff0c;通常位于卷积层之后&#xff0c;用于对特征图&#xff08;Feature Map&#xff09;进行下采样&#xff08;Downsampling&#xff09;。其核心目的是…...

React Native 从零开始完整教程(环境配置 → 国内镜像加速 → 运行项目)

React Native 从零开始完整教程&#xff08;环境配置 → 国内镜像加速 → 运行项目&#xff09; 本教程将从 环境配置 开始&#xff0c;到 国内镜像加速&#xff0c;最后成功运行 React Native 项目&#xff08;Android/iOS&#xff09;&#xff0c;适合新手和遇到网络问题的开…...

SNR8016语音模块详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 三、程序设计 main文件 usart.h文件 usart.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 SNR8016语音模块是智纳捷科技生产的一种离线语音识别模块&#xff0c;设计适合用于DIY领域&#xff0c;开放用户设…...

驱动开发系列54 - Linux Graphics QXL显卡驱动代码分析(一)设备初始化

一&#xff1a;概述 QXL 是QEMU支持的一种虚拟显卡&#xff0c;用于虚拟化环境中的图形加速&#xff0c;旨在提高虚拟机的图形显示和远程桌面的用户体验&#xff1b;QEMU 也称 Quick Emulator&#xff0c;快速仿真器&#xff0c;是一个开源通用的仿真和虚拟化工具&#xff0c;可…...

通过IP计算分析归属地

在产品中可能存在不同客户端&#xff0c;请求同一个服务端接口的场景。 例如小程序和App或者浏览器中&#xff0c;如果需要对请求的归属地进行分析&#xff0c;前提是需要先获取请求所在的国家或城市&#xff0c;这种定位通常需要主动授权&#xff0c;而用户一般是不愿意提供的…...

【网络原理】从零开始深入理解HTTP的报文格式(二)

本篇博客给大家带来的是网络HTTP协议的知识点, 续上篇文章,接着介绍HTTP的报文格式. &#x1f40e;文章专栏: JavaEE初阶 &#x1f680;若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅…...

【前缀和】二维前缀和(模板题)

DP35 【模板】二维前缀和 DP35 【模板】二维前缀和 ​ 给你一个 n 行 m 列的矩阵 A ,下标从 1 开始,接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2。 ​ 请输出以 (x1, y1) 为左上角,(x2,y2) 为右下角的子矩阵的和。 输入描述: ​ 第一行包含三个整数 …...

【开源工具】Python打造智能IP监控系统:邮件告警+可视化界面+配置持久化

&#x1f310;【开源工具】Python打造智能IP监控系统&#xff1a;邮件告警可视化界面配置持久化 &#x1f308; 个人主页&#xff1a;创客白泽 - CSDN博客 &#x1f525; 系列专栏&#xff1a;&#x1f40d;《Python开源项目实战》 &#x1f4a1; 热爱不止于代码&#xff0c;热…...

kotlin 过滤 filter 函数的作用和使用场景

1. filter 函数的作用 filter 是 Kotlin 集合操作中的一个高阶函数&#xff0c;用于根据指定条件从集合中筛选出符合条件的元素。 作用&#xff1a;遍历集合中的每个元素&#xff0c;并通过给定的 lambda 表达式判断是否保留该元素。返回值&#xff1a;一个新的集合&#xff…...

Java泛型(补档)

核心概念 Java 泛型是 Java SE 1.5 引入的一项重要特性&#xff0c;它的核心思想是 参数化类型&#xff08;Parameterized Types&#xff09;&#xff0c;即通过将数据类型作为参数传递给类、接口或方法&#xff0c;使代码能够灵活地处理多种类型&#xff0c;同时保证类型安全性…...

C语言发展史:从Unix起源到现代标准演进

C语言发展史&#xff1a;从Unix起源到现代标准演进 C语言的诞生与早期发展 C语言的起源可以追溯到上世纪70年代初期&#xff0c;但其真正的萌芽始于1969年的夏天。在计算机发展史上&#xff0c;这是一个具有划时代意义的时刻。 当时&#xff0c;Ken Thompson和Dennis Ritchi…...

nginx 代理时怎么更改 Remote Address 请求头

今天工作中遇到用 localhost 访问网站能访问后台 api&#xff0c;但是用本机IP地址后就拒绝访问&#xff0c;我怀疑是后台获取 Remote Address 然后设置白名单了只能 localhost 访问。 想用 nginx 更改 Remote Address server {listen 8058;server_name localhost;loca…...

解决STM32待机模式无法下载程序问题的深度探讨

在现代嵌入式系统开发中&#xff0c;STM32系列微控制器因其高性能、低功耗和丰富的外设资源而广受欢迎。然而&#xff0c;开发者在使用STM32时可能会遇到一个问题&#xff1a;当微控制器进入待机模式后&#xff0c;无法通过调试接口&#xff08;如SWD或JTAG&#xff09;下载程序…...

进程、线程、进程间通信Unix Domain Sockets (UDS)

进程、线程、UDS 进程和线程进程间通信Unix Domain Sockets (UDS)UDS的核心适用场景和用途配置UDS的几种主要方式socketpair() 基本配置流程socketpair() 进阶——传递文件描述符 补充socketpair() 函数struct msghdr 结构体struct iovecstruct cmsghdrstruct iovec 、struct m…...

大数据平台与数据仓库的核心差异是什么?

随着数据量呈指数级增长&#xff0c;企业面临着如何有效管理、存储和分析这些数据的挑战。 大数据平台和 数据仓库作为两种主流的数据管理工具&#xff0c;常常让企业在选型时感到困惑&#xff0c;它们之间的界限似乎越来越模糊&#xff0c;功能也有所重叠。本文旨在厘清这两种…...

Hadoop虚拟机中配置hosts

&#xff08; 一&#xff09;修改虚拟机的主机名 默认情况下&#xff0c;本机的名称叫&#xff1a;localhost。 我们进入linux系统之后&#xff0c;显示出来的就是[rootlocalhost ~]# 。为了方便后面我们更加便捷地访问这台主机&#xff0c;而不是通过ip地址&#xff0c;我们要…...

a-upload组件实现文件的上传——.pdf,.ppt,.pptx,.doc,.docx,.xls,.xlsx,.txt

实现下面的上传/下载/删除功能&#xff1a;要求支持&#xff1a;【.pdf,.ppt,.pptx,.doc,.docx,.xls,.xlsx,.txt】 分析上面的效果图&#xff0c;分为【上传】按钮和【文件列表】功能&#xff1a; 解决步骤1&#xff1a;上传按钮 直接上代码&#xff1a; <a-uploadmultip…...

QCefView应用和网页的交互

一、demo的主要项目文件 结合QCefView自带的demo代码 main.cpp #include #include <QCefContext.h> #include “MainWindow.h” int main(int argc, char* argv[]) { QApplication a(argc, argv); // build QCefConfig QCefConfig config; config.setUserAgent(“QCef…...

C++,设计模式,【建造者模式】

文章目录 通俗易懂的建造者模式&#xff1a;手把手教你造电脑一、现实中的建造者困境二、建造者模式核心思想三、代码实战&#xff1a;组装电脑1. 产品类 - 电脑2. 抽象建造者 - 装机师傅3. 具体建造者 - 电竞主机版4. 具体建造者 - 办公主机版5. 指挥官 - 装机总控6. 客户端使…...