MongoDB 高手课
唐建法(TJ)
Tapdata CTO、MongoDB 中文社区主席、前 MongoDB 大中华区首席架构师
19351 人已学习
新⼈⾸单¥59
课程目录
已完结/共 53 讲
MongoDB 高手课
登录|注册
留言
18
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 34 | MongoDB索引机制(二)
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | 认识文档数据库MongoDB
04 | MongoDB特色及优势
05 | 实验:安装MongoDB
06 | MongoDB基本操作
07 | 实验:Hello World程序开发
08 | 聚合查询
09 | 实验:聚合查询
10 | 复制集机制及原理
11 | 实验:搭建MongoDB复制集
12 | MongoDB全家桶
13 | 模型设计基础
14 | JSON文档模型设计特点
15 | 文档模型设计之一:基础设计
16 | 文档模型设计之二:工况细化
17 | 文档模型设计之三:模式套用
18 | 设计模式集锦
19 | 事务开发:写操作事务
20 | 事务开发:读操作事务之一
21 | 事务开发:读操作事务之二
22 | 事务开发:多文档事务
23 | Change Stream
24 | MongoDB开发最佳实践
25 | 分片集群机制及原理
26 | 分片集群设计
27 | 实验:分片集群搭建及扩容
28 | MongoDB监控最佳实践
29 | MongoDB备份与恢复
30 | 备份与恢复操作
31 | MongoDB安全架构
32 | MongoDB安全加固实践
33 | MongoDB索引机制(一)
34 | MongoDB索引机制(二)
35 | MongoDB读写性能机制
36 | 性能诊断工具
37 | 高级集群设计:两地三中心
38 | 实验:搭建两地三中心集群
39 | 高级集群设计:全球多写
40 | MongoDB上线及升级
41 | MongoDB应用场景及选型
42 | MongoDB典型案例(一)
43 | MongoDB典型案例(二)
44 | 关系型数据库迁移
45 | 数据库迁移方式及工具
46 | Oracle迁移实战
47 | MongoDB + Spark实时大数据
48 | MongoDB + Spark连接实战
49 | MongoDB SQL套接件
50 | MongoDB与微服务
51 | MongoDB与数据中台
52 | MongoDB数据中台案例
53 | 结果测试&结束语
本节摘要

亲爱的学员:
你好,在回答学员问题的过程中,我发现大家对于第二章的事务处理, 特别是隔离级别,以及第三章的分片集群有相对较多的问题。在这里我给大家推荐一些补充的学习材料可以从另外一个角度来加深一些这些概念的理解。
MongoDB 事务的原子性
https://docs.mongodb.com/manual/core/write-operations-atomicity/
MongoDB 事务的隔离级别和一致性模型
https://docs.mongodb.com/manual/core/read-isolation-consistency-recency/
如果英文不太感冒,在 MongoDB 中文网站上有不少内容,比如分片相关的:
http://www.mongoing.com/?s= 分片集群

课件和 Demo 地址
https://gitee.com/geektime-geekbang/geektime-mongodb-course

展开
登录 后留言

全部留言(18)

  • 最新
  • 精选
cording
老师,请教一下我有A B C三个字段,这三个字段可能单独查询,也可能ABC一起组合查询。这样我是三个字段单独建索引高效,还是建组合索引?

作者回复: 如果3个字段分别有可能单独查询,并且频率都差不多,那你需要3个索引: ABC:1 B: 1 C: 1

2020-03-29
2
5
月迷津渡
TJ请问一下单个字段索引我可以理解用B树来构建查询,那多键索引按照你话的是个查询的一个工作方式,多键中的每个键是不是还是一颗B树,也就是B树挂B树 不知道我这么理解对不对。求教

作者回复: 课程中看上去是多棵树,那个只是帮助逻辑上理解。物理上,多键索引只用一颗B树。通过把多个字段的值拼接(类似于字符串拼接),形成一个单值,然后放到B树里。

2020-01-27
4
沉醉寒风
老师,有个内嵌文档的唯一性问题请教,因为是唯一性的组合索,保证的是内嵌文档跨文档唯一,但我需要的是跨文档可以重复,但当前文档内内嵌文档唯一(比如每个客户有多个联系地址,地址的姓名/电话不能重复),MONGODB支持这种索引吗?还是说需要业务代码来实现?

