天天看點

MongDB優化

MongDB優化

​ MongoDB 是高性能資料,但是在使用的過程中,大家偶爾還會碰到一些性能問題。MongoDB和其它關系型資料庫相比,例如 SQL Server 、MySQL 、Oracle 相比來說,相對較新,很多人對其不是很熟悉,是以很多開發、DBA往往是注重功能的實作,而忽視了性能的要求。其實,MongoDB和 SQL Server 、MySQL 、Oracle 一樣,一個 資料庫對象的設計調整、索引的建立、語句的優化,都會對性能産生巨大的影響。

為充分挖掘MongoDB性能,簡單列舉以下Mongodb優化方式:

  1. 文檔中的_id鍵推薦使用預設值,禁止向_id中儲存自定義的值。

    ​解讀: MongoDB文檔中都會有一個“_id”鍵,預設是個ObjectID對象(辨別符中包含時間戳、機器ID、程序ID和計數器)。MongoDB在指定_id與不指定_id插入時 速度相差很大,指定_id會減慢插入的速率。

  2. 推薦使用短字段名。

    解讀:與關系型資料庫不同,MongoDB集合中的每一個文檔都需要存儲字段名,長字段名會需要更多的存儲空間。

  1. MongoDB索引可以提高文檔的查詢、更新、删除、排序操作,是以結合業務需求,适當建立索引。
  2. 每個索引都會占用一些空間,并且導緻插入操作的資源消耗,是以,建議每個集合的索引數盡量控制在5個以内。
  3. 對于包含多個鍵的查詢,建立包含這些鍵的複合索引是個不錯的解決方案。複合索引的鍵值順序很重要,了解索引最左字首原則。

    解讀:例如在test集合上建立組合索引{a:1,b:1,c:1}。執行以下7個查詢語句:

    db.test.find({a:”hello”}) // 1

    db.test.find({b:”sogo”, a:”hello”}) // 2

    db.test.find({a:”hello”,b:”sogo”, c:”666”}) // 3

    db.test.find({c:”666”, a:”hello”}) // 4

    db.test.find({b:”sogo”, c:”666”}) // 5

    db.test.find({b:”sogo” }) // 6

    db.test.find({c:”666”}) // 7

    以上查詢語句可能走索引的是1、2、3、4

    查詢應包含最左索引字段,以索引建立順序為準,與查詢字段順序無關。

    最少索引覆寫最多查詢。

  1. TTL 索引(time-to-live index,具有生命周期的索引),使用TTL索引可以将逾時時間的文檔老化,一個文檔到達老化的程度之後就會被删除。

    解讀:建立TTL的索引必須是日期類型。TTL索引是一種單字段索引,不能是複合索引。TTL删除文檔背景線程每60s移除失效文檔。不支援定長集合。

  1. 需要在集合中某字段建立索引,但集合中大量的文檔不包含此鍵值時,建議建立稀疏索引。

    解讀:索引預設是密集型的,這意味着,即使文檔的索引字段缺失,在索引中也存在着一個對應關系。在稀疏索引中,隻有包含了索引鍵值的文檔才會出現。

  1. 建立文本索引時字段指定text,而不是1或者-1。每個集合隻有一個文本索引,但是它可以為任意多個字段建立索引。

    解讀:文本搜尋速度快很多,推薦使用文本索引替代對集合文檔的多字段的低效查詢。

  1. 使用findOne在資料庫中查詢比對多個項目,它就會在自然排序檔案集合中傳回第一個項目。如果需要傳回多個文檔,則使用find方法。
  2. 如果查詢無需傳回整個文檔或隻是用來判斷鍵值是否存在,可以通過投影(映射)來限制傳回字段,減少網絡流量和用戶端的記憶體使用。

    解讀:既可以通過設定{key:1}來顯式指定傳回的字段,也可以設定{key:0}指定需要排除的字段。

  1. 除了字首樣式查詢,正規表達式查詢不能使用索引,執行的時間比大多數選擇器更長,應節制性地使用它們。
  2. 批量插入(batchInsert)可以減少資料向伺服器的送出次數,提高性能。但是批量送出的BSON Size不超過48MB。
  3. 禁止一次取出太多的資料進行排序,MongoDB目前支援對32M以内的結果集進行排序。如果需要排序,請盡量限制結果集中的資料量。

繼續閱讀