【发布时间】:2018-04-18 00:43:09
【问题描述】:
我正在尝试使用 MySql 在 Coldfusion 中进行分页,以一次检索 20 条记录。首先,我得到我想要检索的记录总数。
<CFQUERY DATASOURCE="#datasource#" USERNAME="#username#" PASSWORD="#password#" NAME="myCount" CACHEDWITHIN="#CreateTimeSpan(0,0,3,0)#">
SELECT COUNT(*) as TotalCount
FROM products
WHERE products.field1 = <cfqueryparam value = "#myfield#" cfsqltype = "cf_sql_integer" maxLength = "2">
AND MATCH(field2) AGAINST(<cfqueryparam value = "#TRIM(string)#" cfsqltype = "cf_sql_char" maxLength = "52"> IN BOOLEAN MODE)
</CFQUERY>
然后我使用以下方法一次检索 20 条记录:
<CFQUERY DATASOURCE="#datasource#" USERNAME="#username#" PASSWORD="#password#" NAME="myQuery" result="tmpResult">
SELECT products.field1, products.field2, products.field3, company.field1, company.field2
FROM products JOIN company ON products.field1 = company.field1
WHERE products.field2 = <cfqueryparam value = "#myfield#" cfsqltype = "cf_sql_integer" maxLength = "2">
AND MATCH(field2) AGAINST(<cfqueryparam value = "#TRIM(string)#" cfsqltype = "cf_sql_char" maxLength = "52"> IN BOOLEAN MODE)
ORDER by products.field3 DESC
LIMIT <cfqueryparam value="#start#" cfsqltype="cf_sql_integer">, 20
</CFQUERY>
(注意:每页#start#的值会增加20。)
似乎一切正常。当我单击第一页时,执行时间(#tmpResult.ExecutionTime#)表明检索 20 条记录需要 40 (我假设是毫秒)。但是,如果我单击最后一页(可能是记录号 40,000),则检索最后 20 条记录需要 500 毫秒。回过头来看,那些后面的页面似乎需要更长的时间来检索。
为什么会出现差异?无论是从“前”还是“后”,检索相同数量的 20 条记录不应该花费相同的时间吗?我在这里错过了什么吗?提前致谢。
【问题讨论】:
-
我一直在喝酒,所以我可能会遗漏一些东西,但在我看来,执行时间是您最不担心的事情。您的第二个查询看起来每次都会返回相同的 20 条记录,除非数据发生变化。
-
@DanBracuk 抱歉,这不是完整的代码。 #start# 的值将根据页码增加。我将添加更多解释。
-
您不可能为每个页面获得相同的性能,它正在被排序,然后它必须到达要返回的第一行。这些都不是“免费的时间和精力”,事实上恰恰相反,基于排序的排序和分页既昂贵又耗时。
-
@Used_By_Already 每次迭代都有相同的排序。只需检索前 20 条或后 20 条记录。我只是不明白为什么获取“最后”20 条记录总是需要更长的时间。
标签: mysql performance pagination coldfusion