0

我有一个 MySQL 表,目前存储了大约 330,000 条记录。我需要编写一个快速有效的查询来提取 15 条随机记录,但使用基于标志的 where 子句。

例如,我尝试过的几个选项(我可能会添加效率低下):

SELECT col1, col2, col3 FROM tbl WHERE flag IN ('opt1', 'opt2', 'opt3') ORDER BY RAND() LIMIT 15;

这个查询大约需要 3 秒,太慢了。我正在使用的另一个选项是获取返回的所需行数(在本例中为 15)并除以请求标志的总行数(等于 $x),然后运行此查询:

SELECT col1, col2, col3 FROM tbl WHERE RAND()<= '$x' AND flag IN ('opt1', 'opt2', 'opt3');

这通常返回 14-16 行,所以这没什么大不了的。我不需要它准确地返回 15,但关闭。此选项将查询时间缩短了一秒,但对于生产用途来说仍然太长了。

我应该注意所有记录都有一个分配的 ID #,从 1 开始。没有漏洞。

也许我只是想多了。有没有人有他们使用过的任何好的替代品?

谢谢!

4

1 回答 1

0

在调用查询之前在内存中生成 15 个整数 ID……您已向其中添加了一个不错的IN子句。当然,您必须首先获得最大 ID。

于 2012-06-12T20:16:01.117 回答