2011-08-23 21 views
2

我的表看起来像这样如何查询随机记录在一个MySQL表,而在优先系统保

ID | Priority 
--------------- 
#1 | 25 
#2 | 50 
#3 | 125 
#4 | 300 
#5 | 500 

每1000个查询我想(平均)获取ID#1 25倍,#2 50次,#3 125次等。

我的表格会有1000个,最终有100,000+个记录,这样可以缩放吗?

这个查询会经常运行,所以它需要在一个大表中运行得非常快。

我绝对愿意重新考虑表结构,如果有更有效的方法 - 任何建议?

+0

可能重复的[MySQL:选择随机输入,但重量对某些条目](http://stackoverflow.com/questions/2417621/mysql-select-random-entry -but-weight-toward-certain-entries) – cdhowie

+0

只是想检查一下,#1000的相对权重是多少?如何计算权重? (也就是说,如果我插入第6行,我怎么会知道如何设置它的权重?)P.S.,如果这是您在别处处理的事情,那也没关系。 –

+0

权重将在别处计算。 – Raymond

回答

2

我想你会很难找到一个能够在非常大的数据集上很好地扩展的查询。

有有效两条路,你可以去:

  1. 使用加权表像你这样,然后乘以该加权通过对每行一个随机数。
  2. 让您的表中每个ID的记录计数反映您的权重。例如#2的可能性是#1的两倍,所以#1有1条记录,#2有两条记录。如果#3的可能性是#2的四倍,那么它将有八个记录等。这种方法有一个主要的主要缺点 - 如果#4与#1的可能性相差一半,那么唯一的解决方法是将数字加倍每个其他类型的记录,然后为#4插入一条记录。非常,非常混乱,以跟踪。

考虑到这一点,这里的使用方法1解决方案:

SELECT ID 
FROM tablename 
ORDER BY (RAND() * Priority) DESC 
LIMIT 1; 

(我不是100%肯定的语法,因为我是一个SQL Server/Oracle的头,而不是到MySQL,但我认为这是正确的。)