我正在设计一个高性能可伸缩数据库的后端,它需要非常快地在特定类别中选择随机行。为了给出这方面的一般情况,有一个巨大的表,每个行都有一个“类别”字段,然后其中可能有1000万行,有多达500个不同的类别。
我的第一个想法是在选择这些表时提高性能,创建一个单独的查找表,仅按类别进行索引,这样伪代码将类似于:
在lookup_table
这将使用索引生成一个匹配行的行数,然后选择一个随机行并取出它。结果是,在每个类别大约20,000行之后,这需要0.02秒以上的时间来选择行,这对于许多类似的操作来说并不理想。
我的第二个想法和我现在可能使用的是一个单独的数据库或一组查找表,因为一旦我们进行缩放,数据库就已经成熟了,每个类别都有一个表。然后,随机查找将接近瞬时,因为它们可以在表计数中以随机数的形式对主键执行。
我非常感谢这里有类似经历的巫师在这方面有什么想法可以分享,或者如果我缺少了一个有用的功能。我研究了将表划分为500多个类别,但似乎对此场景没有多大用处。
谢谢!
编辑的另一个主要影响设计的因素是,每个项目可能有多个类别,并且需要被任意一个项目随机选择。
发布于 2012-05-10 10:52:43
不要使用限制,而是将一个新的列rnd添加到具有float类型的查找表中。在(类别,rnd)上创建一个索引,并使用UPDATE table SET rnd = RAND()初始化它。然后使用:
SET $rndValue = RAND();
SELECT id FROM lookup_table WHERE category = 'example' AND rnd < @rndValue ORDER BY `rnd` DESC LIMIT 1;有效地找到随机行。您可能希望将其放入循环中,因为如果@rndValue最后为0,它将找不到任何行(或者如果该类别中没有对象)。
https://stackoverflow.com/questions/10531265
复制相似问题