【问题标题】:is php sort better than mysql "order by"?php排序比mysql“order by”好吗?
【发布时间】:2011-04-06 21:21:23
【问题描述】:

我想知道,在性能方面并考虑在具有非常非常多 (> 1.000.000) 记录的表上选择 mysql 是否更好地使用 sql "order by" 对结果进行排序,或者在查询后使用经典编程排序算法...有人有什么建议吗?

坦克

【问题讨论】:

    标签: mysql performance sorting


    【解决方案1】:

    mySQL,放下手来。它为此进行了优化,并且可以利用索引。这在 PHP 中会很糟糕(而且你会很快到达memory_limit)。

    【讨论】:

      【解决方案2】:

      您正在将一个系统与在优化的 C 中实现的方法进行比较,旨在完成此任务,另一个您将在解释脚本语言中实现。

      基本上,用 C 编写的任何东西都将比用 PHP 编写的等效函数快 10 到 100 倍。

      如前所述,毫无疑问,正确配置数据库并让其完成工作效率要高得多。

      【讨论】:

        【解决方案3】:

        MySQL 会赢。除了列出的其他原因之外,还有一个原因是,假设记录已经在数据库中,您不必将它们复制出数据库来对它们进行排序。并且对它们进行分页或子索引将很容易并自动优化。

        简而言之,如果 DB 可以做到,那么 DB 应该做到,几乎总是这样。

        【讨论】:

        • +1 - 传输数据进行排序将比在数据库上进行更昂贵。
        【解决方案4】:

        假设您实际上在应用程序的内存中获取了记录,那么 mysql 仍然会击败您的应用程序,因为如果您正确配置数据库,它就不必排序。

        如果你想在一个包含 1 个 Mio 记录的表中排序,你可以提供 in 索引,该索引通常被实现为一个 B-Tree,Mysql 可以在其中遍历并获得排序的结果。

        【讨论】:

          【解决方案5】:

          有时,如果您可以避免“使用临时;使用文件排序”,这是值得的,尽管我没有进行广泛的测试。

          1   SIMPLE  favorites   ref source_id,user2_id  source_id   3   const   137 Using index; Using temporary; Using filesort
          1   SIMPLE  users   eq_ref  PRIMARY,updated PRIMARY 3   apm.favorites.target_id 1   Using where
          

          我不是要求 mysql 按名称排序,而是在 ruby​​ 中这样做

          results.sort_by {|u| u.name.downcase}
          

          生成的 mysql 查询现在更简单了:

          1   SIMPLE  favorites   ref source_id,user2_id  source_id   3   const   137 Using index
          1   SIMPLE  users   eq_ref  PRIMARY,updated PRIMARY 3   apm.favorites.target_id 1   Using where
          

          如果您返回的行数超过几百行,您当然不想这样做。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2022-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-11-16
            • 2011-03-09
            • 1970-01-01
            相关资源
            最近更新 更多