Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL random,间距超过4000万行_Mysql_Random_Solr - Fatal编程技术网

MySQL random,间距超过4000万行

MySQL random,间距超过4000万行,mysql,random,solr,Mysql,Random,Solr,因为我觉得这个问题被问得太多了,但仍然没有一个明确的答案,所以我一直没有问: 对象表:40M+行填充UPC、EIN、ISBN作为obj_id主键。缺口 *Obj_Cat*表格:将对象链接到类别。| obj|u id | cat|u id的列| 问题:返回5个非顺序随机对象id的最佳方法是什么?有没有比我列出的更好的方法 解决方案1:从对象左侧选择objects.obj_id连接对象上的obj_cat.obj_id=obj_cat.obj_id,其中obj_cat.cat_id=cat_id按兰德

因为我觉得这个问题被问得太多了,但仍然没有一个明确的答案,所以我一直没有问:

对象表:40M+行填充UPC、EIN、ISBN作为obj_id主键。缺口

*Obj_Cat*表格:将对象链接到类别。| obj|u id | cat|u id的列|

问题:返回5个非顺序随机对象id的最佳方法是什么?有没有比我列出的更好的方法

解决方案1:从对象左侧选择objects.obj_id连接对象上的obj_cat.obj_id=obj_cat.obj_id,其中obj_cat.cat_id=cat_id按兰德限制1排序;运行5次

非常慢,有大桌子。 解决方案2:从对象中选择对象id,其中对象id>=选择楼层最大对象id*RAND FROM objects LIMIT 1;运行5次不包括obj_cat join,以使其更易于理解

如果您的行没有间隙或间隙可以忽略,则是最佳解决方案。非常快

不能很好地处理类别,因为在编号方面不可避免地会有差距

解决方案3:选择FLOORRAND*COUNTobjects.*ASoffsetFROM objects,obj_cat WHERE objects.obj_id=obj_cat.obj_id和obj_cat.cat_id=cat_id;从对象限制$offset中选择对象id,1运行5次

非常灵活。比解决方案1快得多。与间隙一起工作。但在超过4000万行的情况下,单个“限额$offset,1”仍然需要1分钟。 我使用了解决方案3,但速度很慢。我当前的解决方案是move use Solr randomsortfield,因为在fq中指定我的类别很容易

解决方案:?q=*&fl=obj\U id&fq=cat:cat\U id&sort=random\U*desc&rows=5

非常快,每个类别大约需要45秒,但在运行中返回5个非连续结果。
人们在处理大型数据集时发现了更好的方法吗?我知道这似乎是一个重复的问题,但我想我会用一张40米以上的桌子来分享我的经验。

有这么大的数据集,你不能像这样进行动态计算。您需要利用时间-内存折衷。在obj_cat表中创建一个新的无符号整数索引列,其宽度大于最大行数,并用随机数填充每一行。这样,您只需生成一个随机数,并直接选择最接近的匹配项五次。这将比尝试使用ORDER BY RAND快几个数量级。

我理解这一概念,但如果我想在特定类别中选择随机值,这将不起作用,除非我为每个类别都有一个带有随机int的表。对于超过2000个类别,我不喜欢超过2000个表的想法。加上一个给定的对象可以有多个类别。@AnthonyLin-你能在随机整数表中保留类别id吗?