- 浏览: 2651696 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
源文: http://blog.nosqlfan.com/html/4117.html
我们知道,MongoDB 的索引 是B-Tree结构的,和MySQL的索引非常类似。所以你应该听过这样的建议:创建索引的时候要考虑到sort操作,尽量把sort操作要用到的字段放到你的索引后面。 但是有的情况下,这样做反而会使你的查询性能更低。
问题
比如我们进行下面这样的查询:
db.collection.find({"country": "A"}).sort({"carsOwned": 1})
查询条件是 {“country”: “A”} ,按 carsOwned 字段的正序排序。所以索引就很好建了,直接建立 country , carsOwned 两个字段的联合索引即可。像这样:
db.collection.ensureIndex({"country": 1, "carsOwned": 1})
我们来看一个稍微复杂一点的查询:
db.collection.find({"country": {"$in": ["A", "G"]}}).sort({"carsOwned": 1})
这回我们是要查询 country 为 A 或者 G 的数据条目,结果同样按 carsOwned 字段排序。
如果我们还使用上面的索引,并且使用 explain() 分析一下这个查询,就会发现在输出中有一个 “scanAndOrder” : true 的字段,并且 nscanned 的值可能会比想象中的大很多,甚至指定了 limit 也没什么效果。
原因
这是什么原因呢,我们先看下面这张图:
如上图所未,左边一个是按 {“country”: 1, “carsOwned”: 1} 的顺序建立的索引。而右边是按 {“carsOwned”: 1, ”country”: 1} 顺序建立的索引。
如果我们执行上面的查询,通过左边的索引,我们需要将 country 值为A的(左图的左边一支)所有子节点以及country 值为G的(左图的右边一支)所有子节点都取也来。然后再对取出来的这些数据按 carsOwned 值进行一次排序操作。
所以说上面 explain 输出了一个 “scanAndOrder” : true 的提示,就是说这次查询,是先进行了scan获取到数据,再进行了独立的排序操作的。
那如果我们使用右边的索引来做查询,结果就不太一样了。我们没有将排序字段放在最后,而是放在了前面,相反把筛选字段放在了后面。那这样的结果就 是:我们会从值为1的节点开始遍历(右图的左边一支),当发现有 country 值为 A 或 G 的,就直接放到结果集中。当完成指定数量(指定 limit 个数)的查找后。我们就可以直接将结果返回了,因为这时候,所有的结果本身就是按 carsOwned 正序排列的。
对于上面的数据集,如果我们需要2条结果。我们通过左图的索引需要扫描到4条记录,然后对4条记录进行排序才能返回结果。而右边只需要我们扫描2条结果就能直接返回了(因为查询的过程就是按需要的顺序去遍历索引的)。
所以,在有范围查询(包括$in, $gt, $lt 等等)的时候,其实刻意在后面追加排序索引通常是没有效果的。因为在进行范围查询的过程中,我们得到的结果集本身并不是按追加的这个字段来排的,还需要进 行一次额外的排序才行。而在这种情况下,可能反序建立索引(排序字段在前、范围查询字段在后)反而会是一个比较优的选择。当然,是否更优也和具体的数据集 有关。
总结
总结一下,举两个栗子。
当查询是:
db.test.find({a:1,b:2}).sort({c:1})
那么直接建立 {a:1, b:1, c:1} 或者 {b:1, a:1, c:1} 的联合索引即可。
如果查询是:
db.test.find({a:1,b:{$in:[1,2]}}).sort({c:1})
那么可能建立 {a:1, c:1, b:1} 的联合索引会比较合适。当然,这里只是提供了多一种思路,具体是否采用还是需要视你的数据情况而定。
发表评论
-
基于tmpfs使用mongoDB
2013-08-28 13:51 1638基本思想 将MongoDB ... -
mongoDB如何query is Null
2013-07-24 15:09 1215试了半天,原来通过 db.taobaoItem.find( ... -
mongoDB性能问题
2013-03-23 21:43 1004mongoDB在高并发情况下的性能存在问题。 ... -
mongoDB 性能测试
2013-03-05 13:33 2171最近对mongoDB 性能测试,200万条数据,文件大小 ... -
mongoDB为什么用virtual memory mapping
2013-01-28 23:57 1245原文: http://blog.mongodb.org/po ... -
mongoDB亿级数据量性能测试
2013-01-28 23:54 1223原文:http://www.cnblogs.co ... -
mongoDB 虚内存
2013-01-28 23:29 0http://blog.mongodb.org/post/10 ... -
MongoDB 关于索引的建议
2013-01-23 14:32 1124我们收到了很多关于索引的问题。这一部分解答了其中的一小部分。 ... -
mongoDB 索引
2013-01-23 14:12 920索引常常用来大幅度 ... -
mongos结构记录
2013-01-16 00:11 980mong client< ---> mongo ... -
mongoDB java简单记录
2013-01-11 19:02 11181. 数据格式传递 上个自己画的图 Mongodb-Jav ... -
MongoDB数据文件内部结构
2012-12-29 11:40 927有人在Quora上提问:Mongo ... -
mongoDB意外关闭重启
2012-12-03 16:36 2364线上一台mongoDB意外关闭,重启的时候报错: o ... -
MongoDB vs Redis vs Tokyo Tyrant 测试对比
2012-12-01 17:19 0* MongoDB vs Redis vs Tokyo T ... -
mongoDB NUMA问题
2012-12-01 14:05 1194NUMA的含义,简单点说,在有多个物理CPU的架构下,NUMA ... -
mongo 监控常用命令
2012-12-01 14:05 963db.stats() db.serverStatus(). ... -
mongoDB的储存机制
2012-11-30 16:27 1710在MongoDB的数据文件夹中(默认路径是/data/db)由 ... -
MongoDB与内存
2012-11-29 16:07 822原文:http://huoding.com/2011/08/ ... -
理解mongodb的ObjectId
2012-11-14 00:29 2741Posted in nosql on 三月 8th ... -
mongoDB 数据备份文档
2012-11-12 14:40 872参考:http://docs.mongodb.org/manu ...
相关推荐
7. 哈希索引:仅支持等值匹配查询,不支持范围查询,适合用于哈希函数的结果。 8. 唯一性索引:确保特定字段的值在集合中唯一,如 `db.accounts.ensureIndex( { "tax-id": 1 }, { unique: true } )`。 9. 稀疏索引...
6. **索引优化** - 使用`explain()`方法分析查询性能,评估索引的效果。 - 考虑索引的大小和存储成本,过多或过大的索引可能会影响写操作的性能。 - 定期分析查询模式,更新索引策略以适应应用程序的变化。 - ...
- **内存使用**:MongoDB 的索引主要存储在内存中,以提高查询速度。因此,你需要确保索引的大小不超过服务器的可用 RAM。如果索引超出内存限制,MongoDB 将开始使用磁盘上的缓存,这可能导致性能下降。 2. **查询...
同时,查询优化也很重要,应尽量利用索引和聚合框架(aggregate)代替group操作以提高查询效率。对于地理位置查询,应使用地理索引和相应的查询命令,而不是geoSearch。 认证问题是任何数据库系统都需要关注的安全...
除了这些,MongoDB还提供了其他高级查询特性,如聚合框架(Aggregation Framework)用于复杂的分析操作,地理空间查询(Geospatial Queries)用于地理位置数据的检索,以及索引(Indexes)来加速查询性能。索引对于...
MongoDB数据库中的索引是提升查询效率的关键工具,它们是一种特殊的数据结构,用于存储表中数据的一小部分,以加速数据检索。索引的优点主要体现在减少服务器扫描的数据量、帮助服务器避免排序或使用临时表以及将...
查询语言(Query Language,MQL)是MongoDB的一大特色,它提供了丰富的查询表达式,如字段选择、比较操作、正则表达式匹配、范围查询、逻辑运算等。此外,还有聚合框架,允许对数据进行复杂的数据处理和分析,包括...
MongoDB 是一个流行的分布式文档型数据库,以其高性能和灵活性著称。然而,正如标题和描述中...在面临类似问题时,应深入分析查询行为,调整索引策略,优化查询逻辑,以及合理配置数据库参数,以达到最佳的运行效果。
索引是提升查询性能的关键,MongoDB支持多种类型的索引,如单字段索引、复合索引、文本索引、地理空间索引等。明智地创建和管理索引能显著提高查询速度。 六、复制集与分片 1. 复制集:为了确保数据的高可用性和...
4. 强大的查询语言:MongoDB拥有丰富的查询和更新操作,支持类似于SQL的查询语法,同时支持正则表达式、聚合框架、地理空间索引等功能,能实现复杂的数据分析。 5. 自动索引:MongoDB允许用户为字段创建索引,提高...
在MongoDB中,索引是提高查询性能的关键。你可以为文档的任何字段创建单字段或复合索引,甚至可以创建地理位置索引。索引的创建和管理是优化数据库性能的重要环节。 MongoDB的分布式特性使其成为处理大数据的理想...
4. **查询语言**:MongoDB 使用自己的查询语言,支持丰富的查询表达式,包括字段过滤、范围查询、正则表达式匹配等。查询结果可以返回文档列表,也可以进行聚合操作,对数据进行分析和汇总。 5. **索引**:为了提高...
- 多字段索引:创建复合索引(多个字段的组合)可以优化涉及多个字段的查询,但需注意索引顺序,因为MongoDB按索引的前部分字段进行排序。 - 空间占用:索引会占用额外的存储空间,需要权衡性能提升与存储成本之间的...
4. **索引与性能优化**:学习创建和管理索引,理解不同类型的索引(如单键索引、复合索引、地理空间索引等)以及它们对查询性能的影响。此外,还会讨论性能调优策略,包括查询优化和硬件选择。 5. **复制集与高可用...
索引是数据库性能优化的关键技术之一,本书中对MongoDB的索引创建和管理做了详细说明,包括如何建立单个字段索引、复合索引、地理位置索引等,以及如何通过索引优化查询速度。 聚合工具是MongoDB处理大量数据时的...
4. **查询语言**:MongoDB查询语言(MQL)支持丰富的查询表达式,包括条件语句、范围查询、正则表达式匹配和聚合操作。 5. **索引**:MongoDB允许为字段创建索引以加速查询性能。`db.collection.createIndex()`用于...
在MongoDB中,查询操作的优化对于提升系统整体性能至关重要。以下是一些关键的技术点: ##### 1. 创建索引 - **定义**:索引是在数据库表的一个或多个列上创建的数据结构,用于快速定位数据。在查询条件的字段上...