1

我有 320 万行和几个键来帮助加快排序。然而,随着我的桌子越来越大,事情每天都变得越来越慢。你们可以看看我的查询,让我知道是否有任何其他解决方案可以让这个过程更快更好?

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
4

3 回答 3

3

假设您的表有一个数字列,这样的事情应该可以工作(从这里id借来的):

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;

它可以工作,但速度会非常慢

于 2013-04-26T14:25:45.033 回答
0

问题是因为您使用 RAND() 处理大量数据

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

他列出了一些可能的解决方案及其性能行为。

于 2013-04-26T14:26:53.037 回答
0

众所周知,这ORDER BY RAND()可能会非常慢,当您尝试在此处选择子选择时,仍然会创建一个临时表。

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

您的ORDER BY条件非常广泛,如果您在那里缺少索引,那么将通过行扫描来获取它们。

不要忘记EXPLAIN您的查询。

于 2013-04-26T14:27:06.887 回答