iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 20
0
AI & Data

從入門到精通 MongoDB系列 第 21

Day21: 索引 index(2) - index 的優點與缺點

在上一篇「」文章中,我們介紹了 MongoDB 中的索引 Index,也介紹了單一欄位的索引。今天接著來介紹使用索引的優點及缺點。


索引可能會拖慢查詢速度

如果我們同樣使用上一篇的範例資料來查詢 2017 年之後的電影:db.demo.explain("executionStats").find({year: {$gt: 2017}})

可以發現其 "executionTimeMillisEstimate" 為 0,那是因為查詢的結果佔整個 document 的數量比例很低(236 / 28795)

建立索引對於查詢效率提升的因素有以下兩項:

  • 查詢的欄位恰好有建立索引
  • 查詢結果佔整個 document 的數量比例

因此,如果我們查詢 2017 之前的電影:db.demo.explain("executionStats").find({year: {$lt: 2017}})

可以觀察以下兩項資料:

  • "executionTimeMillisEstimate":89 ms
  • "totalDocsExamined":總共掃過 28321 個 documents

相較於查詢 2017 年之後的電影,我們查詢 2017 之前的電影的查詢效率變慢許多,甚至比沒有建立索引時的查詢效率還要來得慢。

沒有索引

如果沒有建立索引時的查詢效率為何?我們先把剛才建立的索引刪掉:db.demo.dropIndex({year: 1})

接著來檢視詳細的查詢資料: db.demo.explain("executionStats").find({year: {$lt: 2017}})

  • "executionTimeMillisEstimate":21 ms
  • "totalDocsExamined":總共掃過 28321 個 documents

可以發現查詢效率反而比建立索引後的查詢效率還差。而造成查詢效率變慢是因為查詢結果的數量太多:需要先查 index,再去掃 index。


索引可以提升排序效率

在一些情況下,建立索引可以提升查詢的效率,而索引也可以提升排序的效率。

沒有索引

我們對 title 欄位進行排序:db.demo.explain("executionStats").find({}).sort({title: 1})

觀察以下資訊:

  • "SORT":使用 SORT 來排序
  • "COLLSCAN":collection scan
  • "executionTimeMillis":97 ms
  • "totalDocsExamined":共掃過 28795 個 documents

建立索引

我們對 title 建立索引:db.demo.createIndex({title: 1})

接著再去檢視詳細的查詢資料:db.demo.explain("executionStats").find({}).sort({title: 1})

觀察以下資料:

  • "IXSCAN":Index Scan
  • "executionTimeMillis":48 ms
  • "totalDocsExamined":共掃過 28795 個 documents

可以發現,在建立索引之後,排序的效率提升。


今天的文章說明了使用索引反而可能會讓查詢的效率變慢,但使用索引會讓排序的效率提升。


上一篇
Day20: 索引 index(1) - 索引介紹及單一欄位的索引
下一篇
Day22: 索引 index(3) - Unique Index 與 TTL Index
系列文
從入門到精通 MongoDB26

尚未有邦友留言

立即登入留言