首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

MongoDB 索引全攻略:建立、管理與空間查詢實務

     編輯:更多程式設計知識

索引基礎與效能提升

MongoDB 使用 B-Tree 索引加速查詢與排序。合理的索引策略能將查詢效能提升數個數量級,但過多索引會拖慢寫入速度,需在讀寫比例間取得平衡。

單欄位索引建立與驗證

// 插入 20 萬筆測試資料
for (var i = 0; i < 200000; i++) {
    db.books.insert({ number: i, name: i + "book" });
}

// 建立索引前後效能對比
var start = new Date();
db.books.find({ number: 65871 });
var end = new Date();
print(end - start); // 無索引時較慢

db.books.ensureIndex({ number: 1 }); // 1 為升序,-1 為降序

// 再次測試,耗時大幅下降

索引使用五大注意事項

  1. 排序方向:1 升序、-1 降序,複合索引順序決定排序效能。
  2. 讀寫權衡:頻繁查詢、較少寫入的集合適合建索引;寫入密集型集合需謹慎評估。
  3. 複合索引順序:遵循 ESR 原則(Equality, Sort, Range),先放等值查詢欄位,再放排序欄位,最後放範圍查詢欄位。
  4. 非萬能藥:並非每個欄位都需索引,低選擇性欄位(如性別)索引效益低。
  5. 排序優化:大數據量排序時,若有對應索引可避免記憶體內排序(scanAndOrder)。

進階索引功能

指定索引名稱

db.books.ensureIndex({ name: -1 }, { name: "bookname" });

唯一索引與去重

// 建立唯一索引
db.books.ensureIndex({ name: -1 }, { unique: true });

// 若資料已有重複值,加上 dropDups:true 會自動刪除重複文件(僅保留第一筆)
db.books.ensureIndex({ name: -1 }, { unique: true, dropDups: true });

Hint 強制指定索引

db.books.find({ name: "1book", number: 1 }).hint({ name: -1 });

Explain 分析查詢計畫

db.books.find({ name: "1book" }).explain();
// 關鍵輸出:
// "cursor" : "BtreeCursor name_1"  -> 使用索引
// "nscanned" : 1                   -> 掃描文件數
// "millis" : 0                     -> 查詢耗時(ms)

索引管理

  • 查看所有索引:db.system.indexes.find()
  • 背景建立索引:db.books.ensureIndex({ number: 1 }, { background: true }) 避免鎖表影響線上服務。
  • 刪除索引:
    精確刪除:db.runCommand({ dropIndexes: "books", index: "name_1" })
    全部刪除:db.runCommand({ dropIndexes: "books", index: "*" })

空間索引(2d / 2dsphere)

支援地理座標的鄰近、矩形、圓形範圍查詢。

// 建立 2d 索引,指定座標範圍
db.map.ensureIndex({ "gis": "2d" }, { min: -1, max: 201 });

// 1. 最近的 3 個點
db.map.find({ "gis": { $near: [70, 180] } }, { gis: 1, _id: 0 }).limit(3);

// 2. 矩形範圍查詢
var box = [[50, 50], [190, 190]];
db.map.find({ "gis": { $within: { $box: box } } }, { gis: 1, _id: 0 });

// 3. 圓形範圍查詢
var center = [55, 80], radius = 50;
db.map.find({ "gis": { $within: { $center: [center, radius] } } });

總結

索引是 MongoDB 效能調校的核心。善用 explain() 分析查詢計畫,依據存取模式建立複合索引,並定期檢視 db.system.indexes 移除冗餘索引,即能維持最佳讀寫平衡。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved