2013-04-26 80 views
1

我有320万行用几个键来帮助加快排序。然而,随着桌子的增长,每天事物变得越来越慢。你们可以看看我的查询,并告诉我有没有其他解决方案可以让这个过程更快更好?从3百万行中选择Random

SELECT * FROM (SELECT `numbers` FROM `avotf`.`master` WHERE `active`=1 order by `monthly_mins`,`called`,`added`,rand() limit 200) AS T1 ORDER BY RAND() LIMIT 1 
+0

'ORDER BY rand()',这就是问题 – Ejaz 2013-04-26 14:25:07

+0

可能重复[MySQL从600K行中快速选择10个随机行](http://stackoverflow.com/q/4329396/1409082)和[获得随机结果大表](http://stackoverflow.com/q/12356733/1409082) – Jocelyn 2013-04-27 12:58:03

回答

3

假设你的表有一个数字id列,这样的事情应该工作(从here借用):

SELECT * FROM `table` 
WHERE id >= (SELECT FLOOR(MAX(id) * RAND()) FROM `table`) ORDER BY id LIMIT 1; 

做到这一点:

SELECT * FROM `table` ORDER BY RAND() LIMIT 1; 

它但它会非常缓慢

0

问题是因为您使用RAND(),有很多数据

的您应该阅读扬Kneschke以下博客文章:ORDER BY RAND()

他列出了一些可能的解决方案,其性能表现。

0

众所周知,ORDER BY RAND()可能非常慢,并且尽管您已尝试在此选择一个子查询,但仍会创建一个临时表。

您不清楚为什么您在子选择中选择RAND(),然后忽略此选项并在外部选择上创建新的排序键。也许你可以利用它。

您的ORDER BY条件相当广泛,如果您在那里缺少索引,那么它将进行行扫描以获取全部条目。

不要忘记EXPLAIN您的查询。