我想知道,就性能而言,考虑在具有非常非常多(> 1.000.000)记录的表上选择mysql时,是否更好地使用sql“order by”排序结果或在查询后对结果进行排序经典的编程排序算法......有人有什么建议吗?
罐
答案 0 :(得分:22)
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
当然,如果你返回的行超过几百行,你就不会想要这样做。