使用索引來排序查詢結果

2021-09-21 21:38:59 字數 2502 閱讀 9130

在mongodb中,排序操作可以通過從索引中按照索引順序獲取文件的方式來保證結果的有序性。如果查詢計畫器(planner)無法從索引中得到排序順序,那麼它將需要在記憶體中排序結果。相比於不使用索引的排序操作,使用索引會有更好的效能。此外,如果 不使用 索引的排序操作使用了超過32m的記憶體,那麼操作會終止。

使用單鍵索引排序

如果乙個遞增或遞減索引是單鍵索引,那麼在該鍵上的排序操作可以是任意方向。

例如,在集合 records 的 a 鍵上建立遞增的索引:

1

db.records.ensureindex(  )

索引可以支援在 a 上的遞增排序:

1

db.records.find().sort(  )

索引也支援如下在 a 上的遞減排序,通過以相反的順序遍歷索引的方式:

1

db.records.find().sort(  )

在多個鍵上排序

建立 復合索引 以支援在多個鍵上排序。

您可以指定在索引的所有鍵或者部分鍵上排序。但是,排序鍵的順序必須和它們在索引中的排列順序 一致 。例如,索引 可以支援排序 但不支援 排序。

此外,sort中指定的所有鍵的排序順序(例如遞增/遞減)必須和索引中的對應鍵的排序順序 完全相同, 或者 完全相反 。例如,索引 可以支援排序 和排序 ,但 不支援 排序 。

排序與索引字首

如果排序的鍵符合索引的鍵或者 字首 ,那麼mongodb可以使用索引來排序查詢結果。復合索引的字首是指被索引鍵的子集,由乙個或多個排在最開始的鍵組成。

例如,在集合 data 上建立乙個復合索引:

1

db.data.ensureindex(  )

那麼,該索引的字首如下:

1

2

3

如下查詢和排序操作可以使用索引字首來排序查詢結果。這些操作不需要在記憶體中對結果集排序。

例子      索引字首

1

2

3

4

5

6

db.data.find().sort(  )

db.data.find().sort(  )

db.data.find().sort(  )

db.data.find().sort(  )

db.data.find().sort(  )

db.data.find(  } ).sort(  )

假設有如下例子,索引的字首鍵出現在查詢條件和排序中:

1

db.data.find(  } ).sort(  )

在這種情況下,mongodb可以使用索引按照sort指定的順序來獲取文件。如例子中所示,在查詢條件中的索引字首可以和在sort**現的字首不一樣。

用非字首的索引鍵排序

索引也支援使用非字首的鍵來排序。在這種情況下,對於索引中排列在排序鍵的前面的所有鍵,查詢語句中必須包含針對它們的 相等匹配 的條件。

例如,集合 data 有如下索引:

1

如下操作可以使用索引來排序:

例子      索引字首

1

2

3

db.data.find(  ).sort(  )

db.data.find(  ).sort(  )

db.data.find(  } ).sort(  )

如最後乙個操作所示,只有索引中那些排列在排序鍵 前面 的鍵必須在查詢語句中有相等匹配條件;其他索引鍵則可以指定其他匹配條件。

如果查詢語句 沒有 對排列在排序鍵前面或者與之有所重疊的字首鍵指定相等匹配條件,那麼操作將 不會 有效使用索引。例如,如下操作指定了排序 ,但是查詢語句並沒有對字首鍵 a 和 b 指定相等匹配:

1

2

db.data.find(  } ).sort(  )

db.data.find(  ).sort(  )

這些操作 將不會 高效地使用索引 ,且可能甚至不會使用該索引來獲取文件。

UNION 查詢結果排序

今天想統計幾個結果資料,於是用到了union關鍵字 select count 1 from xx a union select count 1 from xx b union select count 1 from xx c這樣查詢的結果會預設按公升序排列,也就是a表的結果可能排在最後。通過檢視文件...

排序顯示查詢結果

在查詢語句的最後加上order by 列名,就會按照這個列排序,預設公升序 如果要規定公升序,則在列名後面加上asc。若要規定降序,則加上desc 同時,order by後面可以有不止乙個列,則先按前面的列排序,前面一列的值相同時按後面的列排序 例,有乙個表為sg,內容如下 name gradeno...

mysql通過建立分割槽和索引來提高查詢效率

drop table if exists test create table test id int 10 unsigned not null auto increment,time datetime not null comment 業務時間 primary key id time engine ...