【问题标题】:Is it wise to use PHP `mysql_data_seek` and code rather than SQL `LIMIT` to limit results for pagination?使用 PHP `mysql_data_seek` 和代码而不是 SQL `LIMIT` 来限制分页结果是否明智?
【发布时间】:2023-03-09 10:21:01
【问题描述】:

在工作中讨论分页方法并仅获取特定页面所需的数据。在返回的数据集上使用 PHP mysql_data_seek() 并使用代码来限制或使用 SQL LIMIT 来限制分页结果更好吗?

例如,我们有一个用于对结果进行分页的内置函数,但我们必须进行两次查询才能使用它。首先我们查询数据库以了解有多少结果可用,然后我们使用LIMIT 关键字查询数据库以实际获取相关页面的数据。

在显示之前获取整个数据集并使用mysql_data_seek() 遍历它以获取相关页面的数据会更好吗?这样我们就可以针对两种需求进行一次查询,即查看有多少数据可用,然后只获取我们需要的页面。

我猜后者会使用更多内存,并且可能会因更大的数据库而变慢?

【问题讨论】:

    标签: php mysql pagination


    【解决方案1】:

    额外的COUNT 查询或SQL_CALC_FOUND_ROWS 组合比加载整个表更有效。想象一下,如果您有 数十亿行

    1. 它会吃掉带子。
    2. 在大型集上极其缓慢。
    3. 它在 PHP 方面也不是有效的。

    【讨论】:

      【解决方案2】:

      有几个因素会影响查询所需的时间。要考虑的最重要的是,没有特定的顺序:

      1. 往返延迟:这是 由网络延迟(而不是带宽)决定。 每个查询至少需要这么多时间。
      2. 查询执行时间:这是 数据库服务器需要直到它可以开始返回结果
      3. 传输时间:这取决于您的网络带宽 以及结果的大小。

      仅当 MySQL 服务器位于远程主机上时,第 1 点和第 3 点才重要。如果您的结果很小(短行,少于 100 行),COUNT 查询的往返延迟可能比传输所有行花费的时间更长。在这种情况下,简单地获取所有行可能是有利的。另一方面,如果您的结果很大并且网络延迟很低,那么加载所有行会浪费大量时间。

      第 2 点始终很重要。 COUNT 查询可能会花费大量时间和资源,因此在某些情况下,最好只获取所有行,这样服务器只需运行一次查询。尽管您应该记住,计数查询通常比实际查询快得多,因为服务器不必进行排序,可能只使用索引等就可以完成计数。此外,当您进行真正的查询时,服务器可能能够使用计数查询的缓存结果。

      尚未建议的另一种可能性是您执行查询,但只选择您感兴趣的行的主键。如果查询非常慢,这尤其有用。然后,您可以缓存此结果(例如,使用 APC),然后在 PHP 中分页并选择相应主键的完整行。

      【讨论】:

        【解决方案3】:

        如果您只打算使用行,则可以使用 LIMIT 方法。正如@Wesley 所说,您将使用更少的带宽,并且查询也会更快地执行。

        【讨论】:

          【解决方案4】:

          如果你想吃十个冰淇淋,你是要 100 个,让 90 个坐在柜台上融化,只吃 10 个吗?我不认为你会。这个问题几乎是一回事:询问数据库有多少行并只选择您真正感兴趣的行会更有效,因为数据库在限制行方面更有效,而且数据不会必须发送给客户端,并且不涉及进一步的处理。

          一如既往地提出“哪个更快”的问题:做一个基准测试,然后找出答案。我的钱在数据库里。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-04-17
            • 2017-05-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-03-11
            • 2019-09-24
            相关资源
            最近更新 更多