gpt4 book ai didi

php - 极慢的锂查询,在 MongoDB 中很快

转载 作者:可可西里 更新时间:2023-11-01 09:25:04 25 4
gpt4 key购买 nike

所以,我现在一直在试用 php 框架 lithium,它似乎是一个非常好的框架,但我有一个小问题。我在一个只有 6k+ 文档的集合上运行的查询在 php 中运行速度惊人地慢,但在我从终端运行时却非常快。

集合中的一个文档可能如下所示:

{
"_id" : ObjectId("504c9a3b6070d8b7ea61938e"),
"startDate" : "Jan 2011",
"episodes" : [
{
"title" : "Series 1, Episode 1",
"airdate" : ISODate("2011-01-20T00:00:00Z"),
"epnum" : "1",
"prodnum" : null,
"seasonnum" : "01",
"link" : "http://www.tvrage.com/10_OClock_Live/episodes/1065007783"
},
{and maybe 20 more},
],
"runTime" : "60 min",
"endDate" : "Apr 2012",
"network" : "Channel 4",
"numberOfEpisodes" : "25 eps",
"title" : "10 O'Clock Live",
"directory" : "10OClockLive",
"country" : "UK",
"tvrage" : "27363"
}

我想获取当月存在的所有剧集。所以在终端中(我使用假值和一个多月)我使用以下查询:

db.series.find({'episodes.airdate': {$gt: ISODate('2012-09-07 00:00:00'), $lt: ISODate('2012-11-01')}})

哇哦,它进行得非常快。即使我对查询执行 explain(),它也会告诉我它很快:

{
"cursor" : "BtreeCursor episodes.airdate_1",
"isMultiKey" : true,
"n" : 382,
"nscannedObjects" : 1620,
"nscanned" : 1620,
"nscannedObjectsAllPlans" : 1620,
"nscannedAllPlans" : 1620,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
**"millis" : 181**,
"indexBounds" : {
"episodes.airdate" : [
[
ISODate("2012-09-07T00:00:00Z"),
ISODate("292278995-01--2147483647T07:12:56.808Z")
]
]
},
"server" : "example:27017"
}

但是当我在 php 和 lithium 中使用查询时,伙计,它需要很长时间:

$series = Series::find('all', array(
'fields' => array('title', 'episodes.title', 'episodes.airdate'),
'conditions' => array('episodes.airdate' => array('$gt' => new MongoDate(strtotime(date('Y-m-01'))), '$lt' => new MongoDate(strtotime(date('Y-m-t')))))
));

如果我什至尝试循环遍历它,那么它会更糟远远超过 30 秒的执行时间。尽管如此,我认为我有内存泄漏,因为我必须添加此 ini_set('memory_limit', '-1'); 而没有获得“最大使用量”或其他任何内容。

谁能告诉我为什么会这样?有什么办法可以提高查询速度吗?我不知道为什么它这么慢,如果有人能指出我正确的方向,我会非常高兴。

最佳答案

问题是 Lithium 将所有数据打包在对象中,对于大型查询来说,这可能会占用大量内存,因此速度很慢。如果您不需要该特定查询的任何 ActiveRecord 功能,则可以将一个选项传递给 find(),该选项将传递给 MongoDb::read()(因此查看文档中的 MongoDb::read()),它允许您取回原始数组或可以手动迭代的实际数据库游标。

另一种选择是等到我实现流式迭代,这将解决内存问题。 :-)

关于php - 极慢的锂查询,在 MongoDB 中很快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12772994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com