[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()查看創建的索引情況。

# 子文檔索引
語法:
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()


# 刪除索引
刪除單個索引
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)
- 異步確保型
- 最大努力通知型
- 總結