MySQL 如何快速从 60 万行数据中随机选择 10 行?

MySQL 如何快速从 60 万行数据中随机选择 10 行?

在实际项目开发中,我们经常需要从数据库中随机选择一定数量的数据。对于数据量比较小的情况下,可以直接使用 ORDER BY RAND() 的方式进行选择,但是当数据量非常大的时候,这种方法就会变得非常耗时。本文将介绍一些优化策略,可以帮助我们快速从大量的数据中随机选择指定数量的数据。

阅读更多:MySQL 教程

方案一:通过 LIMIT 和 OFFSET 选择

这时我们需要使用 MySQL 中的 LIMIT 和 RAND 函数结合使用,首先使用 COUNT() 函数获取表中记录的总数,然后使用 RAND() 函数生成一个随机浮点数,用该随机数乘以 COUNT() 就可以取得表中的一个随机行号,最后在 WHERE 子句中使用该行号筛选出一个随机行,可以使用 UNION ALL 来组合多个随机行,从而取得指定数量的随即行。

例如,下面是查找 10 条随机数据的 SQL 语句示例:

SELECT * FROM table_name
WHERE id >= (SELECT FLOOR(MAX(id) * RAND()) FROM table_name) 
ORDER BY id LIMIT 10;

方案二:通过采样方式进行选择

如果我们的数据量过大,采用 OFFSET 的方式会产生比较大的效率问题,那么我们可以考虑采用采样技术。所谓采样,就是先从总体数据中抽出一部分数据进行处理,得到近似的结果。在 MySQL 中,我们可以使用 TABLESAMPLE 子句来实现对数据采样。

例如,下面的例子使用 TABLESAMPLE 子句来获取 table_name 表的 10% 随机行:

SELECT * FROM table_name TABLESAMPLE(10 PERCENT);

方案三:通过程序随机选择

如果以上两种方法还是不能满足需求,那么我们可以考虑采用程序随机选择的方式。通过程序,在读取数据时随机选择需要的行数,这样可以保证数据的随机性。

例如,在 Python 中,我们可以使用以下代码来实现从 table_name 表中随机选择 10 条数据:

import random
import pymysql

conn = pymysql.connect(host='localhost', user='root', password='password', database='database_name', cursorclass=pymysql.cursors.DictCursor)
cur = conn.cursor()

results =[]

sql = "SELECT * FROM table_name;"
cur.execute(sql)
rows = cur.fetchall()

#从rows中随机抽取10行
if len(rows) >= 10:
    results=random.sample(rows,10)
else:
    results=rows

cur.close()
conn.close()

print(results)

总结

随机选择数据是数据库查询中常用的功能,但是针对大规模数据的情况,我们需要采用一些优化策略,例如 LIMIT 和 OFFSET、采样和程序随机选择等方法。具体如何选择方案需要根据实际情况进行评估,以求得最佳的效果。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程