MYSQL - 分页查询执行时间问题

时间:2017-11-05 21:50:11

标签: mysql performance pagination coldfusion

我试图在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条记录花费相同的时间吗?我在这里错过了什么吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

首先阅读并研究我的blog on why Pagination via Offset is bad。请注意,它解释了一种使其更快的方法。

如果初始COUNT(*)可能很慢,请重新考虑用户界面。请注意搜索引擎如何不再告诉您已找到多少项目,或者至少只给您一个近似答案?从他们很久以前学到的教训中汲取灵感。

要解决您的“为什么”问题... LIMIT 100, 20必须找到120行,跳过100,然后递送20.所以页面变得越来越慢。

但它变得更糟。如果查询过于复杂,则必须找到 all 匹配的行,排序所有,然后只有然后执行偏移和限制。在这种情况下,当存在大量行时,即使第一页也很慢。