python操作MongoDB进行CURD操作以及常见的调优技巧

pip安装

pip install pymongo

# 导入pymongo模块
import pymongo

# 连接MongoDB数据库
client = pymongo.MongoClient("mongodb://localhost:27017/")

# 创建数据库
db = client["mydatabase"]

# 创建集合
col = db["customers"]

# 插入文档
mydict = { "name": "John", "address": "Highway 37" }
x = col.insert_one(mydict)

# 打印插入文档的id
print(x.inserted_id)

# 查询文档
x = col.find_one()
print(x)

# 更新文档
myquery = { "address": "Highway 37" }
newvalues = { "$set": { "address": "Canyon 123" } }
col.update_one(myquery, newvalues)

# 删除文档
myquery = { "address": "Canyon 123" }
col.delete_one(myquery)

# 删除集合
col.drop()

# 删除数据库
client.drop_database("mydatabase")

当涉及到MongoDB的性能调优时,以下是一些常见的技巧和最佳实践:

  1. 确保索引的使用

  1. 避免全表扫描

  1. 适当使用分片

  1. 控制查询返回的数据量

  1. 避免频繁的更新操作

  1. 合理使用副本集和分片集群

举例:

1. 确保索引的使用

# 如果查询的字段没有索引,那么查询的效率会非常低,因为MongoDB会扫描整个集合来查找匹配的文档。因此,我们需要确保查询的字段都有索引。

# 例如,如果我们有一个名为“customers”的集合,其中包含一个名为“name”的字段,我们可以使用以下代码为该字段创建索引:

col.create_index("name")

2. 避免全表扫描

# 全表扫描是指MongoDB扫描整个集合来查找匹配的文档。这是非常低效的,因为它需要大量的CPU和内存资源。为了避免全表扫描,我们可以使用查询条件来限制返回的文档数量。

# 例如,如果我们只想返回名字为“John”的文档,我们可以使用以下代码:

x = col.find({"name": "John"})

3. 适当使用分片

分片是指将数据分散到多个服务器上,以便可以处理更大的数据集。

# 例如,如果我们有一个非常大的集合,我们可以将其分成多个分片,并将每个分片存储在不同的服务器上。这样,我们就可以处理更大的数据集,并提高查询的效率。

# 以下是一个使用分片的示例:

# 首先,我们需要启动mongod进程,并指定--shardsvr选项:

# mongod --shardsvr --port 27018

# 然后,我们需要将分片添加到集群中:

client.admin.command('addshard', 'localhost:27018')

# 然后,我们需要将集合分片:

client.admin.command('enablesharding', 'mydatabase')

client.admin.command('shardcollection', 'mydatabase.customers', key={'name': 1})

4. 控制查询返回的数据量

# 如果我们查询的文档非常大,那么查询的效率会非常低,因为MongoDB需要将整个文档从磁盘读取到内存中,然后将其发送到客户端。因此,我们需要控制查询返回的数据量。

# 例如,如果我们只想返回名字为“John”的文档的地址字段,我们可以使用以下代码:

x = col.find({"name": "John"}, {"address": 1, "_id": 0})

5. 避免频繁的更新操作

# 更新操作是非常消耗资源的,因为它需要将文档从磁盘读取到内存中,然后进行修改,最后将其写回磁盘。因此,我们应该尽量避免频繁的更新操作。

# 例如,如果我们需要更新一个文档的多个字段,我们可以使用$set操作符来更新这些字段,而不是使用多个update操作。

# 以下是一个使用$set操作符的示例:

myquery = {"name": "John"}

newvalues = {"$set": {"address": "Canyon 123", "phone": "555-5555"}}

col.update_one(myquery, newvalues)

# 6. 合理使用副本集和分片集群

# 副本集是指将数据复制到多个服务器上,以便可以提高数据的可用性和可靠性。分片集群是指将数据分散到多个服务器上,以便可以处理更大的数据集。

# 例如,如果我们有一个非常重要的集合,我们可以将其复制到多个服务器上,以便在一个服务器出现故障时,可以从其他服务器上恢复数据。

# 以下是一个使用副本集的示例:

# 首先,我们需要启动mongod进程,并指定--replSet选项:

mongod --replSet rs0 --port 27017

然后,我们需要将服务器添加到副本集中:

client.admin.command('replSetInitiate')
client.admin.command('replSetAdd', 'localhost:27018')

然后,我们需要将集合复制到副本集中:

client.admin.command('enablesharding', 'mydatabase')
client.admin.command('shardcollection', 'mydatabase.customers', key={'name': 1})

1. 确保正确的索引:索引是MongoDB中查询性能的关键因素,因此必须确保正确的索引为集合进行配置。对于复杂的查询,使用复合索引可以提高查询性能。

2. 选择适当的存储引擎:MongoDB提供了多种存储引擎,包括MMapv1、WiredTiger和in-memory。根据应用程序的性质和需求来选择合适的存储引擎。

3. 增加可用性和可伸缩性:MongoDB的可伸缩性和高可用性是它的一个主要卖点,使用分片和副本集来增强系统的可用性和可伸缩性。

4. 使用合适的硬件:为MongoDB分配足够的内存和磁盘空间,以确保系统的高性能及稳定运行。可以考虑使用专用的磁盘或SSD,以提高磁盘I/O性能。

5. 进行日志记录和监控:MongoDB可以记录各种事件及其所引发的响应情况。监控是必要的,以追踪系统的活动和运行情况。可以使用日志记录和监控工具来实现这一目标。

6. 数据模式的设计:合理地设计数据模式,避免重复和过度嵌套以及使用具有强类型的标准数据库的优势。通过减少数据包的大小和复杂性,可以最大限度地提高写入和读取性能。

7. 考虑查找的常见模式:对于常见查询使用索引,对于常见查询模式采用合适的策略。例如,对于范围查询使用Unix时间戳进行简化,对于文本搜索使用全文索引的模式,减少工作集上下文交互是提高性能的最好方法之一。

8. 总体上考虑这些技巧,可以帮助优化MongoDB的性能,从而实现更好的访问速度和响应能力。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值