mysql_data_seek的性能影响

时间:2009-07-02 09:21:02

标签: php performance

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

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

4 个答案:

答案 0 :(得分:2)

如果我理解你的想法,你选择表中的所有记录,然后跳过带有mysql_data_seek()的前n *页记录,以便“到达”当前页面并读取n条记录。如果您有很多记录,可能不希望这样做,因为http://php.net/mysql_data_seek说:

注意:函数mysql_data_seek()只能与mysql_query()结合使用,而不能与mysql_unbuffered_query结合使用()
mysql_query()和无缓冲版本之间的区别在于mysql_query()仅在将整个结果集从MySQL服务器复制到PHP进程的内存之后返回,而在无缓冲版本之后每个mysql_fetch_xyz()必须从服务器接收下一条记录。如果你有很多记录,你必须为每个请求传输所有,这听起来有点不理想。
我想你想这样做只用一个查询来获得当前子集的记录总数。使用MySQL,您可以同时拥有LIMIT子句和记录总数(在没有LIMIT子句的结果集中)
SELECT SQL_CALC_FOUND_ROWS id FROM foo
ORDER BY id LIMIT 20,10

请参阅http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_found-rows

答案 1 :(得分:1)

我想在你的LIMIT语句中使用适当的SELECT子句会更有效(它肯定会节省至少查找时间),但我不知道如何{{1}的内部结构工作,特别是如果它读取mysql_data_seek记录并丢弃它们,或者它是否像文件系统x命令一样工作(向MySQL发送信号告诉它跳过发送下一个seek记录)。

如果它以第一种方式工作,我希望以这种方式进行最小的加速。如果是后来的方式,我会期望加速,但不如使用适当的x子句那么多。

答案 2 :(得分:1)

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

基本上,您的权衡是:

  • 将整个表/结果读入单个结果集,从而节省了到数据库的往返次数
  • 或对数据库进行多次访问,每页一次

如果您的应用程序意味着用户通常不会超过第一页或第二页,那么您将不必要地存储大量数据。 OTOH如果您的用户倾向于访问所有页面,并且有很多(并且每个页面访问都不会启动新页面请求/结果集,即您使用动态分页或某些半持久性服务器端内存容器),然后将结果集保存在一个地方就好了,特别是如果它在多个用户之间缓存。

但是,除非您已将其构建到您的架构中,否则最好使用

之类的东西
...LIMIT 10,10

...LIMIT 20,10

等。但是在您的查询中,并且遭受了多次数据库命中,以避免必须读取比您需要的数据更多的数据,并且不必要地存储它。

答案 3 :(得分:1)

如果查询执行成本很高,我会使用mysql_seek_data()。

通常分页需要两次查询执行  参考:[MySQL pagination without double-querying?]

a)执行查询以查找返回的记录总数

b)使用limit子句执行查询以仅获取所需结果
    对于第二种情况,请检查问题:

如果查询执行成本非常高,我将不会进行第二次执行,并选择mysql_seek_data()函数,因为我已成功使用它