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

时间:2010-09-01 15:29:22

标签: mysql performance sorting

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

5 个答案:

答案 0 :(得分:22)

mySQL,请放下手。它已经过优化,可以使用索引。这在PHP中会很糟糕(你会很快到达memory_limit)。

答案 1 :(得分:18)

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

基本上,用C语言编写的任何内容都要比用PHP编写的等效函数快10到100倍。

正如已经指出的那样,毫无疑问,正确配置数据库并让它完成工作会更有效率。

答案 2 :(得分:12)

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

简而言之,如果DB能够做到这一点,那么DB应该几乎总是这样做。

答案 3 :(得分:10)

在假设的情况下,你实际上在你的应用程序的内存中获取记录,那么mysql仍将击败你的应用程序的裤子,因为如果你正确配置你的数据库,它将无法排序。

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

答案 4 :(得分:4)

有时如果你可以避免“使用临时;使用filesort”这是值得的,尽管我还没有做过大量的测试。

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

当然,如果你返回的行超过几百行,你就不会想要这样做。