2009-07-02 139 views
1

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

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

回答

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

我想,在你的SELECT语句中使用适当的LIMIT条款更有效(这肯定会节省查找时间ATLEAST),但我不知道怎么怎么mysql_data_seek作品的内部,特别是如果它读取x记录和丢弃它们,或者它是否像文件系统seek那样工作(向MySQL发送一个信号,告诉它跳过发送下一个x记录)。

如果它以第一种方式工作,我希望以这种方式进行最小化加速。如果是后面的方法,我希望有一个加速,但不像简单地使用适当的LIMIT子句那样多。

1

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

基本上,你的代价是间:

  • 读取整个表/结果到一个单一的结果集,节省往返到数据库
  • 或进行多个一口大小的访问数据库,一个每页

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

但是,除非你已经建立了到您的架构,你可能在查询中最好使用像

...LIMIT 10,10 

...LIMIT 20,10 

等虽然和痛苦的多个数据库命中,以避免阅读更多数据比你需要的更多,并且不必要地存储它。

1

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

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

一个)执行查询,以找到总没有记录返回

b)中执行与限制子句查询以获取只有期望的结果
对于第二种情况,请检查问题:

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