【问题标题】:Pagination MYSQL count vs PHP count and array_slice分页 MYSQL 计数与 PHP 计数和 array_slice
【发布时间】:2019-12-30 14:34:02
【问题描述】:

我有一个搜索查询,它从搜索表中查找匹配值并返回与关键字匹配的所有可能条目。我没有编写搜索,它是已经存在的东西,我们正在将它移植到另一个框架。无论如何,这不是重点。

我想要的是执行一个 MySQL 查询 (InnoDB),使用 LIMIT,并拥有所有结果中的 COUNT 供我使用分页(计算总页数) .我假设使用 LIMIT 对速度有一些影响,但在测量执行时间之后,它似乎没有太大影响(至少在这种情况下)。

问题:

COUNT 行(仅计数)使用单独的查询所花费的时间与实际查询一样多。在这种情况下大约需要 11 秒,所以整个执行大约需要 22 秒。

// Fetch Count approximately 11 seconds
SELECT COUNT(id) FROM table WHERE ...

// Fetch All approximately 11 seconds
SELECT id, name FROM table WHERE ...

我使用的另一种方法是不使用LIMIT 进行搜索,然后使用PHP 自己的count() 函数获取我得到的结果数,然后使用array_slice() 限制页面的条目数.这实际上被证明更快,因为查询大约需要 12 秒,PHP 只需要几分之一秒。所以大约是一半。

// Fetch All approximately 11-12 seconds
$results = SELECT id, name FROM table WHERE ...
// PHP count and slice took a fraction of a second
$count = count($results);
$results = array_slice($results, $page, $limit);

我还尝试在第一个 LIMIT 查询中使用 COUNT,因此我不必为此使用单独的查询,但似乎 PDO 自己的 fetchAll 在每个数组条目中返回不同的结果.我得到的是 2、1、1、1...

SELECT COUNT(id) as `count`, id, name FROM table WHERE ...

问题:

实际查询分页结果的最快方法是什么?

【问题讨论】:

    标签: php mysql pdo pagination


    【解决方案1】:

    第二个选项根本不是一个选项。

    另一方面,11 秒仍然是绝对不能接受的。因此,为了使您的代码正确,您必须优化 搜索查询。这应该是您的目标和关注点。

    【讨论】:

    • 谢谢!你完全正确。正如我在顶部所说,搜索不是我们做的,但我通过首先搜索 ids 来优化我需要在另一个表(从搜索表)中搜索的条目,因为它们之前是通过 LEFT JOIN 搜索的,然后我只是添加WHERE 子句中的那些 id。执行时间下降到 1\10th。
    【解决方案2】:

    您好,请问哪种方法最好?我现在正在研究这个问题,并试图找到加快速度的最佳方法。

    我正在使用

    // Fetch All Rows 
    $results = SELECT id, name FROM table WHERE ...
    // PHP count and slice took a fraction of a second
    $count = count($results);
    $results = array_slice($results, $page, $limit);
    

    我无法找出 array_slice 的性能,所以不确定它是否是最好的方法,或者我应该恢复到特别是对于大型数据集

    // Fetch Count of all rows for pagination
    SELECT COUNT(id) FROM table WHERE ...
    
    // Fetch the require rows
    SELECT id, name FROM table WHERE ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多