數據庫連接
在使用文檔數據庫服務進行應用程序開發時,為了保證數據庫連接的安全性和可靠性,需要遵守一些數據庫連接規范。以下是一些常用的文檔數據庫服務連接規范:
- 使用URI進行連接:文檔數據庫服務支持使用URI(Uniform Resource Identifier)格式的連接字符串進行連接,這種格式可以簡化連接參數的設置,例如:
mongodb://username:password@hostname:port/database
其中,username 和 password 是登錄數據庫的用戶名和密碼,hostname 和 port 是文檔數據庫服務的服務器的地址和端口號,database 是要連接的數據庫名稱。
- 使用連接池:為了提高連接的效率和性能,可以使用連接池技術對文檔數據庫服務連接進行管理。連接池可以緩存連接對象,并在需要時重復利用,避免頻繁創建和銷毀連接對象。客戶端連接數據庫的時候,要計算業務一共有多少個客戶端,每個客戶端配置的連接池大小是多少,總的連接數不要超過當前實例能承受的最大連接數的80%。
- 不要使用過期的連接:文檔數據庫服務連接對象具有一定的生命周期,在使用完畢后應該及時關閉連接,避免占用過多的系統資源。同時,不要使用已經過期的連接對象,應該重新創建一個新的連接對象進行操作。
- 設置合適的超時時間:在連接文檔數據庫服務時,應該設置合適的超時時間,避免連接過程中出現異常或超時而導致應用程序出現問題。可以設置連接超時、讀取超時、寫入超時等不同類型的超時時間。
- 避免使用過多的連接:在應用程序中,應該避免使用過多的文檔數據庫服務連接,以免占用過多的系統資源。可以通過使用連接池、設置連接超時等方式來優化連接的使用。
- 使用SSL/TLS進行加密:為了提高數據庫連接的安全性,可以使用SSL/TLS等加密協議對文檔數據庫服務連接進行加密傳輸,避免數據被竊取或篡改。
可靠性
在使用文檔數據庫服務時,為了保證數據的可靠性和一致性,需要遵守一些規范和最佳實踐。以下是一些常見的文檔數據庫服務可靠性規范:
-
使用副本集:文檔數據庫服務的副本集是一組自動同步的文檔數據庫實例,提供了數據冗余和高可用性。可以使用副本集來保證數據的可靠性和恢復性。
-
設置write concern:文檔數據庫服務的write concern用于指定寫入操作的確認級別,即寫入數據后需要多少個文檔數據庫服務實例確認才算成功。對于關鍵業務,write concern設置為{w:n},n>0,數字越大,一致性實現更好,但性能較差 。可以根據業務需求設置不同的write concern級別,例如:
- w: 0 表示寫入操作不需要確認,不會等待文檔數據庫服務實例的響應.
- w: 1 表示寫入操作需要至少一個文檔數據庫服務實例確認,等待一個文檔數據庫服務實例的響應;
- w: majority 表示寫入操作需要大多數文檔數據庫服務實例確認,等待大多數文檔數據庫服務實例的響應;
- w: n 表示寫入操作需要n個文檔數據庫服務實例確認,等待n個文檔數據庫服務實例的響應。
-
使用事務:文檔數據庫服務4.0及以上版本支持事務,可以使用事務來保證數據的一致性和可靠性。可以使用事務來確保多個操作的原子性,例如同時寫入多個文檔或修改多個文檔。
-
使用正確的索引:正確使用索引可以提高文檔數據庫服務查詢的效率和性能,并減少數據錯誤和丟失的風險。
-
備份和恢復數據:定期備份文檔數據庫服務數據可以保證數據的可靠性和恢復性,可以使用mongodump和mongorestore命令來備份和恢復數據。
性能相關
規范
在使用文檔數據庫服務時,為了提高數據庫系統的性能和效率,需要遵守一些性能相關規范和最佳實踐。以下是一些常見的文檔數據庫服務性能相關規范:
- 合適的索引設計:正確的索引設計可以提高文檔數據庫服務的查詢性能和效率,可以根據應用程序的查詢需求來選擇適當的索引類型和字段。
- 使用合適的數據模型:文檔數據庫服務是一種文檔型數據庫,可以使用嵌入式文檔或引用式文檔來存儲數據。使用合適的數據模型可以提高查詢效率和數據訪問的速度。
- 避免全表掃描:文檔數據庫服務在執行查詢時,應該避免全表掃描,盡量使用索引來加速查詢。可以使用explain命令來分析查詢的性能和索引的使用情況。
- 分布式擴展:文檔數據庫服務支持分布式擴展,可以使用分片技術將數據分散到多個文檔數據庫服務實例中,提高系統的吞吐量和性能。
- 使用合適的數據類型:文檔數據庫服務支持多種數據類型,應該根據應用程序的需求來選擇合適的數據類型。例如,可以使用二進制數據類型來存儲大型文件,使用數組來存儲具有相同屬性的數據。
- 使用合適的查詢語句:在查詢文檔數據庫服務數據庫時,應該使用合適的查詢語句和操作符,避免使用不必要的查詢條件和操作符,以提高查詢效率和性能。
- 開發過程中對集合的每一個操作都要通過執行explain()檢查其執行計劃,如:
db.students.find({age: 20}, {name: 1, _id: 0}).explain();
- 合理的系統配置:為了提高文檔數據庫服務的性能和效率,應該合理配置文檔數據庫服務的系統參數和資源限制,例如內存、磁盤和CPU等。
執行計劃查看
在文檔數據庫服務中,可以使用explain()方法來查看查詢執行計劃,了解查詢語句的性能和索引使用情況。執行explain()方法后,文檔數據庫服務會返回一個文檔,其中包含了查詢執行的詳細信息。
以下是在文檔數據庫服務中查看執行計劃的步驟:
- 執行查詢語句:首先需要執行要查看執行計劃的查詢語句,例如:
db.collection.find({field: "value"})
- 執行explain()方法:在查詢語句之后加上explain()方法,例如:
db.collection.find({field: "value"}).explain()
- 查看執行計劃:執行explain()方法后,文檔數據庫服務會返回一個文檔,其中包含了查詢執行的詳細信息。可以查看文檔中的queryPlanner字段、executionStats字段和serverInfo字段,了解查詢的執行計劃、查詢的性能和索引使用情況等信息。例如:
{
? "queryPlanner" : {...},
? "executionStats" : {...},
? "serverInfo" : {...}
}
在執行計劃文檔中,常見的字段和屬性包括:
- queryPlanner: 查詢計劃器,表示文檔數據庫服務是如何執行查詢的。
- executionStats: 執行統計,表示查詢的執行情況和性能。
- winningPlan: 最優查詢計劃,表示文檔數據庫服務選擇的最優查詢計劃。
- rejectedPlans: 拒絕的查詢計劃,表示文檔數據庫服務拒絕的查詢計劃。
- totalKeysExamined: 索引掃描的次數,表示查詢過程中掃描的索引數量。
- totalDocsExamined: 文檔掃描的次數,表示查詢過程中掃描的文檔數量。
- executionTimeMillis: 查詢的執行時間,表示查詢完成所需的時間。
執行計劃解析:
-
看執行時間:executionStats.executionStages.executionTimeMillisEstimate和executionStats.executionStages.inputStage. executionTimeMillisEstimate時間越短越好。
- executionStats.executionTimeMillis表示執行計劃選擇和執行的所有時間。
- executionStats.executionStages.executionTimeMillisEstimate表示最優執行計劃的執行完成時間。
- executionStats.executionStages.inputStage. executionTimeMillisEstimate表示最優執行計劃下的子階段執行完成時間。
-
看掃描條數:三個條目數相同為最佳。
- executionStats. nReturned表示匹配查詢條件的文檔數。
- executionStats .totalKeysExamined表示索引掃描條目數。
- executionStats .totalDocsExamined表示文檔掃描條目數。
-
看Stage狀態,性能較好的Stage狀態組合如下。
- Fetch+IDHACK
- Fetch+ixscan
- Limit+(Fetch+ixscan)
- PROJECTION+ixscan
狀態說明:
狀態名稱 狀態名稱 COLLSCAN 全表掃描 SORT 內存中進行排序 IDHACK 根據_id進行查詢 TEXT 全文索引 FETCH 索引掃描 LIMIT 使用Limit限制返回數 SUBPLA 未用索引的$or查詢階段 PROJECTION 未用索引的$or查詢階段 COUNT_SCAN 使用索引計數
Cursor使用規則
在文檔數據庫服務中,查詢操作返回的結果是一個游標(Cursor),游標可以用來遍歷查詢結果集,可以通過Cursor對象進行一些操作。以下是一些常見的文檔數據庫 服務Cursor使用規則:
- 顯式關閉游標:當使用游標查詢文檔數據庫服務的數據庫時,應該顯式地關閉游標對象,以釋放游標占用的資源。可以使用close()方法來關閉游標對象,例如:
cursor = db.collection.find()
# 遍歷游標
for doc in cursor:
? print(doc)
# 關閉游標
cursor.close()
- 使用迭代器遍歷游標:可以通過Cursor對象的迭代器來遍歷游標,避免一次性加載所有查詢結果并占用過多的系統資源。例如:
cursor = db.collection.find()
# 使用迭代器遍歷游標
for doc in cursor:
? print(doc)
- 限制查詢結果:可以使用limit()方法來限制查詢結果的數量,避免查詢結果集過大而占用過多的系統資源。例如:
cursor = db.collection.find().limit(10)
# 遍歷游標
for doc in cursor:
? print(doc)
- 跳過查詢結果:可以使用skip()方法來跳過查詢結果的前幾條記錄,以便查詢后面的記錄。例如:
cursor = db.collection.find().skip(10)
# 遍歷游標
for doc in cursor:
? print(doc)
- 排序查詢結果:可以使用sort()方法來對查詢結果進行排序,以便按照指定的順序返回查詢結果。例如:
cursor = db.collection.find().sort("field", 1)
# 遍歷游標
for doc in cursor:
? print(doc)
總之,在使用文檔數據庫服務Cursor時,需要遵守一些規則和最佳實踐,以提高查詢性能和效率,避免占用過多的系統資源。