我已经开始使用mysql_data_seek()作为一种简单的方法,通过移动指针并读取当前的'页面',将分页透明地滚动到我的数据库类中。mysql_data_seek的性能影响
这样做的性能影响是什么?我只是将需要的数据读入PHP本身,但在大多数情况下,SELECT覆盖整个表格 - 这是不好的,我会遇到大量表格的问题吗?
我已经开始使用mysql_data_seek()作为一种简单的方法,通过移动指针并读取当前的'页面',将分页透明地滚动到我的数据库类中。mysql_data_seek的性能影响
这样做的性能影响是什么?我只是将需要的数据读入PHP本身,但在大多数情况下,SELECT覆盖整个表格 - 这是不好的,我会遇到大量表格的问题吗?
如果我理解你的想法,在表中选择全部记录,然后用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()的非缓冲版本之后必须从服务器接收下一个记录。如果你有很多记录,你必须转让 所有其中 每个单一请求听起来有点不理想。
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
我想,在你的SELECT
语句中使用适当的LIMIT
条款更有效(这肯定会节省查找时间ATLEAST),但我不知道怎么怎么mysql_data_seek
作品的内部,特别是如果它读取x
记录和丢弃它们,或者它是否像文件系统seek
那样工作(向MySQL发送一个信号,告诉它跳过发送下一个x
记录)。
如果它以第一种方式工作,我希望以这种方式进行最小化加速。如果是后面的方法,我希望有一个加速,但不像简单地使用适当的LIMIT
子句那样多。
唯一要担心的是表格大小。
基本上,你的代价是间:
如果您的应用程序意味着用户通常不会经过第一个或第二个页面,那么您将不必要地存储大量的数据。 OTOH如果你的用户倾向于访问所有的页面,并且有很多(每个页面访问不会启动一个新的页面请求/结果集,即你正在使用动态分页或一些半持久的服务器端内存容器),那么将结果集保存在一个地方是很好的,特别是如果它在多个用户之间缓存的话。
但是,除非你已经建立了到您的架构,你可能在查询中最好使用像
...LIMIT 10,10
...LIMIT 20,10
等虽然和痛苦的多个数据库命中,以避免阅读更多数据比你需要的更多,并且不必要地存储它。
我会用mysql_seek_data去()如果查询执行的成本很高。
通常分页需要两个查询执行 参考:[MySQL pagination without double-querying?]
一个)执行查询,以找到总没有记录返回
b)中执行与限制子句查询以获取只有期望的结果
对于第二种情况,请检查问题:
如果查询执行成本非常高,我不会去执行第二次执行,并选择mysql_seek_data()函数,因为我已经成功地使用它