Php mysql_data_seek的性能影响

Php mysql_data_seek的性能影响,php,performance,Php,Performance,我已经开始使用mysql_data_seek()作为一种简单的方法,通过移动指针并读取当前的“页面”,将分页透明地滚动到我的数据库类中 这样做对性能有什么影响?我只是将我需要的数据读入PHP本身,但在大多数情况下,SELECT覆盖了整个表——这很糟糕,我会遇到大量表的问题吗?我认为在SELECT语句中使用适当的LIMIT子句更有效(它肯定会至少节省查找时间),但是我不知道mysql\u data\u seek的内部是如何工作的,特别是如果它读取x记录并丢弃它们,或者它是否像filesystems

我已经开始使用mysql_data_seek()作为一种简单的方法,通过移动指针并读取当前的“页面”,将分页透明地滚动到我的数据库类中


这样做对性能有什么影响?我只是将我需要的数据读入PHP本身,但在大多数情况下,SELECT覆盖了整个表——这很糟糕,我会遇到大量表的问题吗?

我认为在
SELECT
语句中使用适当的
LIMIT
子句更有效(它肯定会至少节省查找时间),但是我不知道
mysql\u data\u seek
的内部是如何工作的,特别是如果它读取
x
记录并丢弃它们,或者它是否像filesystem
seek
命令那样工作(向mysql发送一个信号,告诉它跳过发送下一个
x
记录)


如果是第一种方式,我希望这样做会有最小的加速。如果是后一种方式,我希望速度会加快,但不如简单地使用适当的
LIMIT
子句。

我认为在
SELECT
语句中使用适当的
LIMIT
子句更有效(它肯定会至少节省查找时间),但是我不知道
mysql\u data\u seek
的内部是如何工作的,特别是如果它读取
x
记录并丢弃它们,或者它是否像filesystem
seek
命令那样工作(向mysql发送一个信号,告诉它跳过发送下一个
x
记录)


如果是第一种方式,我希望这样做会有最小的加速。如果是后一种方式,我希望速度会加快,但不会像简单地使用适当的
限制
子句那样快。

唯一需要担心的是表大小

基本上,您的权衡是:

  • 将整个表/结果读取到单个resultset中,保存到数据库的往返
  • 或者对数据库进行多次小型访问,每页一次
如果您的应用程序意味着用户通常无法通过第一页或第二页,那么您就不必要地存储了大量数据。o如果您的用户倾向于访问所有页面,并且有很多页面(并且每次页面访问都不会启动新的页面请求/结果集,即您使用的是动态分页或某些半持久性服务器端内存容器),那么将结果集保留在一个位置就可以了,特别是在多个用户之间缓存的情况下

然而,除非您已经将其构建到您的体系结构中,否则您最好使用

...LIMIT 10,10

...LIMIT 20,10

但是,在您的查询中,会遇到多个DB命中,以避免读取的数据超过您需要的数据量,并不必要地存储这些数据。

唯一需要担心的是表的大小

基本上,您的权衡是:

  • 将整个表/结果读取到单个resultset中,保存到数据库的往返
  • 或者对数据库进行多次小型访问,每页一次
如果您的应用程序意味着用户通常无法通过第一页或第二页,那么您就不必要地存储了大量数据。o如果您的用户倾向于访问所有页面,并且有很多页面(并且每次页面访问都不会启动新的页面请求/结果集,即您使用的是动态分页或某些半持久性服务器端内存容器),那么将结果集保留在一个位置就可以了,特别是在多个用户之间缓存的情况下

然而,除非您已经将其构建到您的体系结构中,否则您最好使用

...LIMIT 10,10

...LIMIT 20,10

但是,在您的查询中,会遇到多个DB命中,以避免读取的数据超过您需要的数据量,并不必要地存储数据。

如果我理解您的想法,请选择表中的所有记录,然后使用mysql_data_seek()跳过前n*页记录,以便“访问”当前页面并读取n条记录。如果您有很多记录,您可能不想这样做,因为上面说:注意:函数mysql\u data\u seek()只能与mysql\u query()结合使用,而不能与mysql\u unbuffered\u query()结合使用。mysql\u query()和unbuffered version之间的区别是mysql\u query()仅在整个结果集从MySQL服务器复制到PHP进程内存后返回,而在非缓冲版本后,每个MySQL_fetch_xyz()必须从服务器接收下一条记录。如果您有很多记录,并且必须为每个听起来有点不太理想的请求传输所有记录。
我猜您希望这样做,只需一次查询即可获得记录总数和当前子集。使用MySQL,您可以同时拥有一个LIMIT子句和记录总数(在没有LIMIT子句的结果集中),
从foo中选择SQL\u CALC\u FOUND\u ROWS id
按id限制订购20,10


请参见

如果我理解您的想法,请选择表中的所有记录,然后使用mysql_data_seek()跳过第一个n*页记录,以便“进入”当前页并读取n条记录。如果您有很多记录,您可能不想这样做,因为上面说:注意:函数mysql\u data\u seek()只能与mysql\u query()结合使用,而不能与mysql\u unbuffered\u query()结合使用。mysql\u query()和unbuffered version之间的区别是mysql\u query()仅在整个结果集从MySQL服务器复制到PHP进程内存后返回,而在非缓冲版本后,每个MySQL_fetch_xyz()必须从服务器接收下一条记录。如果您有很多记录,并且必须为每个听起来有点不太理想的请求传输所有记录。
我猜您希望这样做,只需一次查询即可获得记录总数和当前子集。使用MySQL,您可以同时拥有一个LIMIT子句和记录总数(在没有LIMIT子句的结果集中),
SELEC