> 데이터 베이스 > MySQL 튜토리얼 > MongoDB如何新增索引

MongoDB如何新增索引

WBOY
풀어 주다: 2016-06-07 16:39:32
원래의
1559명이 탐색했습니다.

常规方法 数据量较小或者请求量不大的情况下,可以直接通过 db.coll.ensureIndex({}) 建立,相关的参数可以?参考文档. 数据量较大时的通用方法 在数据量较大或请求量较大,直接建立索引对性能有显著影响时,可以利用复制集(数据量较大时一般为线上环境,使用复制

常规方法

数据量较小或者请求量不大的情况下,可以直接通过db.coll.ensureIndex({})建立,相关的参数可以?参考文档.

数据量较大时的通用方法

在数据量较大或请求量较大,直接建立索引对性能有显著影响时,可以利用复制集(数据量较大时一般为线上环境,使用复制集为必然选择.)中部分机器宕机不影响复制集工作的特性,轮转建立索引.
在复制集中,首先停掉一台从节点,去掉--replSet启动参数,更换启动端口--port,将节点以单机模式启动,此时对复制集而言,此节点不存活,请求也不会发往此节点.之后在需要建立索引的集合中直接建立索引.
上一步骤完成后,将启动文件恢复,正常启动节点,等待数据同步,数据同步完成后,对另一从节点执行相同的操作.
在所有从节点操作完成后,停掉主节点,执行相同操作.
对于集群,可以在多个分片之间并行操作.

对于未分片的数据库

数据库未分片时,支持重命名数据库命令,在复制集中,可以利用这个特性在线建立索引.
假设要建立索引的集合名称为A.
1. 首先,将所有所需的索引(新旧索引)都建立在数据库的另一个集合B中.
2. 将A数据库的数据find+insert到B集合中,并记录开始操作的时间点.
3. 应用从复制开始到复制结束期间,A集合的写入,直到oplog同步小于阈值.
4. 修改A数据库名称为C,修改B数据库名为A.

本来是想做类似Mysql在线建立索引的方式,实际操作遇到问题,Mysql可以在A表做触发器,保存A表独有的操作日志,而MongoDB的oplog为实例共有,在进行B集合的写入时,oplog同样在新增,会造成oplog写入过快,很可能在B完成对A的初始拷贝之前就已经走完一圈,导致A的操作记录不能被完整保存.

结论

综上所述,对数据量较大的MongoDB集合,利用复制集的特性,离线轮转建立索引是合适的解决办法.

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