我有 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
假设您的表有一个数字列,这样的事情应该可以工作(从这里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;
它可以工作,但速度会非常慢
众所周知,这ORDER BY RAND()
可能会非常慢,当您尝试在此处选择子选择时,仍然会创建一个临时表。
不清楚为什么你在子选择RAND()
中选择,然后忽略它并在外部选择上创建一个新的排序键。也许你可以利用它。
您的ORDER BY
条件非常广泛,如果您在那里缺少索引,那么将通过行扫描来获取它们。
不要忘记EXPLAIN
您的查询。