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、采样和程序随机选择等方法。具体如何选择方案需要根据实际情况进行评估,以求得最佳的效果。