我有一个 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 开始。没有漏洞。
也许我只是想多了。有没有人有他们使用过的任何好的替代品?
谢谢!