文檔(dang)數據(ju)(ju)庫屬于NoSQL數據(ju)(ju)庫,提(ti)供了可擴展的(de)高性(xing)能(neng)數據(ju)(ju)解決(jue)方案(an),與關系型數據(ju)(ju)庫(例(li)如MySQL、SQLServer、Oracle)一樣,在數據(ju)(ju)庫設(she)計(ji)、語(yu)句(ju)優(you)化、索引(yin)創(chuang)建等方面都會影響數據(ju)(ju)庫的(de)使(shi)用性(xing)能(neng)。
下面從(cong)不(bu)同維度,給出提升DDS使用性能的建議:
數據庫和集合的創建
1.使(shi)用短字(zi)(zi)段名(ming),以(yi)節約(yue)存(cun)(cun)儲空(kong)(kong)間(jian)。文檔(dang)數據庫(ku)與關(guan)系型數據庫(ku)不(bu)同,集合中(zhong)的每個文檔(dang)都存(cun)(cun)儲字(zi)(zi)段名(ming),使(shi)用短字(zi)(zi)段名(ming)可(ke)以(yi)有效的節約(yue)存(cun)(cun)儲空(kong)(kong)間(jian)。
2.有效的控制集合中的文檔數量(liang),避免影響(xiang)查詢(xun)性(xing)能(neng)。如果有必要,可以(yi)進行定(ding)期歸檔。
3.每條文檔都提供默認的“_id”值(zhi),禁止向“_id”中保存自定義(yi)值(zhi)。
4.固(gu)定集合相(xiang)較其他集合,插入速度快,并且能(neng)夠自(zi)動刪除舊數據。用戶可(ke)以根據業務需要,選擇創建(jian)固(gu)定集合以提高(gao)性能(neng)。
查詢操作
索引
1.根據(ju)業務(wu)需(xu)求,對經(jing)常查詢的(de)(de)(de)數(shu)據(ju)字段創建適當的(de)(de)(de)索(suo)(suo)引。需(xu)注意,索(suo)(suo)引會(hui)占(zhan)用一些空間,并且(qie)插(cha)入操作和(he)索(suo)(suo)引更(geng)新會(hui)消(xiao)耗資源。因此,建議每個集合的(de)(de)(de)索(suo)(suo)引數(shu)量不超過5個。
案例:出現數據(ju)(ju)查詢(xun)(xun)緩慢,如(ru)果沒有創(chuang)(chuang)建(jian)索引,建(jian)議對經常查詢(xun)(xun)的數據(ju)(ju)字段創(chuang)(chuang)建(jian)適當的索引,優(you)化查詢(xun)(xun)速度。
2.對于包含(han)(han)多個鍵(jian)(jian)的查詢,建議創建包含(han)(han)這些鍵(jian)(jian)的復(fu)合索(suo)引(yin)。復(fu)合索(suo)引(yin)的鍵(jian)(jian)值順序(xu)很(hen)關鍵(jian)(jian),需遵循索(suo)引(yin)最左前綴原則,查詢應包含(han)(han)最左索(suo)引(yin)字段,以索(suo)引(yin)創建順序(xu)為(wei)準(zhun),與查詢字段順序(xu)無關。
3.給索(suo)(suo)(suo)(suo)引添加(jia)TTL屬性,自動(dong)篩選(xuan)過期文檔并刪除。創建TTL的索(suo)(suo)(suo)(suo)引必須是日期類(lei)型。TTL索(suo)(suo)(suo)(suo)引是單字段索(suo)(suo)(suo)(suo)引,而非復(fu)合索(suo)(suo)(suo)(suo)引。
4.需要在集(ji)合中(zhong)某個字段上創建(jian)索引,但當集(ji)合中(zhong)大量文檔不包含該鍵值(zhi)時,建(jian)議創建(jian)稀疏索引。
5.創建(jian)文本索引(yin)時(shi),字段(duan)指定(ding)text,而不(bu)是1或者-1。每個(ge)集(ji)合(he)只(zhi)有一個(ge)文本索引(yin),但(dan)它(ta)可以為任意多個(ge)字段(duan)建(jian)立(li)索引(yin)。
命令使用
1.使用(yong)findOne方法,在數(shu)據庫中查詢匹配多個(ge)項(xiang)目,將會在自然排(pai)序(xu)文件(jian)集合中返回第一個(ge)項(xiang)目。如果需要返回多個(ge)文檔(dang),則使用(yong)find方法。
2.如果查詢無需返回整(zheng)個(ge)文(wen)檔,或只是用來判斷(duan)鍵值是否存(cun)在,可(ke)以通過投影(ying)$project來限制返回字段,減少網(wang)絡流量和客戶端的內存(cun)使用。
3.除了前綴樣式(shi)查詢,正則表達(da)式(shi)查詢執(zhi)行的(de)時間(jian)比大多數(shu)選擇(ze)器更久,不建(jian)議使用索引。
4.查詢中的某些含“?”的操(cao)作符可能會降低(di)使用性能。在業務中盡量不要使用該類操(cao)作符:or、?nin、not、?ne、exists。
說明:
?or:有多少個(ge)條件就會查(cha)詢多少次,最(zui)后合并結果集,建議替換為in。
$nin:可(ke)能會(hui)匹配(pei)到大多數的索引,此(ci)時,查詢優化(hua)器會(hui)退化(hua)為全(quan)表掃描。
$not:可能會導致查詢優(you)化器無法(fa)匹配到具體的索(suo)引,退化為全表掃(sao)描。
$ne:選擇字段值(zhi)(zhi)不(bu)等于(yu)指定值(zhi)(zhi)的(de)文檔(dang),如果多數為(wei)取相(xiang)反值(zhi)(zhi)的(de)文檔(dang),將會(hui)掃(sao)描(miao)整(zheng)個索引。
$exists:對于松(song)散的文檔結構,查詢必(bi)須遍歷每一個文檔。
更多信息,請參見。
注意事項
1.操作符?where和exists中不(bu)能使用索(suo)引。
2.如果(guo)查詢結果(guo)需要排序,盡量控制結果(guo)集(ji)的數量。
3.涉及多個字段的(de)索引(yin)時,盡量將用(yong)于精確(que)匹配(pei)的(de)字段放在索引(yin)的(de)前(qian)面(mian)。
4.如果查詢條件中的(de)鍵值順(shun)序(xu)(xu)和復合索引中的(de)創建順(shun)序(xu)(xu)不一致(zhi),DDS會自動優化為查詢跟(gen)索引順(shun)序(xu)(xu)一致(zhi)。
- 修改操作
通(tong)過(guo)操作符(fu)對文(wen)檔進行修改,通(tong)常可以獲得更(geng)好的(de)性能(neng)。該(gai)方式(shi)不需要往返(fan)服務器來獲取并(bing)修改文(wen)檔數據(ju),在序(xu)列化和傳輸數據(ju)上花費更(geng)少的(de)時間。
- 批量插入
批(pi)(pi)量插入(batchInsert)可以減(jian)少數(shu)據向服務(wu)器(qi)的提交(jiao)(jiao)次數(shu),提高(gao)使用性能。批(pi)(pi)量提交(jiao)(jiao)的數(shu)據的BSON Size不超(chao)過48MB。
- 聚合運算
聚合運算中,?match需前置于group,減少$group操作符(fu)要處理的文檔數量。