我有一个MySQL表,目前存储了大约330,000条记录。我需要编写一个快速有效的查询来拉出15个随机记录,但是使用基于标志的where子句。
例如,我尝试了几个选项(我可能会添加效率很低):
SELECT col1,col2,col3 FROM tbl WHERE标志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开始。没有漏洞。
也许我只是过度思考这个问题。有没有人有他们用过的好选择?
谢谢!
答案 0 :(得分:0)
在调用查询之前在内存中生成15个整数ID ...您已添加了一个很好的IN
子句。当然,你必须先获得最大ID。