我有这张桌子:
person_id int(10) pk
fid bigint(20) unique
points int(6) index
birthday date index
4 FK columns int(6)
ENGINE = MyISAM
重要信息:该表包含超过 800 万行并且正在快速增长(目前每天 150 万)
我想要什么:当我在点上订购表格时,在一定范围内选择 4 个随机行
我现在怎么做:在 PHP 中,我随机化了一个特定的范围,假设这给了我 20% 的低范围和 30% 的高范围。接下来我计算(*)表中的行数。在我确定最低行数后:表数/100 * 低范围。高范围也一样。在我使用 rand(lowest_row,highest_row) 计算随机行之后,这给了我一个范围内的行号。最后我通过执行以下操作选择随机行:
SELECT * FROM `persons` WHERE points > 0 ORDER BY points desc LIMIT $random_offset, 1;
点 > 0 在查询中,因为我只想要至少 1 点的随机数。
上面的查询大约需要 1.5 秒才能运行,但由于我需要 4 行,所以需要 6 秒以上,这对我来说太慢了。我认为按点排序最耗时,所以我正在考虑制作表格的视图,但我真的没有视图的经验,所以你怎么看?视图是一个好的选择还是有更好的解决方案?
添加:
我忘了说重要的是所有行都有相同的被选中的机会。
谢谢,我感谢所有的帮助!:)
凯文