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”好吗?的主要内容,如果未能解决你的问题,请参考以下文章