在工作中关注有关分页方法的对话,只获取特定页面所需的数据。在返回的数据集上使用PHP,并使用代码来限制或使用mysql_data_seek() LIMIT来限制分页结果,哪个更好?
例如,我们有一个用于对结果进行分页的内置函数,但我们必须进行两次查询才能使用它。首先,我们查询DB以了解有多少结果可用,然后使用LIMIT关键字查询db以实际获取相关页面的数据。
获取整个数据集并使用mysql_data_seek()遍历它,以便在显示之前获得相关页面的数据,这会不会更好?这样,我们就可以对两种需求执行一次查询,即查看有多少数据可用,然后只得到我们需要的页面。
我猜后者会使用更多的内存,也许更大的数据库会更慢?
发布于 2011-06-08 20:08:58
附加的COUNT查询或SQL_CALC_FOUND_ROWS组合比加载整个表更有效。想象一下,如果你有数十亿行的!
在较大的集合上,它会吃得很慢。
发布于 2011-06-08 20:41:29
有几个因素会影响查询所需的时间。要考虑的最重要的是,没有具体的顺序:
仅当MySQL服务器位于远程主机上时,第1点和第3点才重要。如果您的结果很小(短行,少于100行),则COUNT查询的往返延迟可能比传输所有行花费更多的时间。在这种情况下,简单地获取所有行可能更有优势。另一方面,如果您的结果很大,并且网络延迟很低,那么加载所有行将浪费大量时间。
第二点总是很重要的。COUNT查询可能会占用大量的时间和资源,因此,在某些情况下,只提取所有行可能更好,这样服务器只需运行一次查询。尽管您应该记住,计数查询通常比实际查询快得多,因为服务器不需要进行排序,可能只使用索引就可以完成计数,等等。此外,当您执行实际查询时,服务器可能能够使用计数查询的缓存结果。
另一种尚未被建议的可能性是,您执行查询,但只选择您感兴趣的行的主键。如果查询速度非常慢,这一点尤其有用。然后你可以缓存这个结果(例如,使用APC),然后在PHP中分页并为相应的主键选择整行。
发布于 2011-06-08 20:12:59
如果您只打算使用行,那么LIMIT就是这里的方法。正如@Wesley指出的那样,你将使用更少的带宽,查询也将更快地执行。
https://stackoverflow.com/questions/6278413
复制相似问题