擅长:python、mysql、java
<p>按('?')顺序排列的解[:N]如果使用MySQL(不知道其他数据库),即使对于中等大小的表也是非常慢的。</p>
<p><code>order_by('?')[:N]</code>将转换为<code>SELECT ... FROM ... WHERE ... ORDER BY RAND() LIMIT N</code>查询。</p>
<p>这意味着对于表中的每一行,将执行RAND()函数,然后根据该函数的值对整个表进行排序,然后首先返回N条记录。如果你的桌子很小,就可以了。但在大多数情况下,这是一个非常缓慢的查询。</p>
<p>我编写了一个简单的函数,即使id有漏洞也能工作(删除了一些行):</p>
<pre><code>def get_random_item(model, max_id=None):
if max_id is None:
max_id = model.objects.aggregate(Max('id')).values()[0]
min_id = math.ceil(max_id*random.random())
return model.objects.filter(id__gte=min_id)[0]
</code></pre>
<p>它比按('?')订购快几乎在所有情况下。</p>