我花了几个小时玩这个,到目前为止没有成功。
我正在输出一个非常大的查询,并尝试在处理数据之前将其拆分为块。此查询基本上每天都会运行,其中一个字段('last_checked')将用于确保每天不会多次处理相同的数据。
这是我现有的查询;
<cfquery name="getprice" maxrows="100">
SELECT ID, source, last_checked, price
FROM product_prices
WHERE source='api'
ORDER BY ID ASC
</cfquery>
然后我对结果运行cfoutput查询以进行各种更新。该表目前只有100,000多条记录,并且开始努力处理所有内容,因此需要将其拆分为块。
我的意图是cfschedule它经常运行(例如,我会增加最大值并且可能每15分钟运行一次)。但是,我只需要返回过去24小时内未更新的结果 - 这就是我遇到的问题。
我知道MySQL有它自己的DateDiff和TimeDiff函数,但我似乎无法掌握它的语法 - 如果它确实适用于我的用途(文档似乎在这方面自相矛盾 - 或者,至少我读过的那些。)
非常感谢任何指针!
答案 0 :(得分:1)
首先尝试使用MySQL:
SELECT ID, source, last_checked, price
FROM product_prices
WHERE source='api'
AND last_checked >= current_timestamp - INTERVAL 24 HOUR
ORDER BY ID ASC
答案 1 :(得分:1)
我会提醒您不要在cfquery中使用maxrows=100
。这仍将从数据库返回CF的完整记录集,然后CF将过滤除前100行以外的所有记录集。当您处理100,000行数据集时,这将非常昂贵。据推测,过去24小时内的过滤器将大大减小基本结果集的大小,因此这可能不是一个大问题。但是,如果您发现即使将您的设置限制为在过去24小时内更改的设置,您仍然可以使用非常大的记录集,您可以更改这种方式以更有效地工作。 MySQL不是使用CF来过滤结果,而是使用查询中的LIMIT关键字来执行此操作:
SELECT ID, source, last_checked, price
FROM product_prices
WHERE source='api'
AND last_checked >= current_timestamp - INTERVAL 1 DAY
ORDER BY ID ASC
LIMIT 0,100
您还可以通过在LIMIT之前添加偏移值来轻松地在100行的“页面”之间进行设置:LIMIT 300, 100
将是结果集中的行300-400。以这种方式进行分页比将其卸载到CF要快得多。