MySQL:从表中快速选择N个随机行,其中一对列(不是一列)是唯一的

MySQL:从表中快速选择N个随机行,其中一对列(不是一列)是唯一的,mysql,performance,select,random,sql-order-by,Mysql,Performance,Select,Random,Sql Order By,有一个表包含以下列: 身份证,个人身份证,宠物身份证,描述 关于此表,有一些陈述: id是主键,自动递增 每对人名、宠物名都是唯一的 id、人员id、宠物id为整数且不为空 洞是可能的max pet_id并没有告诉我们有这样的person_id的最大列数 表中很可能有更多不同的个人id,即每个人的宠物id的平均数量。 问题是:如何快速选择当前人员id的随机N宠物id 表格示例: 1. 1 1 cat 2. 1 2 dog 3. 2 40 horse 4.

有一个表包含以下列:

身份证,个人身份证,宠物身份证,描述

关于此表,有一些陈述:

id是主键,自动递增 每对人名、宠物名都是唯一的 id、人员id、宠物id为整数且不为空 洞是可能的max pet_id并没有告诉我们有这样的person_id的最大列数 表中很可能有更多不同的个人id,即每个人的宠物id的平均数量。 问题是:如何快速选择当前人员id的随机N宠物id

表格示例:

1.  1   1     cat
2.  1   2     dog
3.  2   40    horse
4.  2   35    dog
5.  3   46    duck
6.  2   39    duck
7.  1   3     duck
..................
100000  403  12  monkey
示例:我想为第二个人随机选择两行。可能的随机选择之一是第3行。第六排。 选择应该是真正随机的,应该以同样的概率出现

如何使用mysql查询选择来实现这一点

当然,我读过关于从表中随机选择几行的书,这是一些棘手的解决方案的基本问题。但是,在我的例子中,有两行,而不是一行

我在想一个比这更快的方法

select id from tablename where person_id = 2 order by random()  limit 2;

试试这个,我们减少了在数据库中执行随机函数的时间

 $max_sql = "SELECT max(id) AS max_id  FROM " . $table;
  $max_row = mysql_fetch_array(mysql_query($max_sql));
  $random_number = mt_rand(1, $max_row['max_id']);

  $random_sql = "SELECT * FROM " . $table . "
                 WHERE " . $column . " >= " . $random_number . " 
                 ORDER BY " . $column . " ASC
                 LIMIT 1"; 

你的斯特劳曼问题是你能做的最好的。如果你没有一个人养很多宠物,并且你有一个关于这个人的id的索引,它应该运行得很快。如果你真的有这样一个人,那你就不走运了。忘记随机选择,甚至确定一个人有多少宠物需要时间


另一个可能不适用于您的想法是:如果您不关心选择的独立性,即每次都可能得到相同的随机响应,那么您可以添加一个列,在插入行时使用随机数填充该列。在person\u id、random\u列上添加一个索引,并选择该对排序的前N行。稍微好一点的方法是添加多个随机列,然后选择一个随机排序。不幸的是,这不能很好地扩展,我认为您不会对结果感到满意。

谢谢。不幸的是,据我所见,这样随机行就不会得到相等的分布。让我们看看,如果第二个人的pet_id 1,2,3100010001存在间隙,那么配对的person_id,pet_id==2,1000将比2,2更频繁地被选择997次。此外,您还必须将其迭代n次,并检查$random number in,而不是在所选随机数数组中,这将进一步打破查询的平均分布。谢谢。思考、尝试甚至尝试扩展的好主意。我读了两遍。我说得对吗这个表修改得越少,比如说,一周一次,由管理员修改,而不是由用户修改,他们只是使用它,更有意义的是添加列random\u column1,…,random\u column20,并创建20个索引person\u id,random\u column1,…,person\u id,random\u column20?因此,对于人类来说,这种行为看起来确实是随机的,如果用户不每秒更改表,那么性能应该是良好的。我说得对吗?