Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用SQL查询时,最有效的分页方式是什么?_Php_Sql_Sqlite_Pdo - Fatal编程技术网

Php 使用SQL查询时,最有效的分页方式是什么?

Php 使用SQL查询时,最有效的分页方式是什么?,php,sql,sqlite,pdo,Php,Sql,Sqlite,Pdo,我正在尝试对SQL查询的结果进行分页,以便在网页上使用。语言和数据库后端是PHP和SQLite 我使用的代码的工作原理与此类似(页码从0开始) 还有比这更有效的分页方法吗 我目前的方法存在的一个问题是,在开始显示结果之前,我必须将所有10个(或任意多个)结果存储在内存中。我这样做是因为PDO不能保证行计数可用 发出COUNT(*)查询以了解存在多少行,然后将结果流式传输到浏览器是否更有效 这是否属于“这取决于表的大小,以及计数(*)查询是否需要在数据库后端进行完整的表扫描”,“自己进行一些分析

我正在尝试对SQL查询的结果进行分页,以便在网页上使用。语言和数据库后端是PHP和SQLite

我使用的代码的工作原理与此类似(页码从0开始)

还有比这更有效的分页方法吗

我目前的方法存在的一个问题是,在开始显示结果之前,我必须将所有10个(或任意多个)结果存储在内存中。我这样做是因为PDO不能保证行计数可用

发出
COUNT(*)
查询以了解存在多少行,然后将结果流式传输到浏览器是否更有效


这是否属于“这取决于表的大小,以及
计数(*)
查询是否需要在数据库后端进行完整的表扫描”,“自己进行一些分析”之类的问题?

我建议先进行计数。计数(主键)是一个非常有效的查询。

我建议先进行计数。计数(主键)是一个非常有效的查询。

我怀疑用户等待后端返回十行是否会有问题。(您可以通过擅长指定图像尺寸、尽可能让Web服务器协商压缩数据传输等方式来弥补这些不足。)

我不认为最初进行计数(*)对您非常有用

如果您正在进行一些复杂的编码:当用户查看页面x时,请使用类似ajax的magic来预加载页面x+1,以改善用户体验

关于分页的一般说明:
如果在用户浏览页面时数据发生更改,那么如果您的解决方案要求非常高的一致性,则可能会出现问题。关于这一点,我已经写了一个说明。

我怀疑用户等待后端返回十行是否会有问题。(您可以通过擅长指定图像尺寸、尽可能让Web服务器协商压缩数据传输等方式来弥补这些不足。)

我不认为最初进行计数(*)对您非常有用

如果您正在进行一些复杂的编码:当用户查看页面x时,请使用类似ajax的magic来预加载页面x+1,以改善用户体验

关于分页的一般说明:
如果在用户浏览页面时数据发生更改,那么如果您的解决方案要求非常高的一致性,则可能会出现问题。我已经为此写了一个注释。

我选择使用COUNT(*)two查询方法,因为它允许我直接创建指向最后一页的链接,而另一个方法不允许这样做。首先执行计数还允许我对结果进行流式处理,因此应该可以很好地处理更多记录和更少内存


页面之间的一致性对我来说不是问题。谢谢您的帮助。

我选择使用COUNT(*)two查询方法,因为它允许我直接创建指向最后一页的链接,而另一种方法不允许这样做。首先执行计数还允许我对结果进行流式处理,因此应该可以很好地处理更多记录和更少内存


页面之间的一致性对我来说不是问题。谢谢您的帮助。

在一些情况下,我有一个相当复杂的(9-12表联接)查询,返回数千行,需要分页。显然,要很好地分页,您需要知道结果的总大小。对于MySQL数据库,在SELECT中使用SQL\u CALC\u FOUND\u ROWS指令可以帮助您轻松实现这一点,尽管目前还不能确定这样做是否更有效


但是,由于您使用的是SQLite,我建议您坚持使用2查询方法。这是一条非常简洁的线索。

在一些情况下,我有一个相当复杂的(9-12表联接)查询,返回数千行,需要分页。显然,要很好地分页,您需要知道结果的总大小。对于MySQL数据库,在SELECT中使用SQL\u CALC\u FOUND\u ROWS指令可以帮助您轻松实现这一点,尽管目前还不能确定这样做是否更有效


但是,由于您使用的是SQLite,我建议您坚持使用2查询方法。这是一条非常简洁的线索。

。。。只要不在没有索引的列上筛选(WHERE),并且不使用联接:)。。。只要不对没有索引的列进行筛选(其中),并且不使用联接:)
page = request(page)
per = 10 // results per page
offset = page * per

// take one extra record so we know if a next link is needed
resultset = query(select columns from table where conditions limit offset, per + 1)

if(page > 0) show a previous link
if(count(resultset) > per) show a next link

unset(resultset[per])

display results