[TOC]
# 普通单列索引
测试代码:
~~~
> for(var i=0;i<200000;i++){
... db.java.insert({name:'xiao'+i,age:i})
... }
~~~
第一:先检验一下查询性能
var start = new Date()
db.java.find({name:'xiao156778'})
var end = new Date()
end-start
第二:为name创建索引
db.java.ensureIndex({name:1})
第三:再执行第一部分代码可以看出有数量级的性能提升
没有添加索引时使用时间是
添加索引
db.java.ensureIndex({name:1})
添加完成后,再次查询
语法:
db.集合名.ensureIndex({键名:1}) 1是升续 -1是降续
# 多列索引(复合索引)
创建多列索引
db.集合名.ensureIndex({field1:1/-1, field2:1/-1});
对name和age 建立一个复合索引
可以使用db.集合名.getIndexes()查看创建的索引情况。
![](https://box.kancloud.cn/da865d6644637c90d142b15b9b98a1b3_2433x962.jpg)
# 子文档索引
语法:
db.集合名.ensureIndex({filed.subfield:1/-1});
如下文档可以建立子文档索引
{name:’诺基亚手机1’,price:12.34,spc:{weight:100,area:’纽约’}}
{name:’诺基亚手机2’,price:42.34,spc:{weight:200,area:’伦敦’}}
比如要查询weight等于100的文档。
db.goods.find({‘spc.weight’:100})
根据当前案例,我们建立子文档索引
db.net.ensureIndex({'spc.weight':1})
# 唯一索引
语法:
db.集合名.ensureIndex({name:-1},{unique:true})
# 过期索引
是在一段时间后会过期的索引
在索引过期后,相应的数据会被删除
适合存储一些一段时间之后就失效的数据
db.collection.ensureIndex({time:1},{expireAfterSeconds:秒数})
**注意**
存储在过期索引字段的值必须是指定的时间类型
必须是ISODate或者ISODate数组,不能使用时间戳,否则不能被自动删除
如果指定是ISODate数组,则按照最小的时间进行删除
过期索引不能是复合索引
删除索引时间不是精确的
删除过程是后台程序每60s跑一次,而且删除也需要时间,所以存在误差
# 全文索引
集合只有一个全文索引
建立方法
~~~
建立一个
db.articles.ensureIndex({key:"text"})
建立多个
db.articles.ensureIndex({key_1:"text",key_2:"text"})
所有的都建立
db.articles.ensureIndex({"$**":"text"})
~~~
如何使用全文索引
~~~
db.articles.find({$text:{$search:"coffee"}})
查找包含aa或bb或cc
db.articles.find({$text:{$search:"aa bb cc"}})
查找aa或bb但不要cc
db.articles.find({$text:{$search:"aa bb -cc"}})
查找既包含aa又包含bb又包含cc的文档,用引号把他们包起来就好
db.articles.find({$text:{$search:"\"aa\" \"bb\" \"cc\""}})
~~~
---
全文索引相似度
$meta操作符:{score:{$meta:"textScore"}}
写在查询条件后面可以返回结果的相似度,与sort一起使用,可以达到很好的实用效果
例子
~~~
db.articles.find({$text:{$search:"aa bb cc"}},{score:{$meta:"textScore"}})
~~~
还可以排序
~~~
db.articles.find({$text:{$search:"aa bb cc"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})
~~~
---
限制
全文索引非常强大,当同样存在限制:
每次查询,只能指定一个$text查询
$text查询不能出现在$nor查询中
查询中如果包含了$text,hint不再起作用
还不支持中文
# 查看索引
常用命令:
(1)查看当前索引状态: db.集合名.getIndexes();
(2)详情查看本次查询使用哪个索引和查询数据的状态信息。
db.集合名.find({name:’xiao’}).explain()
![](https://box.kancloud.cn/2c165a9499f8bfe4b8da5fda1d4d6c9b_1174x734.jpg)
![](https://box.kancloud.cn/abe1a03570af467617582a16fa1f5f7f_1178x640.jpg)
# 删除索引
删除单个索引
db.集合名.dropIndex({filed:1/-1});
删除所有索引
db.集合名.dropIndexes();
# 重建索引
一个表经过很多次修改后,导致表的文件产生空洞,索引文件也如此.
可以通过索引的重建,减少索引文件碎片,并提高索引的效率.
类似mysql中的optimize table
mysql里面使用optimize table语法:optimize table 表名
语法:db.集合名.reIndex()
# 索引使用注意事项
(1)创建索引的时候,注意1是正序创建索引 -1是倒叙创建索引
(2)索引的创建在提高查询性能的同时会影响插入性能,对于经常查询少插入的文档可以考虑用索引
(3)复合索引要注意索引的先后顺序。
(4)每个键全建立索引不一定就能提高性能,索引不是万能的。
(5)在做排序工作的时候如果是超大数据量也可以考虑加上索引用来提高排序的性能。
# 索引构建情况分析
## mongostat
自带的
使用
mongostat -h ip:端口
如果有用户名和密码 -u -p
字段说明:
索引情况:idx miss
qr读队列
qw写队列
- SQL
- 名词
- mysql
- 初识mysql
- 备份和恢复
- 存储引擎
- 数据表损坏和修复
- mysql工具
- 数据库操作
- 增
- 删
- 改
- 查
- 数据类型
- 整数类型
- 小数类型
- 日期时间类型
- 字符和文本型
- enum类型
- set类型
- 时间类型
- null与not null和null与空值''的区别
- 数据表操作
- 创建
- 索引
- 约束
- 表选项列表
- 表的其他语句
- 视图
- sql增删改查
- sql增
- sql删
- sql改
- sql查
- sql语句练习
- 连接查询和更新
- 常用sql语句集锦
- 函数
- 字符函数
- 数值运算符
- 比较运算符与函数
- 日期时间函数
- 信息函数
- 聚合函数
- 加密函数
- null函数
- 用户权限管理
- 用户管理
- 权限管理
- pdo
- 与pdo相关的几个类
- 连接数据库
- 使用
- pdo的错误处理
- pdo结果集对象
- pdo结果集对象常用方法
- pdo预处理
- 常用属性
- mysql编程
- 事务
- 语句块
- mysql中的变量
- 存储函数
- 存储过程
- 触发器
- mysql优化
- 存储引擎
- 字段类型
- 三范式和逆范式
- 索引
- 查询缓存
- limit分页优化
- 分区
- 介绍
- 分区算法
- list分区
- range范围
- Hash哈希
- key键值
- 分区管理
- 特别注意
- 分表
- 数据碎片与维护
- innodb表压缩
- 慢查询
- explain执行计划
- count和max,groupby优化
- 子查询优化
- mysql锁机制
- 介绍
- 演示
- 总结
- 乐观锁和悲观锁
- 扛得住的mysql
- 实例和故事
- 系统参数优化
- mysql体系结构
- mysql基准测试
- 索引
- mysql的复制
- win配置MySQL主从
- mysql5.7新特性
- 常见问题
- general log
- 忘记密码
- uodo log与redo log
- 事务隔离级别
- mysql8密码登录
- explain
- 高效的Tree表
- on delete cascade 总结
- mongod
- 简介
- 集合文档操作语句
- 增删改查
- 索引
- 数据导入和导出
- 主从复制
- php7操作mongod
- 权限管理
- redis
- redis简介
- 3.2版本配置文件
- 3.0版本配置文件
- 2.8版本配置文件
- 配置文件总结
- 外网连接
- 持久化
- RDB备份方式保存数据
- AOF备份方式保存数据
- 总结
- win安装redis和sentinel部署
- 事务
- Sentinel模式配置
- 分布式锁
- 管道
- php中redis代码
- 发布订阅
- slowlog
- Redis4.0
- scan和keys
- elasticsearch
- 配置说明
- 启动
- kibana
- kibana下载
- kibana配置文件
- kibana常用功能
- 常用术语
- Beats
- Beats简介
- Filebeat
- Packetbeat
- Logstash
- 配置
- elasticsearch架构
- es1.7
- head和bigdesk插件
- 插件大全
- 倒排索引
- 单模式下API增删改查
- mget获取多个文档
- 批量操作bulk
- 版本控制
- Mapping映射
- 基本查询
- Filter过滤
- 组合查询
- es配置文件
- es集群优化和管理
- logstash
- kibana
- es5.2
- 安装
- 冲突处理
- 数据备份
- 缺陷不足
- 集群管理api
- 分布式事务
- CAP理论
- BASE模型
- 两阶段提交(2PC)
- TCC (Try-Confirm-Cancle)
- 异步确保型
- 最大努力通知型
- 总结