【问题标题】:Select one or multiple random SQL rows with a WHERE condition on a large table在大表上选择一个或多个带有 WHERE 条件的随机 SQL 行
【发布时间】:2014-11-12 15:34:46
【问题描述】:

我读过http://explainextended.com/2009/03/01/selecting-random-rows/,这也是other questions关于从大表中选择随机行的答案。

但是,我现在想知道如何将这种技术与仅选择其他字段设置为特定值的行结合使用。

就我而言,我很想建立一个马尔可夫链。我的表有一个 id 列,它是自增主索引。它还有一个snippet 列,用于存储要添加的字符串的新部分,但前提是prev_snippet 列正确。

这意味着我想从表中选择一个随机行,该行也将prev_snippet 设置为我已经拥有的某个字符串。我怎样才能有效地做到这一点?

【问题讨论】:

  • 很大程度上取决于你现在'随机'你需要它。真正随机的,或者只是大部分随机的。假设有 4 个匹配的行,总是有 25% 的时间得到每一个是非常重要的。或者,某些结果是否比其他结果更受青睐并不重要?
  • 您的“过滤器”的选择性如何?即它总是具有高度选择性(每个 prev_sn-p 的结果很少),还是有一些 prev_sn-p 有成百上千的结果?
  • 如果不是完全平均分布也没关系。然而,过滤器的选择性差异很大:当前的实现使用最后两个词进行比较。例如,当前面的单词是“of the”时,可能会返回很多结果。

标签: mysql random markov-chains


【解决方案1】:

所以是的,如果您不关心真正的随机性,那么链接帖子中的想法可能非常好。只要索引在prev_snippet 列!

但是由于它仍然完全独立地使用随机数,因此即使有一行,您最终也可能不会在结果中得到任何行。即每次过滤器运行时,它恰好总是排除。

坦率地说,尝试使用ORDER BY RAND() LIMIT 1,它可能会很好用。结果集的大小是最重要的,而不是初始表的大小。

【讨论】:

    猜你喜欢
    • 2013-11-18
    • 2020-07-11
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-03
    • 2011-05-02
    • 1970-01-01
    相关资源
    最近更新 更多