你可能聽說過欄索引是最佳化查詢效能的好方法,它盡可能地減少查詢所需的磁碟存取次數。MongoDB 有一個欄位索引的特定應用程式,稱為覆蓋索引查詢(Covered Queries),其中查詢的所有欄都被編製索引。因為 MongoDB 不需檢查除索引之外的任何文件,所以覆蓋索引查詢非常快。在今天的文章中,我們將學習如何使用覆蓋索引查詢更快地查詢資料。
覆蓋索引查詢的定義
在開頭引言段落中,我們提到了覆蓋索引查詢的所有欄被編製索引。除此之外,具體而言,覆蓋索引查詢是以下的查詢:
- 查詢的所有欄位都是索引的一部分。
- 查詢的所有傳回欄位都在同一索引中。
在幕後 MongoDB 無需實際查看文文內部就能比對查詢條件並傳回使用相同索引的結果。由於索引存在於 RAM 中,因此從索引取得資料比透過掃描文件讀取資料要快得多。
我們現在知道了什麼是覆蓋查詢,就開始編寫一個吧!
建立索引
我們將在 Sakila 範例資料庫的 film 資料表執行查詢。它包含許多與虛構電影有關的欄位。這些包括標題、描述、發行年份,以及租賃資訊,如價格和租賃期限。這是在Navicat for MongoDB 以樹狀檢視顯示的文件:
讓我們以 title 和 release_year 欄位建立一個複合索引:
- 按一下主要工具列上的「索引」大按鈕,然後按一下物件工具列上的「新增索引」按鈕:
在「一般」索引標籤,
- 從「集合名稱」下拉式清單中選取「film」。
- 在「索引版本:」下面,從「欄位」下拉式清單中選取「title」,然後從「類型」下拉式清單中選取「ASC」。
- 然後,按一下螢幕底部的加號(+)按鈕來加入第二個欄位:
- 從「欄位」下拉式清單中選取「release_year」,然後再從「類型」下拉式清單中選取「ASC」。
- 現在,按一下「文字」索引標籤,然後在「權數」標題下,按照與上面相同的程序從「欄位」下拉式清單中選取那兩個欄位,並指定權數為 1:
- 最後,按一下「儲存」按鈕,並輸入「film_title_year」索引名稱。
執行覆蓋索引查詢
對索引欄位執行查詢:
- 按一下主要工具列上「查詢」大按鈕,然後按一下物件工具列上的「新增查詢」按鈕。
- 在查詢編輯器中,輸入以下的 find() 引動過程:
db.film.find({title:{$regex : ".*AGENT.*"}},{title:1,release_year:1,_id:0})
- 按一下「執行」按鈕以執行查詢。結果如下:
你可以從主要功能表中選擇「查詢」>「解釋」以檢視查詢的執行統計資訊:
總結
如果你希望提升查詢速度,請考慮使用覆蓋索引查詢。它們的速度非常快,因為 MongoDB 只需要檢查存在於 RAM 中的索引文件。