mongodb的索引问题

索引的定义和原理

数据库的索引,是一种将数据库中的特定数据进行排序化的数据结构,用以提高数据库的查询和变更效率。索引的实现通常使用B树或B+树。 
比如,当前有一个表有100w条数据,表结构为如下

   create table person
   (
        name char(15) not null,
        age int not null,
        city varchar(20) not null,
        primary key(name)
    )

主键是用户的name。假设用户居住的城市有限(比如100个),现在,如果要查询在city=“shanghai”的用户,那么如果没有索引的话,需要scan整个表,遍历100w次,并且匹配对应的city字段,如果city=“shanghai”则拿出来,效率非常低。如果对city字段创建了索引,由于city的值有限(100个),基于city的值build一个B树,那么如果想要查找city=“shanghai”的,基本上只需要log2(N),也就是最多9次,就能找到所有的city=“shanghai”的人了

不过,索引虽然能加快数据库的查询性能,但是需要额外占用空间用于存放索引数据,而且在插入和更新数据时效率也会变低(需要同时更新索引表)。因此索引表的创建,需要基于业务的实际情况进行,并不是索引表越多越好。

索引的类型

唯一索引

唯一索引能保证集合的每个文档的指定值都有唯一值,创建方式: 
db.xxx.ensureIndex({"username":1},{"unique":true} 
不过mongodb在insert的时候,并不会检查文档的唯一值,因此为了避免唯一键重复,需要使用安全插入,检查对应的getLastError

地理空间索引

用于查找地理位置上最近的点的索引,创建方式: 
db.xxx.ensureIndex{"gps":"2d"} 
gps必须是一对值,包含两个元素,以下形式都有效:

{“gps”: [0, 100]}
{"gps":{"x":0, "y":100}}

并且对应的字段可以自定义,不一定是x,y,查询的时候,可以基于whithin,center等选项进行查询

索引创建规则:

  • 基于实际的查询场景创建索引,考虑需要哪些键,是否需要联合索引,每个键的索引方向是怎么样,等等
  • 如果需要对集合进行排序,如果对没有索引的键调用sort,mongodb则会把所有数据都提取到内存中进行排序,对数据的大小是有限制的。因此建议对需要sort的数据合理设置索引
  • 擅于利用explain来查看查询对应的索引使用情况
  • 创建索引的时候,最好在后台创建(创建时指定background: true),否则,mongodb会阻塞所有请求,直到索引创建完毕
时间: 2024-10-12 22:54:50

mongodb的索引问题的相关文章

MongoDB数据库索引

前面的话 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录.这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的.本文将详细介绍MongoDB数据库索引 引入 索引能够提高查询效率,如何体现呢?接下来使用性能分析函数explain()来进行分析说明 首先,插入10万条数据 接着,不创建索引,来寻找time范围在100和200之间的文档 由图中所知,tot

Mongodb的索引

1. 简单介绍 索引是为了加速查询. 假设没有索引,mongodb在查询时会做表扫描,假设集合非常大时,这个查询会非常慢. 一般对创建查询时的键都建立索引. 为排序字段建立索引,假设对未建立索引的字段sort,mongodb会将全部的数据取到内存中来排序, 假设集合大到不能在内存中排序,则mongodb会报错. 2. mongodb创建索引 创建索引使用ensureIndex命令. > db.people.ensureIndex({"username" : 1}); 上面语句对p

【MongoDB学习笔记20】MongoDB的索引

MongoDB的索引和关系型数据库的索引概念和功能是相同的: (1)不使用索引的搜索可以称为全表扫面,也就是说,服务器必须找完整个表才能查询整个结果: (2)建立索引后搜索,查询在索引中搜索,在索引的条目中找到条目以后,就可以直接跳转到目标文档的位置:这样的搜索比全表的搜索的速度要提高好几个数量级: 先向集合blog中添加1000000个文档: > for (i=0;i<1000000;i++){    ... db.users.insert(     ... {"i":i

MongoDB中索引的创建和使用详解

索引通常能够极大的提高查询的效率.在系统中使用查询时,应该考虑建立相关的索引.在MongoDB中创建索引相对比较容易. mongodb中的索引在概念上和大多数关系型数据库如MySQL是一样的.当你在某种情况下需要在MySQL中建立索引,这样的情景同样适合于MongoDB. 基本操作 索引是一种数据结构,他搜集一个集合中文档特定字段的值.MongoDB的查询优化器能够使用这种数据结构来快速的对集合(collection)中的文档(collection)进行寻找和排序.准确来说,这些索引是通过B-T

mongodb设置索引和id

ensureIndex() 方法 要创建一个索引,需要使用MongoDB 的ensureIndex()方法. 语法: ensureIndex() 方法的基本语法如下 yiibai.com >db.COLLECTION_NAME.ensureIndex({KEY:1}) 这里关键是要在其中创建索引,1是按升序排列的字段名称.要创建降序索引,需要使用-1. 例子 >db.mycol.ensureIndex({"title":1}) > 在ensureIndex()方法,可

MongoDB入门学习(四):MongoDB的索引

上一篇讲到了MongoDB的基本操作增删查改,对于查询来说,必须按照我们的查询要求去集合中,并将查找到的结果返回,在这个过程中其实是对整个集合中每个文档进行了扫描,如果满足我们的要求就添加到结果集中最后返回.对于小集合来说,这个过程没什么,但是集合中数据很大的时候,进行表扫描是一个非常恐怖的事情,于是有了索引一说,索引是用来加速查询的,相当于书籍的目录,有了目录可以很精准的定位要查找内容的位置,从而减少无谓的查找. 1.索引的类型 创建索引可以是在单个字段上,也可以是在多个字段上,这个根据自己的

MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引

这个系列文章会分为两篇来写: 第一篇:入门篇,学习使用MongoDB数据库索引 第二篇:进阶篇,研究数据库索引原理--B/B+树的基本原理 1. 准备工作 在学习使用MongoDB数据库索引之前,有一些准备工作要做,之后的探索都是基于这些准备工作. 首先需要建立一个数据库和一些集合,这里我就选用一个国内手机号归属地的库,大约32W条记录,数据量不大,不过做一些基本的分析是够了. 首先我们建立一个数据库,叫做db_phone,然后导入测试数据.测试数据就是一些手机号归属地的信息.单个文档长这个样子

关于mongodb创建索引的一些经验总结

想来接触mongodb已经快一年了,对于它的索引知识也积攒了不少经验,趁着这个月黑风高的夜晚,就把mongodb的索引总结一番吧. 一,索引介绍 mongodb具有两类索引,分别为单键索引和复合索引. 1.单键索引是最简单的一种索引,创建单键索引的开销要比复合索引小很多.单键索引主要用于针对单值查询的条件. 2.复合索引是将文档中的几个键联合起来创建的一种索引,创建这种索引需要更多的空间与性能开销.分别体现在: 1).在给大量数据创建复合索引时,会阻塞数据库的查询,更不用说修改和插入操作了: 2

mongodb基础-索引

1.索引介绍 mongodb的索引和我们遇到的rdbms的索引含义一样,原理也基本一样 首先我们先在一个没有索引的集合上做一个查询,具体的查询计划可以通过explain()函数获取: > db.t1.find({"username":"user101"}).explain() { "queryPlanner" : { "plannerVersion" : 1, "namespace" : "

给MongoDB添加索引

用过数据库的都知道,数据库索引与书籍的索引类似,都是用来帮助快速查找的. MongoDB的索引跟关系型数据库的索引几乎一致. 1. 索引的创建 mongodb采用ensureIndex来创建索引,如: db.user.ensureIndex({"name":1}) 表示在user集合的name键创建一个索引,这里的1表示索引创建的方向,可以取值为1和-1 在这里面,我们没有给索引取名字,mongodb会为我们取一个默认的名字,规则为keyname1_dir1_keyname2_dir2