MySQL提高抽样查询速度

时间:2019-07-30 06:21:34

标签: mysql sql

我有一个具有3,000,000条记录的表。我尝试使用以下方法随机提取300,000条记录,但这大约需要7分钟。

SELECT * FROM mytable WHERE `class`='faq' ORDER BY RAND() LIMIT 300000

我想提高随机提取的速度,该怎么办? Mysql版本是5.6。

1 个答案:

答案 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;