Mysql:从600k行中快速获取50行中的10行(其余由WHERE排除)

标签 mysql performance select random sql-order-by

我的问题是基于 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 中的错误行,那么性能如何? 换句话说,在这个查询中什么首先起作用 - WHEREORDER BY RAND()

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

最佳答案

如果这表现良好(对您来说足够快)并且返回的行数不多(例如,少于 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会是任意的,不确定的,但不是随机的。它可能会根据用于查询的索引来完成。

关于Mysql:从600k行中快速获取50行中的10行(其余由WHERE排除),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14177407/

相关文章:

php - 子类别不显示在选择菜单中

mysql - 如何在 mysql 中拆分/反透视 group_concat?

java - 在 jTextField 中显示数据库记录

PHP HTML if then else 语句

python - 加速嵌套 python 数组的操作

ios - 在 webview ios 中选择居中文本

mysql - 如何在 mariaDB 中创建为新用户授予数据库访问权限的角色?

macos - 有没有一种简单的方法来测量我的 Mac 应用程序的 FPS?

android - Android 应用程序应该最大限度地利用 SVG 吗?

javascript - angularjs - 如何使用 html 选择