分页MYSQL计数与PHP计数和数组_切片

分页MYSQL计数与PHP计数和数组_切片,php,mysql,pdo,pagination,Php,Mysql,Pdo,Pagination,我有一个搜索查询,它从搜索表中查找匹配的值,并返回与关键字匹配的所有可能条目。我没有编写搜索,它已经存在,我们正在将它移植到另一个框架。无论如何,这不是重点 我想要的是使用LIMIT执行一个MySQL查询(InnoDB),并对分页的所有结果进行COUNT(计算总页数)。我假设使用LIMIT对速度有一些影响,但在测量执行时间后,它似乎没有太大影响(至少在本例中是这样) 问题: 使用单独的查询对行进行计数与实际查询花费的时间相同。在本例中,大约11秒,因此整个执行大约为22秒 // Fetch Co

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

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

问题:

使用单独的查询对
行进行计数
与实际查询花费的时间相同。在本例中,大约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\u 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 ...
问题:


实际查询分页结果的最快方法是什么?您可以使用结果和结果计数?

第二个选项根本不是选项


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

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

我目前正在使用

// 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 ...

非常感谢。你完全正确。正如我在顶部所说的,搜索不是我们做的,但我优化了它,首先在ID中搜索我需要在另一个表中搜索的条目(从搜索表中),因为它们以前是通过左连接搜索的,然后我只是在WHERE子句中添加了这些ID。执行时间降至1/10。