作者回复: 这个很容易实现。比如说你是这样的文档: { _id: ObjectId(), customer_id: 101, customer_name: "Nina", emergency_contacts: [ { contact_name: 'Nina mom', contact_phone: 12345}, { contact_name: 'Nina dad', contact_phone:12346} ] } 你可以建一个这样的唯一索引: { customer_id: 1, "emergency_contacts.contact_name":1, "emergency_contacts.contact_phone":1}

2020-04-25
5
3
Leo
堂sir,你好,全文索引是不是只有企业版才支持中文?

作者回复: 企业版都不支持。目前只在Atlas(MongoDB云托管版本)里面有这个功能。

2020-01-16
2
2
卡爸
老师您好,请教一个建文本索引时遇到的错误。 执行语句是“ db.mail.createIndex({ "search.subject": "text" }, { "weights": { "search.subject": 1 }, "name": "INDEX-NO14" }); ”,结果很快得到错误返回“ MongoError: text contains invalid UTF-8 ”。 因为没有更多的信息无法定位到可能出错的文档位置。 1. 请问 mongoshell 执行命令时返回的错误能设定某个环境变量,让信息更全面吗? 2. mongo 的文档字段对于 utf-8 有无有效性检查的函数? 3. 我从 mongo log 中找到了该语句执行的位置,没有具体报错文档的 ObjectId。只有一些类似 acquireCount 的信息,从日志中有办法定位错误文档的位置吗?

作者回复: 你试试 mongod -vvvvv 参数 k额能会打印更多的日志

2020-10-30
2
Geek_175bc2
老师想问下mongo索引大小的估算,把一个大小20字节的字段作为索引,数据量30万索引大小3M,平均每个只占10个字节。为什么会有差那么大呢

作者回复: 有压缩机制。一个是落盘压缩,一个是index prefix 压缩

2020-09-17
青丝成雪
老师您好,感觉ESR并不适用于所有的场景,而且感觉索引并不能解决所有的慢查询。 举个场景的例子:需要根据时间+结束状态来获取订单ID。这个场景下数据库中结束状态的订单可能千万级别以上,如果ER排列建索引的话,会扫描索引数可能千万条就很慢了,反倒是RE排列每次查询缩短时间范围效率更高一点呢 请教老师对这种场景下的索引创建和优化有什么看到呢?

作者回复: 你需要这样的索引 {state:1, ts:1},这就是个典型的ER。 这个索引不会需要扫描千万级。只会扫描满足你条件的文档。

2020-09-10
cording
老师,我这个删除方法1000万数据时,删除要60s,其中查询字段都建立了索引。代码如下: /** * 删除该路径下所有记录,本对象及其子对象.适用于文档bd或文件夹bf * * @param collection MongoDB中的集合 * @param objectPath 需删除的路径 */ public static void deleteByPath(MongoCollection collection, String objectPath) { long start = System.currentTimeMillis(); //过滤条件:路径为当前路径或子路径 Bson currentPathFilter = Filters.eq(IAfSysObject.S_OBJECT_PATH, objectPath); Bson subPathFilter = Filters.regex(IAfSysObject.S_OBJECT_PATH, "^" + objectPath + "/"); Bson pathsFilter = Filters.or(currentPathFilter, subPathFilter); //过滤条件:文档或文件夹 Bson sysObjectFilter = Filters.eq(IAfSysObject.S_COMMON_TAG, IAfSysObject.COMMON_TAG_VALUE); //组成最终过滤器 Bson filters = Filters.and(pathsFilter, sysObjectFilter); DeleteResult deleteResult = collection.deleteMany(filters); AfLoggerHelper.AFC.info("删除数量:" + deleteResult.getDeletedCount()); long end = System.currentTimeMillis(); AfLoggerHelper.PERFORMANCE.warn("[删除mongodb中文档],耗时:" + (end - start) + "ms"); }

作者回复: 这个是正常的。删除需要删除数据和索引,是一个成本不低的操作。

2020-07-20
Sir
最后面改单机加索引的步骤,是因为副本集存储位点信息吗?不然他怎么知道从哪里继续同步呢?

作者回复: 对。每个节点都会记住自己的同步信息和offset。

2020-04-13
密码123456
我觉得 ESR。不仅仅可以适用在mongo上。应该是使用B树创建索引的数据库。都可以
2020-02-26
8
收起评论