数据库连接
在使用文档数据库服务进行应用程序开发时,为了保证数据库连接的安全性和可靠性,需要遵守一些数据库连接规范。以下是一些常用的文档数据库服务连接规范:
- 使用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时,需要遵守一些规则和最佳实践,以提高查询性能和效率,避免占用过多的系统资源。