Mongodb重难点解析(二、初步提升)

本文介绍了MongoDB中的索引原理及其对查询性能的影响,并详细解释了如何建立不同类型的索引,包括唯一索引。此外,还探讨了数据库角色与权限设置的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  (总共4个部分,静下心来,玩转mongodb; 刚学还是热乎的,传上来不容易,欢迎指正学习!)

**

索引

**是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构;
索引记录中存有索引关键字和指向真正数据的指针。因为索引中只存关键字和指针所以索引的规模要比真正的表的规模小很多。其单独存放,且查询方式不一,mongodb的索引查询时用的为B树查询;

  1. 性能分析函数(explain)
    首先插入10w数据

这里写图片描述

name字段没有建立任何索引,查询一个“name10000”的姓名,性能分析
这里写图片描述

cursor:”BasicCursor”,就是说这里的查找采用的是“表扫描”,也就是顺序查找,
nscanned: 这里是10w,也就是说数据库浏览了10w个文档,
n: 这里是1,也就是最终返回了1个文档。
millis: 总共耗时114毫秒。

建立索引(ensureIndex),再次查询分析
这里写图片描述

cursor: ”BtreeCursor”,采用B树的结构来存放索引,索引名为后面的“name_1”。
nscanned: 数据库只浏览了一个文档就OK了。
n: 直接定位返回。
db.col.ensureIndex({“title”:1,”description”:-1}) 建立索引,1升,-1降
db.person.ensureIndex({“name”:1},{“unique”:true}) 建立唯一索引
也可以使用 hint 来强制 MongoDB 使用一个指定的索引。这种方法某些情形下会提升性能。
db.users.find({gender:”M”},{user_name:1,_id:0}).hint({gender:1,user_name:1})

索引不能被以下的查询使用:
• 正则表达式及非操作符,如 nin,not, 等。
• 算术运算符,如 mod,where 子句
所以,检测你的语句是否使用索引是一个好的习惯,可以用explain来查看

管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数。

MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理。管道操作是可以重复的。
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。

(1).数据库用户角色
    针对每一个数据库进行控制。
    read :提供了读取所有非系统集合,以及系统集合中的system.indexes, system.js, system.namespaces
    readWrite: 包含了所有read权限,以及修改所有非系统集合的和系统集合中的system.js的权限.

(2).数据库管理角色
    每一个数据库包含了下面的数据库管理角色。
    dbOwner:该数据库的所有者,具有该数据库的全部权限。
    dbAdmin:一些数据库对象的管理操作,但是没有数据库的读写权限。(参考:  http://docs.mongodb.org/manual/reference/built-in-roles/#dbAdmin)
    userAdmin:为当前用户创建、修改用户和角色。拥有userAdmin权限的用户可以将该数据库的任意权限赋予任意的用户。
### 使用Transformer模型进行图像分类的方法 #### 方法概述 为了使Transformer能够应用于图像分类任务,一种有效的方式是将图像分割成固定大小的小块(patches),这些小块被线性映射为向量,并加上位置编码以保留空间信息[^2]。 #### 数据预处理 在准备输入数据的过程中,原始图片会被切分成多个不重叠的patch。假设一张尺寸为\(H \times W\)的RGB图像是要处理的对象,则可以按照设定好的宽度和高度参数来划分该图像。例如,对于分辨率为\(224\times 224\)像素的图像,如果选择每边切成16个部分的话,那么最终会得到\((224/16)^2=196\)个小方格作为单独的特征表示单元。之后,每一个这样的补丁都会通过一个简单的全连接层转换成为维度固定的嵌入向量。 ```python import torch from torchvision import transforms def preprocess_image(image_path, patch_size=16): transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), # 假设目标分辨率是224x224 transforms.ToTensor(), ]) image = Image.open(image_path).convert('RGB') tensor = transform(image) patches = [] for i in range(tensor.shape[-2] // patch_size): # 高度方向上的循环 row_patches = [] for j in range(tensor.shape[-1] // patch_size): # 宽度方向上的循环 patch = tensor[:, :, i*patch_size:(i+1)*patch_size, j*patch_size:(j+1)*patch_size].flatten() row_patches.append(patch) patches.extend(row_patches) return torch.stack(patches) ``` #### 构建Transformer架构 构建Vision Transformer (ViT),通常包括以下几个组成部分: - **Patch Embedding Layer**: 将每个图像块转化为低维向量; - **Positional Encoding Layer**: 添加绝对或相对位置信息给上述获得的向量序列; - **Multiple Layers of Self-Attention and Feed Forward Networks**: 多层自注意机制与前馈神经网络交替堆叠而成的核心模块; 最后,在顶层附加一个全局平均池化层(Global Average Pooling)以及一个多类别Softmax回归器用于预测类标签。 ```python class VisionTransformer(nn.Module): def __init__(self, num_classes=1000, embed_dim=768, depth=12, num_heads=12, mlp_ratio=4., qkv_bias=False, drop_rate=0.): super().__init__() self.patch_embed = PatchEmbed(embed_dim=embed_dim) self.pos_embed = nn.Parameter(torch.zeros(1, self.patch_embed.num_patches + 1, embed_dim)) self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim)) dpr = [drop_rate for _ in range(depth)] self.blocks = nn.Sequential(*[ Block( dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, drop=dpr[i], ) for i in range(depth)]) self.norm = nn.LayerNorm(embed_dim) self.head = nn.Linear(embed_dim, num_classes) def forward(self, x): B = x.shape[0] cls_tokens = self.cls_token.expand(B, -1, -1) x = self.patch_embed(x) x = torch.cat((cls_tokens, x), dim=1) x += self.pos_embed x = self.blocks(x) x = self.norm(x) return self.head(x[:, 0]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值