擅长:python、mysql、java
<p><code>Record.objects.count()</code>被转换成非常简单的SQL查询。在</p>
<pre><code>SELECT COUNT(*) FROM TABLE
</code></pre>
<p><code>Record.objects.all()[0]</code>也被转换成一个非常简单的SQL查询。在</p>
^{pr2}$
<p><code>Record.objects.all()</code>通常将结果切分以提高性能</p>
<pre><code>SELECT * FROM table LIMIT 20; // or something similar
</code></pre>
<p><code>list(Record.objects.all())</code>将查询所有数据并将其放入列表数据结构中。在</p>
<pre><code>SELECT * FROM TABLE
</code></pre>
<p>因此,每当您将查询集转换为列表时,就会发生代价高昂的情况</p>
<p>在您的示例中,<code>random.sample()</code>将转换为一个列表。(如果我没有错的话)。在</p>
<p>因此,当您执行<code>result = random.sample(Record.objects.all(),n)</code>操作时,它将执行完整的查询集并转换为一个列表,然后随机选择该列表。在</p>
<p>想象一下,如果你有数百万的记录。您要查询并将其存储到一个包含数百万元素的列表中吗?或者您更愿意一个一个地查询</em></p>