【问题标题】:MYSQL - Pagination query execution time issueMYSQL - 分页查询执行时间问题
【发布时间】: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


【解决方案1】:

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

如果最初的 COUNT(*) 可能很慢,请重新考虑 UI。请注意搜索引擎如何不再告诉您找到了多少项目,或者至少只给您一个大概的答案?从他们很久以前学到的教训中得到启示。

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

但情况会变得更糟。如果查询太复杂,它必须找到all匹配的行,对其中的all进行排序,只有then做偏移和限制。在这种情况下,当有大量行时,即使是第一页也很慢。

【讨论】:

    猜你喜欢
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2020-11-15
    • 1970-01-01
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多