博客
关于我
MySQL 中随机抽样:order by rand limit 的替代方案
阅读量:797 次
发布时间:2023-02-10

本文共 1488 字,大约阅读时间需要 4 分钟。

最近,我在研究如何在MySQL中实现随机抽取记录的方法。假设我们需要从tablename表中随机提取一条记录,常见的写法是:SELECT * FROM tablename BY () LIMIT 1;。然而,我在查阅MySQL官方文档时,发现使用RAND()函数在ORDER BY子句中会导致数据列多次扫描,这严重影响了查询效率。

在MySQL 3.23版本中,仍然可以通过ORDER BY RAND()实现随机抽取,但这种方法效率非常低。例如,对于一个包含15万条记录的表,执行一次查询可能需要8秒以上。官方文档指出,这是因为RAND()函数会被多次评估,导致性能显著下降。

为了解决这一问题,我在网上搜索了相关方法,发现了一种常见的解决方案:通过计算最大值和随机数来生成范围内的随机ID。例如,可以使用以下查询来随机获取一条记录:

SELECT * FROM `table` AS t1JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`) - (SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)) AS id) AS t2WHERE t1.id >= t2.idORDER BY t1.id ASCLIMIT 1;

然而,这种方法会返回连续的5条记录。因此,我决定每次查询只获取一条记录,这样即便需要多次查询,效率也会更高。经过优化,一个15万条记录的表只需0.01秒不到即可完成查询。

在进一步优化后,我尝试将RAND()函数直接使用在WHERE子句中,并结合MAX()MIN()函数来确定随机范围。最终,以下查询达到了最佳性能:

SELECT * FROM `table`WHERE id >= (    SELECT FLOOR(RAND() * ((SELECT MAX(id) FROM `table`) - (SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))ORDER BY id LIMIT 1;

这个查询的效率达到了0.01秒,性能显著提升。然而,我发现直接使用FLOOR(RAND() * ...)可能会导致结果集中在表的前部分。为了避免这一问题,我决定在表达式中同时使用MAX()MIN(),以确保随机性和均匀性。

最终,我采用了以下最终版本:

SELECT * FROM `table`WHERE id >= (    SELECT FLOOR(RAND() * ((SELECT MAX(id) FROM `table`) - (SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))ORDER BY id LIMIT 1;

这个查询不仅效率更高(仅需0.01秒),而且能够确保随机抽取的结果均匀分布在整个表中。通过对查询进行优化,我发现使用JOIN语法比直接在WHERE子句中使用函数效率更高,这是因为JOIN语法减少了多次表扫描的次数。

在实际应用中,我对这两个查询分别进行了10次测试,结果显示使用JOIN语法的效率更高。因此,我决定采用JOIN方法来实现随机抽取。

总结来说,通过合理使用RAND()函数、MAX()MIN()函数,以及优化查询结构,我成功实现了高效的随机抽取记录的方法。这一方法不仅性能优异,还能够确保抽取结果的均匀性和随机性。

转载地址:http://kwbfk.baihongyu.com/

你可能感兴趣的文章
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>
Mysql中常用函数的使用示例
查看>>
MySql中怎样使用case-when实现判断查询结果返回
查看>>
Mysql中怎样使用update更新某列的数据减去指定值
查看>>
Mysql中怎样设置指定ip远程访问连接
查看>>
mysql中数据表的基本操作很难嘛,由这个实验来带你从头走一遍
查看>>
Mysql中文乱码问题完美解决方案
查看>>
mysql中的 +号 和 CONCAT(str1,str2,...)
查看>>
Mysql中的 IFNULL 函数的详解
查看>>
mysql中的collate关键字是什么意思?
查看>>
MySql中的concat()相关函数
查看>>
mysql中的concat函数,concat_ws函数,concat_group函数之间的区别
查看>>