我有一个具有3,000,000条记录的表。我尝试使用以下方法随机提取300,000条记录,但这大约需要7分钟。
SELECT * FROM mytable WHERE `class`='faq' ORDER BY RAND() LIMIT 300000
我想提高随机提取的速度,该怎么办? Mysql版本是5.6。
答案 0 :(得分:0)
最有可能是由于对所有匹配数据进行排序而导致的。您没有指定匹配条件的行数,因此这种排序可能只占3,000,000行的一小部分。
如果您可以处理大约300,000,则可以在WHERE
子句中使用采样逻辑:
SELECT t.*
FROM mytable t CROSS JOIN
(SELECT COUNT(*) as cnt
FROM t
WHERE class = 'faq'
) x
WHERE t.class = 'faq' AND
rand() < (300000 / cnt);
更精确地说,您可以抽取稍大的随机样本,然后使用order by
/ limit
:
SELECT t.*
FROM mytable t CROSS JOIN
(SELECT COUNT(*) as cnt
FROM t
WHERE class = 'faq'
) x
WHERE t.class = 'faq' AND
rand() < (300000 / cnt) * 1.1
ORDER BY rand()
LIMIT 300000;