php排序比mysql“order by”好吗?

Posted

技术标签:

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

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

坦克

【问题讨论】:

【参考方案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

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

【讨论】:

以上是关于php排序比mysql“order by”好吗?的主要内容,如果未能解决你的问题,请参考以下文章

order by 升序排序是null字段如何排在最后?

MySQL中order by中关于NULL值的排序问题

PHP MySQL Order By

Mysql多字段order by用法

PHP MySQL Order By 关键词

mysql ORDER BY,GROUP BY 和DISTINCT原理