使用索引來(lái)排序查詢(xún)結(jié)果
創(chuàng)新互聯(lián)建站長(zhǎng)期為上1000+客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為重慶企業(yè)提供專(zhuān)業(yè)的網(wǎng)站建設(shè)、成都網(wǎng)站建設(shè),重慶網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。在MongoDB中,排序操作可以通過(guò)從索引中按照索引順序獲取文檔的方式來(lái)保證結(jié)果的有序性。如果查詢(xún)計(jì)劃器(planner)無(wú)法從索引中得到排序順序,那么它將需要在內(nèi)存中排序結(jié)果。相比于不使用索引的排序操作,使用索引會(huì)有更好的性能。此外,如果 不使用 索引的排序操作使用了超過(guò)32M的內(nèi)存,那么操作會(huì)終止。
使用單鍵索引排序
如果一個(gè)遞增或遞減索引是單鍵索引,那么在該鍵上的排序操作可以是任意方向。
例如,在集合 records 的 a 鍵上創(chuàng)建遞增的索引:
db.records.ensureIndex( { a: 1 } )索引可以支持在 a 上的遞增排序:
db.records.find().sort( { a: 1 } )索引也支持如下在 a 上的遞減排序,通過(guò)以相反的順序遍歷索引的方式:
db.records.find().sort( { a: -1 } )在多個(gè)鍵上排序
創(chuàng)建 復(fù)合索引 以支持在多個(gè)鍵上排序。
您可以指定在索引的所有鍵或者部分鍵上排序。但是,排序鍵的順序必須和它們?cè)谒饕械呐帕许樞?一致 。例如,索引 { a: 1, b: 1 } 可以支持排序 { a: 1, b: 1 } 但不支持 { b: 1, a: 1 } 排序。
此外,sort中指定的所有鍵的排序順序(例如遞增/遞減)必須和索引中的對(duì)應(yīng)鍵的排序順序 完全相同, 或者 完全相反 。例如,索引 { a: 1, b: 1 } 可以支持排序 { a: 1, b: 1 } 和排序 { a: -1, b: -1 } ,但 不支持 排序 { a: -1, b: 1 } 。
排序與索引前綴
如果排序的鍵符合索引的鍵或者 前綴 ,那么MongoDB可以使用索引來(lái)排序查詢(xún)結(jié)果。復(fù)合索引的前綴是指被索引鍵的子集,由一個(gè)或多個(gè)排在最開(kāi)始的鍵組成。
例如,在集合 data 上創(chuàng)建一個(gè)復(fù)合索引:
db.data.ensureIndex( { a:1, b: 1, c: 1, d: 1 } )那么,該索引的前綴如下:
{ a: 1 } { a: 1, b: 1 } { a: 1, b: 1, c: 1 }如下查詢(xún)和排序操作可以使用索引前綴來(lái)排序查詢(xún)結(jié)果。這些操作不需要在內(nèi)存中對(duì)結(jié)果集排序。
例子 索引前綴
db.data.find().sort( { a: 1 } ) { a: 1 } db.data.find().sort( { a: -1 } ) { a: 1 } db.data.find().sort( { a: 1, b: 1 } ) { a: 1, b: 1 } db.data.find().sort( { a: -1, b: -1 } ) { a: 1, b: 1 } db.data.find().sort( { a: 1, b: 1, c: 1 } ) { a: 1, b: 1, c: 1 } db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } ) { a: 1, b: 1 }假設(shè)有如下例子,索引的前綴鍵出現(xiàn)在查詢(xún)條件和排序中:
db.data.find( { a: { $gt: 4 } } ).sort( { a: 1, b: 1 } )在這種情況下,MongoDB可以使用索引按照sort指定的順序來(lái)獲取文檔。如例子中所示,在查詢(xún)條件中的索引前綴可以和在sort中出現(xiàn)的前綴不一樣。
用非前綴的索引鍵排序
索引也支持使用非前綴的鍵來(lái)排序。在這種情況下,對(duì)于索引中排列在排序鍵的前面的所有鍵,查詢(xún)語(yǔ)句中必須包含針對(duì)它們的 相等匹配 的條件。
例如,集合 data 有如下索引:
{ a: 1, b: 1, c: 1, d: 1 }如下操作可以使用索引來(lái)排序:
例子 索引前綴
db.data.find( { a: 5 } ).sort( { b: 1, c: 1 } ) { a: 1 , b: 1, c: 1 } db.data.find( { b: 3, a: 4 } ).sort( { c: 1 } ) { a: 1, b: 1, c: 1 } db.data.find( { a: 5, b: { $lt: 3} } ).sort( { b: 1 } ) { a: 1, b: 1 }如最后一個(gè)操作所示,只有索引中那些排列在排序鍵 前面 的鍵必須在查詢(xún)語(yǔ)句中有相等匹配條件;其他索引鍵則可以指定其他匹配條件。
如果查詢(xún)語(yǔ)句 沒(méi)有 對(duì)排列在排序鍵前面或者與之有所重疊的前綴鍵指定相等匹配條件,那么操作將 不會(huì) 有效使用索引。例如,如下操作指定了排序 { c: 1 } ,但是查詢(xún)語(yǔ)句并沒(méi)有對(duì)前綴鍵 a 和 b 指定相等匹配:
db.data.find( { a: { $gt: 2 } } ).sort( { c: 1 } ) db.data.find( { c: 5 } ).sort( { c: 1 } )這些操作 將不會(huì) 高效地使用索引 { a: 1, b: 1, c: 1, d: 1 } ,且可能甚至不會(huì)使用該索引來(lái)獲取文檔。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。