mongodb索引

索引Index:
索引就是用來加速的混狠,特殊數(shù)據(jù)結構,存在磁盤上(緩存在內存中)咽瓷,保存存儲表數(shù)據(jù)的一小部分數(shù)據(jù)崔挖,可以幫助我們快速查找數(shù)據(jù)贸街,索引中的數(shù)據(jù),會有一個指針指向數(shù)據(jù)行所在磁盤的真正BLOCK位置

優(yōu)點:
1狸相、大大減少了服務器需要掃描的數(shù)據(jù)量
2薛匪、索引可以幫助服務器減少排序或臨時表的使用,(已經排好序的索引)
3脓鹃、索引可以將隨機I/O轉換成順序I/O

三星索引:
一星:索引如果能將相關的記錄放置在一起
二星:索引中數(shù)據(jù)的存儲順序與查找標準中順序一致
三星:如果索引中包含查詢中所需要的全部數(shù)據(jù)(覆蓋索引)
索引類型:
B+Tree 平衡樹索引:每葉子節(jié)點到樹根的距離是相同的逸尖,順序索引
Hash索引:hash桶算法,散列索引
空間(R-Tree)索引:地理空間數(shù)據(jù)索引
全文(Full-text)索引:全文檢索

順序索引:
    全值精確匹配:name="neo"
    匹配最左前綴:name like "neo%",無效:name like "%neo%",
    匹配列前綴
    匹配范圍值
    精確匹配某一列并范圍匹配另外一列:name="neo" and age > 25
    只訪問索引的查詢
    {聚簇索引:索引與數(shù)據(jù)挨著放瘸右,索引后續(xù)的指針其實就是數(shù)據(jù)娇跟,記錄文件中的記錄順序與索引順序排序,聚簇索引也稱為主索引尊浓,其他索引為輔助索引}
    {非聚簇索引:索引中指定的次序與記錄文件中的記錄次序不一致}
散列索引:
    散列函數(shù):分布隨機逞频,分布均勻
mysql索引:根據(jù)存儲引擎的不同支持的索引類型也不同
Myisam存儲引擎:索引文件是{.MYI}纯衍,
InnoDB存儲引擎:索引是表空間的組成部分栋齿,{.ibd},主要是B+Tree索引
建立索引需要考慮的問題:
1襟诸、會做什么樣的查詢瓦堵?其中哪些鍵需要索引?
2歌亲、每個鍵的索引方向是怎么樣的菇用?
3、如何應對擴展陷揪?有沒有種不同的鍵的排列可以使常用數(shù)據(jù)更多地保留在內存中惋鸥?
Mongodb索引:幾乎與關系型數(shù)據(jù)庫支持的索引類型一模一樣
單字段索引杂穷,組合索引,多鍵索引卦绣,空間索引耐量,文本索引,hash索引

db.mycoll.ensureIndex(field[,options])
  name,unique,dropDups,sparse
db.mycoll.dropIndex(index_name)
db.mycoll.dropIndexes()
db.mycoll.getIndexes()
db.mycoll.reIndex()
mongodb索引創(chuàng)建:
唯一鍵索引:{"unique":true}
消除重復索引:{"dropDups":true}
索引測試:explain()
指定索引查詢:hint(INDEX_NAME)
索引后臺創(chuàng)建:{"background":true}  #默認阻塞建立索引期間的所有請求

