【问题标题】:Select Random from 3 Million rows [duplicate]从 300 万行中选择 Random [重复]
【发布时间】:2013-04-20 18:27:06
【问题描述】:

我有 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

【问题讨论】:

标签: mysql random


【解决方案1】:

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

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

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

不要忘记EXPLAIN您的查询。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案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;
      

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

      【讨论】:

        猜你喜欢
        • 2013-08-09
        • 2019-08-30
        • 1970-01-01
        • 1970-01-01
        • 2021-03-06
        • 1970-01-01
        • 2010-11-26
        • 2017-07-10
        • 1970-01-01
        相关资源
        最近更新 更多