優化數據庫語句方法
更新時間 2023-12-08 17:04:25
最近更新時間: 2023-12-08 17:04:25
分享文章
本節主要介紹優化數據庫語句方法
文檔數據庫屬于NoSQL數據庫,提供了可擴展的高性能數據解決方案,與關系型數據庫(例如MySQL、SQLServer、Oracle)一樣,在數據庫設計、語句優化、索引創建等方面都會影響數據庫的使用性能。
下面從不同維度,給出提升DDS使用性能的建議。
數據庫和集合的創建
- 使用 短字段名 ,以節約存儲空間。文檔數據庫與關系型數據庫不同,集合中的每個文檔都存儲字段名,使用短字段名可以有效的節約存儲空間。
- 有效的控制集合中的文檔數量,避免影響查詢性能。如果有必要,可以進行定期歸檔。
- 每條文檔都提供默認的“_id”值, 禁止向“_id”中保存自定義值 。
- 固定集合相較其他集合,插入速度快,并且能夠自動刪除舊數據。用戶可以根據業務需要,選擇創建固定集合以提高性能。
查詢操作
索引
- 根據業務需求,對經常查詢的數據字段創建適當的索引。需注意,索引會占用一些空間,并且插入操作和索引更新會消耗資源。因此,建議每個集合的索引數量不超過5個。
- 案例:出現數據查詢緩慢,如果沒有創建索引,建議對經常查詢的數據字段創建適當的索引,優化查詢速度。
- 對于包含多個鍵的查詢,建議創建包含這些鍵的復合索引。復合索引的鍵值順序很關鍵,需遵循索引最左前綴原則,查詢應包含最左索引字段,以索引創建順序為準,與查詢字段順序無關。
- 給索引添加TTL屬性,自動篩選過期文檔并刪除。創建TTL的索引必須是日期類型。TTL索引是單字段索引,而非復合索引。
- 需要在集合中某個字段上創建索引,但當集合中大量文檔不包含該鍵值時,建議創建稀疏索引。
- 創建文本索引時,字段指定text,而不是1或者-1。每個集合只有一個文本索引,但它可以為任意多個字段建立索引。
命令使用
- 使用findOne方法,在數據庫中查詢匹配多個項目,將會在自然排序文件集合中返回第一個項目。如果需要返回多個文檔,則使用find方法。
- 如果查詢無需返回整個文檔,或只是用來判斷鍵值是否存在,可以通過投影$project來限制返回字段,減少網絡流量和客戶端的內存使用。
- 除了前綴樣式查詢,正則表達式查詢執行的時間比大多數選擇器更久,不建議使用索引。
- 查詢中的某些含“**”的操作符可能會降低使用性能。在業務中盡量不要使用該類操作符:**or、**nin、**not、**ne、**exists。
操作符說明
| 操作符 | 說明 |
|---|---|
| $or | 有多少個條件就會查詢多少次,最后合并結果集,建議替換為**in。 |
| $nin | 可能會匹配到大多數的索引,此時,查詢優化器會退化為全表掃描。 |
| $not | 可能會導致查詢優化器無法匹配到具體的索引,退化為全表掃描。 |
| $ne | 選擇字段值不等于指定值的文檔,如果多數為取相反值的文檔,將會掃描整個索引。 |
| $exists | 對于松散的文檔結構,查詢必須遍歷每一個文檔。 |
更多信息,請參見。
注意事項
- 操作符where和exists中不能使用索引。
- 如果查詢結果需要排序,盡量控制結果集的數量。
- 涉及多個字段的索引時,盡量將用于精確匹配的字段放在索引的前面。
- 修改操作:通過操作符對文檔進行修改,通常可以獲得更好的性能。該方式不需要往返服務器來獲取并修改文檔數據,在序列化和傳輸數據上花費更少的時間。
- 批量插入:批量插入(batchInsert)可以減少數據向服務器的提交次數,提高使用性能。批量提交的數據的BSON Size不超過48MB。
- 聚合運算 :聚合運算中,match需前置于group,減少$group操作符要處理的文檔數量。