首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >随机大数据集

随机大数据集
EN

Stack Overflow用户
提问于 2010-08-24 16:27:46
回答 3查看 1.4K关注 0票数 2

我正在设法从一个大数据集中获得一个随机选择。

我们预计该集将增长到500 K的记录,因此,重要的是要找到一种方法,以保持良好的表现,而这套集增长。

我尝试了一种来自:http://forums.mysql.com/read.php?24,163940,262235#msg-262235的技术,但它并不完全是随机的,而且它不能很好地使用LIMIT子句,您并不总是能得到所需的记录数量。

所以我想,因为PK是auto_increment,所以我只生成一个随机id列表,并使用IN子句来选择我想要的行。这种方法的问题是,有时我需要一组随机的数据,记录具有特定的状态,这种状态最多占总集的5%。要做到这一点,我首先需要了解具有特定状态的ID的I可以使用什么,所以这也是行不通的。

我正在使用MySQL5.1.46,MyISAM存储引擎。

重要的是要知道,选择随机行的查询将经常运行,并且它要从中选择的表将频繁地附加到表中。

任何帮助都将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-24 16:58:01

您可以通过一些非正规化来解决这个问题:

  • 生成一个包含与数据表相同的键和状态的辅助表。
  • 添加并填充状态组列,它将是您自己自动编号的一种子键(基于1的相对于单个状态的自动增量)

Pkey状态StatusPkey 1,A,1,2,3,B,1,4,B,2,5,C1.C ..。n(其中m=C状态的#)

当您不需要过滤时,您可以像上面提到的那样在pkey上生成rand #s。当您确实需要进行筛选时,然后根据您感兴趣的特定状态的StatusPkeys生成rands。

有几种方法可以构建此表。您可以有一个在间隔内运行的过程,也可以实时运行。不过,后者的性能会受到影响,因为计算StatusPkey的成本可能会很高。

票数 2
EN

Stack Overflow用户

发布于 2010-08-24 16:56:25

请看扬·内斯基( Jan Kneschke)的这篇文章。它在解释这个问题的不同方法的利弊方面做得很好.

票数 1
EN

Stack Overflow用户

发布于 2010-08-24 16:56:27

您可以高效地完成这个任务,但是您必须在两个查询中完成。

首先,通过与5%条件匹配的行数进行缩放,得到一个随机偏移量:

代码语言:javascript
运行
复制
SELECT ROUND(RAND() * (SELECT COUNT(*) FROM MyTable WHERE ...conditions...))

这将返回一个整数。接下来,在LIMIT表达式中使用整数作为偏移量:

代码语言:javascript
运行
复制
SELECT * FROM MyTable WHERE ...conditions... LIMIT 1 OFFSET ?

不是每个问题都必须在单个SQL查询中解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3558665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档