mongodb索引管理:system.indexes
索引只能通過ensureIndex,dropIndexes進行system.indexes操作
例子:
# 創(chuàng)建測試文檔數(shù)據(jù)
# for(i=1;i<=100;i++) db.testcoll.insert({name:"user"+i,age:(i%150),address:"#"+i+"tianzhong,shenzhen,china",prefrebooks:["book"+i,"helloworld"]})
# 查看集合所有索引滤港,默認情況下廊蜒,只會以"_id"作為鍵來創(chuàng)建索引
> db.system.indexes.findOne()
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "name" : "_id_",
    "ns" : "testdb.testcoll"
}
# 查詢數(shù)據(jù),使用默認索引
> db.testcoll.find({name:"user58"}).explain()
{
    "cursor" : "BasicCursor",               # 表示沒有使用索引
    "isMultiKey" : false,                   
    "n" : 1,                                # 查詢返回數(shù)據(jù)的文檔數(shù)
    "nscannedObjects" : 100,                # 掃描objects數(shù)
    "nscanned" : 100,                       # 三秒文檔數(shù)
    "nscannedObjectsAllPlans" : 100,
    "nscannedAllPlans" : 100,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,                           # 花費時間
    "server" : "node1:27017",
    "filterSet" : false
}
# 創(chuàng)建索引
> db.testcoll.ensureIndex({name:1})         # 創(chuàng)建以name鍵為索引
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
# 查看創(chuàng)建的索引
> db.testcoll.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "testdb.testcoll"
    },
    {
        "v" : 1,
        "key" : {
            "name" : 1
        },
        "name" : "name_1",              # 索引名字
        "ns" : "testdb.testcoll"        # 索引的位置溅漾,在數(shù)據(jù)庫集合上
    }
]
# 在此執(zhí)行查詢
> db.testcoll.find({name:"user11"}).explain()
{
    "cursor" : "BtreeCursor name_1",        # 使用name_1索引
    "isMultiKey" : false,
    "n" : 1,
    "nscannedObjects" : 1,                  # 掃描的數(shù)據(jù)為1個文檔
    "nscanned" : 1,
    "nscannedObjectsAllPlans" : 1,
    "nscannedAllPlans" : 1,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "name" : [
            [
                "user11",
                "user11"
            ]
        ]
    },
    "server" : "node1:27017",
    "filterSet" : false
}
# 最左前綴匹配測試山叮,創(chuàng)建以姓名和年齡的索引
db.testcoll.ensureIndex({name:1,age:1}) 
# 以年齡查詢
> db.testcoll.find({age:{$gt:34,$lt:50}}).explain()
{
    "cursor" : "BasicCursor",     # 沒有使用任何索引
    "isMultiKey" : false,
    "n" : 15,
    "nscannedObjects" : 100,
    "nscanned" : 100,
    "nscannedObjectsAllPlans" : 100,
    "nscannedAllPlans" : 100,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "server" : "node1:27017",
    "filterSet" : false
}
# 創(chuàng)建以年齡和姓名的索引
db.testcoll.ensureIndex({age:1,name:1})
# 在次查詢年齡
> db.testcoll.find({age:{$gt:34,$lt:50}}).explain()
{
    "cursor" : "BtreeCursor age_1_name_1",          #
    "isMultiKey" : false,
    "n" : 15,
    "nscannedObjects" : 15,
    "nscanned" : 15,
    "nscannedObjectsAllPlans" : 15,
    "nscannedAllPlans" : 15,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "age" : [
            [
                34,
                50
            ]
        ],
        "name" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    },
    "server" : "node1:27017",
    "filterSet" : false
}
# mongodb是自動匹配最佳索引,進行搜索
# hint使用
> db.testcoll.find({name:"user12"}).hint("name_1_age_1").explain()
{
    "cursor" : "BtreeCursor name_1_age_1",          # 根據(jù)指定的索引名稱進行搜索
    "isMultiKey" : false,
    "n" : 1,
    "nscannedObjects" : 1,
    "nscanned" : 1,
    "nscannedObjectsAllPlans" : 1,
    "nscannedAllPlans" : 1,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "millis" : 0,
    "indexBounds" : {
        "name" : [
            [
                "user12",
                "user12"
            ]
        ],
        "age" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    },
    "server" : "node1:27017",
    "filterSet" : false
}
# 問題來了添履,在業(yè)務邏輯上是常使用以name屁倔,或者有時候采用name+age的方式進行搜索,name_1_age_1這個所以符合兩個需求
# 那么name_1這個索引就是累贅暮胧,舒服重復索引汰现,age_1_name_1,不匹配最左前綴索引的使用法則叔壤,也是無用的瞎饲。
mongodb的聚合函數(shù):
count:返回集合中的文檔數(shù)量
# db.testcoll.find().count()
distinct:找出給定鍵的所有不同的值,使用時必須指定集合和鍵
group:類似SQL中的group by
mapreduce
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末炼绘,一起剝皮案震驚了整個濱河市嗅战,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俺亮,老刑警劉巖驮捍,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脚曾,居然都是意外死亡东且,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門本讥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來珊泳,“玉大人,你說我怎么就攤上這事拷沸∩椋” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵撞芍,是天一觀的道長秧了。 經常有香客問我,道長序无,這世上最難降的妖魔是什么验毡? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任衡创,我火速辦了婚禮,結果婚禮上晶通,老公的妹妹穿的比我還像新娘钧汹。我一直安慰自己,他們只是感情好录择,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布拔莱。 她就那樣靜靜地躺著,像睡著了一般隘竭。 火紅的嫁衣襯著肌膚如雪塘秦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天动看,我揣著相機與錄音尊剔,去河邊找鬼。 笑死菱皆,一個胖子當著我的面吹牛须误,可吹牛的內容都是我干的。 我是一名探鬼主播仇轻,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼京痢,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了篷店?” 一聲冷哼從身側響起祭椰,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疲陕,沒想到半個月后方淤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蹄殃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年携茂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诅岩。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡讳苦,死狀恐怖,靈堂內的尸體忽然破棺而出按厘,到底是詐尸還是另有隱情医吊,我是刑警寧澤钱慢,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布逮京,位于F島的核電站,受9級特大地震影響束莫,放射性物質發(fā)生泄漏懒棉。R本人自食惡果不足惜草描,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望策严。 院中可真熱鬧穗慕,春花似錦、人聲如沸妻导。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倔韭。三九已至术浪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間寿酌,已是汗流浹背胰苏。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留醇疼,地道東北人硕并。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像秧荆,于是被迫代替她去往敵國和親倔毙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容

  • 索引能夠提高數(shù)據(jù)庫的查詢效率乙濒,沒有索引的話普监,查詢會進行全表掃描(scan every document in...
    zhglance閱讀 2,022評論 0 6
  • 前言 在MongoDB中,索引通常能夠極大的提高查詢的效率琉兜。如果沒有索引凯正,MongoDB在讀取數(shù)據(jù)時必須掃描集合中...
    honehou閱讀 1,365評論 0 1
  • 索引是數(shù)據(jù)庫中的一個重要對象,主要用于支持高效查詢操作豌蟋。如果沒有索引廊散,數(shù)據(jù)庫就只能進行全表掃描,效率將極為低下梧疲。m...
    UncleYee閱讀 2,429評論 0 5
  • 索引的作用是用來加速查詢允睹,數(shù)據(jù)庫索引與書籍索引類似,創(chuàng)建數(shù)據(jù)庫索引好像確定何如組織書的索引一樣幌氮。 explain ...
    JunChow520閱讀 1,890評論 0 0
  • 1缭受、_id索引: 自動創(chuàng)建 2、單鍵索引: 【值為一個單個的值该互,例如字符串米者、數(shù)字或者日期】db.nums.in...
    Uzero閱讀 767評論 2 0