# 解決 Mac 上 mds 與 mdworker 高 CPU

> 區分正常 Spotlight 索引與反覆檔案變動，再在必要時使用窄範圍排除或有文件依據的重建。

Published: 2026-06-29 | Updated: 2026-09-05

`mds`、`mds_stores` 和 `mdworker` 都屬於 Spotlight 索引系統。macOS 更新、資料遷移、還原或大量檔案變更後，它們短時間占用 CPU 很正常。`mdutil -s` 只能確認索引是否開啟，無法顯示重建進度，也沒有固定的完成時間。

## 這些程序分別做什麼

**mds** 負責協調索引，**mds_stores** 管理索引資料庫，**mdworker** 掃描檔案並擷取可搜尋的內容與中繼資料。索引是最新狀態時，它們大多閒置；大量檔案發生變化後，它們會重新開始工作。

## 為什麼占用會突然升高

- macOS 更新或資料遷移後，磁碟上大量內容變了
- 還原、移動或複製大量檔案後
- 接入尚未索引的外接磁碟或網路磁碟區後
- 下載、建置或同步讓某個目錄持續快速變化時

檢查索引是否啟用：

```
mdutil -s /
```

「Indexing enabled」是狀態，不是進度。把持續的 `mdworker` CPU 與「活動監視器」中的磁碟讀寫、近期檔案變化放在一起看。工作仍在推進時，讓 Mac 接通電源並等待完成。

大型原始碼目錄、郵件資料庫、外接磁碟區、慢速儲存裝置，以及反覆同步都會拉長時間。

## 長時間不結束怎麼辦

先儲存工作，再逐一暫停持續改寫檔案的 App；需要排查外接磁碟時，等寫入停止並從 Finder 正常退出磁碟後再拔除。這樣更容易看出是否有某個目錄或磁碟一直產生新變化。

在「系統設定 > Spotlight > 搜尋隱私」中排除目錄，可以減少索引工作，代價是該目錄不再出現在搜尋結果中。這個取捨更適合明確不需要搜尋的建置產物、虛擬磁碟或封存內容；整個個人目錄和啟動磁碟的影響就大得多。

如果搜尋結果已經缺失，或索引能確認卡住，可以依 Apple 的 [Spotlight 重建說明](https://support.apple.com/102321)操作：把受影響的磁碟或檔案夾加入「搜尋隱私」，短暫等待，再移除。不同 macOS 版本可能顯示「搜尋隱私」或「Spotlight 隱私」。移除後，Spotlight 會重新索引。

重建會把昂貴的工作再做一遍，只適合修復已確認存在的索引問題，不是看到 CPU 升高後的第一步。

## Spotlight 索引怎樣運作

Spotlight 會在磁碟區隱藏的 `.Spotlight-V100` 中維護倒排索引，也就是從詞語和中繼資料對應回檔案。

檔案變化後，FSEvents 通知 mds，mds 把檔案交給 mdworker，mdworker 載入對應的 `.mdimporter` 外掛，擷取文字與中繼資料。一般編輯只處理少量變化，完整重建則要重新匯入所有符合條件的檔案。

<figure class="blog-diagram">
  <img src="https://mole.fit/img/blog/spotlight-index-pipeline.webp" width="1360" height="454" loading="lazy" alt="變化後的檔案依序經過 FSEvents、mds、mdworker 和匯入外掛，進入 Spotlight 倒排索引，重建則讓所有檔案重新經過相同流程。">
  <figcaption>檔案變化依序經過 mds、mdworker 和中繼資料匯入器。重建會讓符合條件的內容重新走完整條流程。</figcaption>
</figure>

## 監控工具能幫什麼

「活動監視器」或 [Mole](https://mole.fit/tw/) 的「狀態」頁可以確認 CPU 與磁碟占用來自 Spotlight。接下來要判斷它是在處理一批有限的變化，還是某個目錄一直被改寫。查看近期活動並逐項隔離，比強制結束工作程序更有效。

## 可重複的診斷步驟

索引工作有進展時，等待通常就夠了；長期不退，才需要隔離持續變化的目錄或磁碟。排除目錄會失去搜尋結果，重建也會重複昂貴的工作，因此兩者都適合有明確證據的情況；結束 `mdworker` 本身並不能清理索引問題。

---

Canonical HTML page: https://mole.fit/tw/blog/mds-mdworker-high-cpu-mac
Blog index for agents: https://mole.fit/tw/blog/llms.txt
Site index for agents: https://mole.fit/llms.txt
