获取一组随机的数据库条目



我想使用sqlalchemy从我的postgres数据库中随机检索一组X条目。我的第一个方法是这个

random_set_of_Xrows = models.Table.query.filter(something).order_by(func.random()).limit(len(X)).all()

由于我的表格很大,这个命令大约需要 1 秒,我想知道如何优化它。我想order_by函数需要查看所有行,所以我认为使用偏移量可能会使其更快。但是,我不太明白如何完全避免行数? 这是一种使用偏移的方法

rowCount = db.session.query(func.count(models.Table.id)).filter(something).scalar() 
random_set_of_Xrows = models.Table.query.offset(func.floor(func.random()*rowCount)).limit(len(X)).all()

然而,这并不快,大部分时间都花在获取rowCount上。 任何想法如何使其更快? 干杯 卡尔

编辑:如下所述,我在表中添加了一列随机值,并使用它来提取行,例如

random_set_of_Xrows = models.Table.query.filter(something).order_by(models.Table.random_value).limit(len(X)).all()

我确实忽略了偏移部分,因为如果两个调用给我相同的结果对我来说并不重要,我只需要一组随机的行。

我之前通过添加索引列r来优化这一点,该列在创建行时自动插入随机值。然后,当您需要一组随机行时,只需SELECT * FROM table ORDER BY r LIMIT 10 OFFSET some_random_value.您可以运行更新架构的脚本,以将此列添加到现有行中。使用此方法,您将为写入添加轻微的性能影响,但如果这是您持续需要的功能,则应该是一个公平的权衡。

最新更新