Python/Django:从大型表中获取随机文章

Python/Django:从大型表中获取随机文章,python,mysql,django,Python,Mysql,Django,我的数据库(MySQL)中有一个巨大的表,包含数百万数据。我需要填充10个随机数据并在UI上显示。考虑性能的好方法是什么 我正在考虑创建MySQL视图来填充10个随机行,并从UI读取它。或者有其他有效的方法来处理这种情况吗?首先(我的正确意见是),我反对在我们已经使用像Django这样的高级框架时使用原始SQL,除非我们在框架(Django)中找不到我们想要的东西,所以我宁愿使用Django来解决这个问题: 备注:这种方法只有在您将自动递增设置为PK时才有效,当然,如果您的数据是一致的(您不会从

我的数据库(MySQL)中有一个巨大的表,包含数百万数据。我需要填充10个随机数据并在UI上显示。考虑性能的好方法是什么

我正在考虑创建MySQL视图来填充10个随机行,并从UI读取它。或者有其他有效的方法来处理这种情况吗?

首先(我的正确意见是),我反对在我们已经使用像Django这样的高级框架时使用原始SQL,除非我们在框架(Django)中找不到我们想要的东西,所以我宁愿使用Django来解决这个问题:

备注:这种方法只有在您将自动递增设置为PK时才有效,当然,如果您的数据是一致的(您不会从表中删除记录,以便确保所有ID都是自动递增的)

如果之前的条件不满足,我认为您可以使用以下原始SQL查询:

query = """SELECT * FROM table
ORDER BY RAND()
LIMIT 10""")

table.objects.raw(query)

关于性能,我想你必须考虑一下,希望这会有所帮助

这可能既昂贵又缓慢,但:

MyModel.objects.order_by('?')[:10]

它的主要优点是清晰,而且不是原始SQL。

我也想到了这种方法。但是,不能保证1和count_记录之间的所有ID都存在(有些可能已被删除)。所以,要想让它发挥作用,你需要尝试一下:除了DoesNotExist,直到你有10个,这稍微复杂一些,而且可能会很昂贵。@tz:同意为什么我在使用第一种方法之前,先提出应该满足的条件,我认为try-except也不会在那里起作用,因为如果条件不满足,并且知道random.sample是从1到count的rand,并且假设最后一条记录的id==count,那么如果一些数据被删除,那么count!=最后一个id,因此random.sample不会给我们提供正确的数据,它会忘记一些记录似乎ORDER BY RAND()不是一个好主意,因为它为每一行计算一个随机数:另外,请注意10可能不小于table.count(),在这种情况下random.sample将不起作用。@Patrick:很好,我编辑了我的答案以反映这种情况
MyModel.objects.order_by('?')[:10]