【问题标题】:How to optimize find by date query in mongo如何在 mongo 中优化按日期查询查找
【发布时间】:2025-12-24 22:10:06
【问题描述】:

我有一个包含 60 万个文档的集合。大多数文档的结构如下所示,

{
    "_id" : ObjectId("53d86ef920ba274d5e4c8683"),
    "checksum" : "2856caa9490e5c92aedde91330964488",
    "content" : "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\r\n<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"bn-bd\" lang=\"bn-bd\" dir=\"ltr\" " />\n  <link rel=\"stylesheet\" href=\"/templates/beez_20/css/position.css\" type=\"text/css\" media=\"screen,projection\ef=\"/index.php/bn/contact-bangla/2013-0</body>\r\n</html>",
    "date" : ISODate("2014-07-29T15:57:11.886Z"),
    "filtered_content" : "",
    "indexed" : true,
    "category": 'raw',
    "link_extracted" : 1,
    "parsed" : true,
    "title" : "Constituency 249_10th_En",
    "url" : "http://www.somesite.com.bd/index.php/bn/bangla/2014-03-23-11-45-04?layout=edit&id=2143"
}

所有文档都有 date 属性。现在,当我在下面编写查询时,我得到了无限期的延迟来显示结果。

from pymongo import Connection
import datetime

con = Connection()
db = con.spider
pages = db.pages

today = datetime.datetime.combine( datetime.date.today(), datetime.datetime.min.time() )

c = pages.find({ u'category': 'news', u'date': {u'$gt': today } }, {u'title': 1, '_id': 0} )

for item in c:
    print item

索引是,

_id, url, parsed

如何在可接受的时间范围内提高此查询的性能?任何可靠的答案,建议表示赞赏!

【问题讨论】:

  • 这是你唯一的索引吗?你有日期索引吗?
  • 刚开始使用 mongodb。对更多索引有点怀疑。不,我没有日期索引。
  • 在本地开发过程中您可以做的一件事是配置您的 mongodb 在不使用索引时使查询失败。或者它只是在日志中列出这样的查询:*.com/questions/9191615/… 这将允许您确保您的查询尽可能快地运行。您还可以寻找满足您查询的索引的最小子集。

标签: python mongodb query-optimization pymongo nosql


【解决方案1】:

似乎在categorydate 上添加索引会有所帮助。

pages.createIndex({'date': 1, 'category': 1});

在 pymongo 中,the index creation 看起来更像这样:

keys = [
    ("date", pymongo.ASCENDING),
    ("category", pymongo.ASCENDING)
]
pages.create_index(keys)

您最感兴趣的选项是:

name: custom name to use for this index - if none is given, a name will be generated
unique: if True creates a unique constraint on the index

不过,我不认为日期/类别会是唯一的。为索引命名似乎是一个好习惯。

【讨论】:

  • hugh,是不是大幅度增加了内存大小?
  • @Dewsworld MongoDB 总是尽可能多地占用内存。因此,当您因为您的数据库服务器已经使用其所有 RAM 而感到恐慌时,请放心,无论您做什么都是如此。这是设计使然。
  • @hughbrown 就像一个魅力!请在 pages.createIndex({'date': 1, 'category' 后添加冒号