【问题标题】:Mysql: get 10 random rows among 50 rows (the rest excluded by WHERE) from 600k rows fastMysql:从 600k 行中快速获取 50 行中的 10 个随机行(其余由 WHERE 排除)
【发布时间】:2013-01-05 23:07:46
【问题描述】:

我的问题基于 SO MySQL select 10 random rows from 600K rows fast。 众所周知

SELECT column FROM table
ORDER BY RAND()
LIMIT 10

对于大表来说太慢了,另一种技巧和方法用于提取一些行。

但是如果我使用 WHERE:

SELECT column FROM table
WHERE colA=123
ORDER BY RAND()
LIMIT 10

如果WHERE 实际上至少排除了99.99% 600k 中的错误行,那么性能如何? 换句话说,在这个查询中首先起作用的是WHERE 还是ORDER BY RAND()

如果WHERE 先工作,这是否意味着ORDER BY RAND () 只排序60 行(不是600k)并且工作速度很快?

【问题讨论】:

    标签: mysql performance select random sql-order-by


    【解决方案1】:

    如果这表现良好(对您来说足够快)并且返回的行数不多(例如,少于 1000 行):

    SELECT column FROM table
    WHERE colA=123 ;
    

    那么这也会很好地执行,因为它只会对上一个查询的(少于 1000 行)行进行排序:

    SELECT column FROM table
    WHERE colA=123
    ORDER BY RAND()
    LIMIT 10 ;
    

    如果您想确定它会执行得很好,即使第一个查询返回数千或数百万行,您也可以使用它,这会将排序限制为最大 1000(或您选择的数量)行:

    SELECT column
    FROM
      ( SELECT column FROM table
        WHERE colA=123
        LIMIT 1000
      ) AS tmp
    ORDER BY RAND()
    LIMIT 10 ;
    

    缺点是,如果确实有很多行,则 1000-cut 将是任意和不确定的,但不是随机的。它可能会根据用于查询的索引来完成。

    【讨论】:

    • 感谢您分享这个想法 - 从选择中选择。你甚至帮助我回答了我的另一个问题。
    【解决方案2】:

    WHERE 首先工作,是的,然后 ORDER BY 获得较少的行数进行排序,但 WHERE 释放了更多时间

    在您的查询中也运行 EXPLAIN,这也将表明为什么会出现这种速度或延迟

    【讨论】:

      猜你喜欢
      • 2011-05-18
      • 2013-12-16
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多