索引類型:mysql
MongoDB有多種索引類型,每種索引類型有其適合的場景。sql
對於單字段索引而言,升序和降序效果是同樣的。mongodb
複合索引針對多個字段聯合建立索引,先按第一個字段排序,第一個字段相同的文檔按第二個字段排序,以此類推。複合索引也能知足單個字段的索引,但僅限複合索引首個字段。數據庫
當索引的字段爲數組時,建立出的索引爲多key索引,多key索引會爲數組的每一個元素創建一條索引,好比下圖所示BillInterceptLifeInfo表中加入一個NeedSyncSiteCodes字段,須要查詢NeedSyncSiteCodes中是否包含了某個sitecode就能夠利用該字段的多key索引。json
實際場景:api
攔截件監控代碼中,主要的數據在一個攔截件生命期表, 該表記錄了攔截件的生命期狀態,一個應下發設備表和一個實際下發設備表。數組
表結構以下:性能
其中更新應下發設備表是要查詢出1.站點信息相符的全部單號,且該單號的2.結束時間大於當前時間,且該3.應下發List中不含即將插入的deviceID纔會插入一條記錄。優化
由於須要下發的站點列表和須要下發的設備列表是兩個list,沒法一塊兒建索引,所以決定建EndTime和NeedSyncSiteCodes的複合索引,NeedSyncSiteCodes也是一個多key索引。url
一開始建索引以下:
另外談下B樹(即B-樹)和B+樹的區別,以及爲何mongodb用B-樹而不用B+樹。
首先B樹結構(細節請自行查閱)以下圖:
每一個節點存有key對應的data, 每一個節點上的n個key有n+1個子節點。
一個m階的B樹每一個節點至少有m個孩子。
一棵含有N個總關鍵字數的m階的B樹的最大高度是log_ceil(m/2)(N+1)/2 + 1。
所以B數的高度相對會降低,而高度降低,定位數據會更快。因爲B數節點中存數據,最快查詢可爲O(1)。
而B+樹,以下圖:
B+樹的特色是,key的副本存儲在內部節點,真正的key-data存儲在葉子節點上。
n個key的節點指針域是n而不是n+1(mongodb 是n+1)
爲了增長區間訪問性,B+樹的葉子節點兩兩相連,對於範圍查詢大大增長了友好度。
B樹和B+樹在磁盤訪問這一點上
B樹和B+樹各有優缺點,對於mongodb來講,mongdb是一種文檔型數據庫,使用json格式保存數據,歸屬於聚合型數據庫。適用於數據模型簡單,性能要求高的場合。
而mysql之類的關係型數據庫,區間訪問是很常見的現象,B+樹支持區間訪問,所以mysql更適合用B+樹。