我试图在Coldfusion中使用MySql进行分页,一次检索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#
)表示需要40(我假设它是毫秒)来检索20条记录。但是,如果我点击最后一页(可能是记录号40,000),则需要500毫秒来检索最后20条记录。向后看,似乎那些后来的页面需要更长的时间来检索。
为什么会出现差异?不管是从“前面”还是“后面”,不应该检索相同数量的20条记录花费相同的时间吗?我在这里错过了什么吗?提前谢谢。
答案 0 :(得分:0)
首先阅读并研究我的blog on why Pagination via Offset is bad。请注意,它解释了一种使其更快的方法。
如果初始COUNT(*)
可能很慢,请重新考虑用户界面。请注意搜索引擎如何不再告诉您已找到多少项目,或者至少只给您一个近似答案?从他们很久以前学到的教训中汲取灵感。
要解决您的“为什么”问题... LIMIT 100, 20
必须找到120行,跳过100,然后递送20.所以页面变得越来越慢。
但它变得更糟。如果查询过于复杂,则必须找到 all 匹配的行,排序所有,然后只有然后执行偏移和限制。在这种情况下,当存在大量行时,即使第一页也很慢。