mongodb建索引引起的问题

建索引就是一个容易引起长时间写锁的问题,MongoDB 在前台建索引时需要占用一个写锁(而且不会临时放弃),如果集合的数据量很大,建索引通常要花比较长时间,特别容易引起问题。

解决的方法很简单,MongoDB提供了两种建索引的访问,一种是 background 方式,不需要长时间占用写锁,另一种是非 background 方式,

需要长时间占用锁。使用background 方式就可以解决问题。

例如,为超大表 posts 建立索引,

千万不用使用

db.posts.ensureIndex({user_id: 1})

而应该使用

db.posts.ensureIndex({user_id: 1},{background: 1})

时间: 2024-11-10 11:20:20

mongodb建索引引起的问题的相关文章

MongoDB数据库索引

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

mongodb之索引学习

学习索引分类和创建索引:                1._id索引 大多数集合默认的索引2.单键索引:手动创建,一个单一的值3.多建索引:组合函数4.复合索引 :最左前缀原则5.过期索引 :一定时间内失效,注意点:必须是isodate或者其数组,不要使用时间戳,否则不会被自动删除.6.全文索引 db.tm.ensureindex({"article":"text"}),db.tm.ensureindex({"key1":"text&

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

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

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

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

练习 MongoDB 操作 —— 索引篇(二)

目录 Mongodb 索引篇(二) 索引 操作 创建索引 查看索引 删除索引 唯一索引 稀疏索引 性能示例 游标 Mongodb 索引篇(二) mongodb 更新于 2017-09-19 约 11 分钟 原文链接:https://segmentfault.com/a/1190000011263553 本文围绕索引.游标两部分进行探索,对MongoDB数据库的索引部分有一个大概的了解: 索引 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取

Mongodb的索引

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

Coreseek:第二步建索引及測试

1,建索引非常easy.一行代码 g:/service/coreseek/bin/indexer -c g:/service/coreseek/etc/csft_mysql.conf   person 前面是你bin文件夹下的indexer程序 后面-c指后面会跟配置文件 然后是配置文件地址 最好都用绝对地址 在后面是索引 也能够用--all 即对配置文件的全部部分都做索引 然后写成一个批处理文件.这样比較方便. 2.如今就能够在命令行下做測试了. 測试英文:g:\service\coresee

Sql Server之旅——第七站 为什么都说状态少的字段不能建索引

我们在学sqlserver的时候,大多教科书和前辈们都说状态少的字段不要建索引,由此带来的开销还不如不建索引,但是这句话有多少人真的知道, 或者说有多少人真的对此有比较深刻的理解,而不是听别人道听途说...这样记得快,忘记的也不慢...这篇我来分析一下这句话到底有几个意思. 一:现象 首先我们还是用测试数据来发现问题,我先建立一个Person,有5个字段,建表sql如下: DROP TABLE dbo.Person CREATE TABLE Person(ID INT PRIMARY KEY I

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

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