擅长:python、mysql、java
<p><code>.order_by(?)</code>的问题在于,它实际上是<code>ORDER BY RAND()</code>(或等效的,取决于DB),这基本上必须为每一行创建一个随机数并进行排序。这是一项繁重的工作,需要很多时间。在</p>
<p>另一方面,做<code>Record.objects.all()</code>会迫使你的应用程序下载<strong>所有</strong>对象,然后从中进行选择。它在数据库方面没有那么重(它将比排序更快),但它在网络和内存上很重。因此,它也会扼杀你的表演。在</p>
<p>所以这就是交易。在</p>
<p>现在情况好多了:</p>
<pre><code>sample = random.sample(xrange(Record.objects.count()),n)
result = [Record.objects.all()[i] for i in sample]
</code></pre>
<p>因为它避免了上面提到的所有问题(注意,<code>Record.objects.all()[i]</code>被转换成{<cd5>},这取决于DB)。在</p>
<p>但是,由于<code>.count</code>可能很慢(与通常一样:依赖于DB),所以它可能仍然是低效的。在</p>