`
hui_jing_880210
  • 浏览: 43167 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql 随机取一条或多条数据

 
阅读更多

前天在做系统的时候让随机从一张表中选取一个或多个热词,为了更高效随机重复率低,特地研究了一下,写法如下:

SELECT * FROM `news` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `news`)-(SELECT MIN(id) FROM `news`))+(SELECT MIN(id) FROM `news`)) AS id) AS t2 WHERE t1.id >= t2.id LIMIT 10;

 

也参考了mysql官方提供的RAND()函数和一些网上写的例子如下:

要从tablename表中随机提取一条记录,大家一般的写法就是:
SELECT * FROM tablename ORDER BY RAND() LIMIT 1。
随机取一条-5到5之间的数:
SELECT ROUND((0.5-RAND())*2*5) 
#注释 
#0.5-rand()可以得到-0.5 至 +0.5的随机数 
#(0.5-rand())*2可以得到-1 至 +1的随机数 
#(0.5-rand())*2*5可以得到-5 至 +5的随机数 
#ROUND((0.5-RAND())*2*5)可以得到-5 至 +5的随机整数

但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。 但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。

SELECT * FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2 WHERE t1.id >= t2.id ORDER BY t1.id ASC LIMIT 5;
但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。
SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 1;

我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。
于是我把语句改写了一下。

SELECT * FROM `table`  WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))   ORDER BY id LIMIT 1;

这下,效率又提高了,查询时间只有0.01秒
最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
完整查询语句是:

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;

SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;
最后在java中对这两个语句进行分别查询10次,

前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。
经过多次测试我们得出的结果是利用join的语法比在where中的直接使用要快速不少啊。

分享到:
评论

相关推荐

    MySql分组后随机获取每组一条数据的操作

    在MySQL数据库中,有时我们需要对数据进行分组处理,并从每个分组中随机选取一条记录。这在统计分析或者抽样调查等场景中非常常见。本文将详细介绍如何在MySQL中实现这一操作,以及一些关于随机选取数据的优化方法。...

    mysql获取随机数据的方法

    在MySQL中,获取随机数据是常见的需求,尤其是在测试、数据分析或者构建某些特定功能时。本文将探讨两种常用的方法,以及如何根据数据量和需求选择合适的方法。 方法一:使用`ORDER BY RAND()`函数 `ORDER BY RAND...

    MySQL 随机函数获取数据速度和效率分析

    在实际应用中,为了获取多条随机记录,可以将上述单条记录的查询封装在循环中,虽然这会增加总的执行时间,但每条记录的获取速度依然较快。 总结来说,从MySQL中高效地随机获取数据,需要避免在`ORDER BY`子句中...

    mysql优化取随机数据慢的方法

    MySQL很多时候需要获取随机数据,举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是: 代码如下:SELECT * FROM tablename ORDER BY RAND() LIMIT 1 但是,后来我查了一下MYSQL的官方手册,里面针对...

    MySQL 随机查询数据与随机更新数据实现代码

    在MySQL数据库操作中,随机查询和随机更新数据是两种常见的需求,特别是在数据分析、测试或创建随机样本时。本文将详细探讨这两个概念,并提供相应的实现代码。 首先,我们来看如何在MySQL中实现随机查询数据。当你...

    从MySQL数据库表中取出随机数据的代码

    MySQL 如何从表中取出随机数据  以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩. 他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询. 翻了手册,找到了下面这个语句,可以完成任务了 ...

    随机读场景下的MySQL性能优化方案.pdf

    块压缩的原理是将多条数据打包成块并进行索引,但增大或减小块大小都会影响压缩效果和解压效率。此外,块缓存和操作系统文件缓存的存在增加了双缓存问题,降低了内存利用率。 随着硬件的发展,SSD和NVMe/PCIe接口的...

    php随机取mysql记录方法小结

    如果你想随机获取多条记录,只需修改`LIMIT`后面的数值即可。 **方法二:先获取总数,再随机定位** 这种方法首先获取表中的记录总数,然后生成一个随机数作为起始位置,再获取指定数量的记录。以下是一个例子: `...

    MYSQL随机抽取查询 MySQL Order By Rand()效率问题

    在处理多条记录时,例如需要随机抽取5条数据,可以使用上述方法反复执行5次,或者稍微修改查询语句以一次性获取。但要注意,如果要确保不重复地抽取5条数据,可能需要采用不同的策略,比如先生成一个不重复的随机...

    sql随机查出数据作调考用

    在数据库管理中,有时我们需要从大量数据中随机抽取一部分数据用于测试、分析或者考试系统等场景。这种需求可以通过编写特定的SQL查询语句来实现。不同类型的数据库管理系统(如MS SQL Server, MySQL, Access等)...

    MySQL日志系统,一条SQL跟新语句是如何执行的,高清

    通过以上内容,我们可以看出,一条SQL更新语句在MySQL中的执行并不仅仅是对数据表的直接修改,而是一个涉及多个模块和多个日志系统协同工作的复杂过程。通过redolog和binlog的日志机制,MySQL能够提供强大的数据安全...

    教你如何6秒钟往MySQL插入100万条数据的实现

    这个选项允许我们在一次批处理中插入多条数据,而不仅仅是发送一个包含所有数据的单一SQL语句。这样做减少了网络传输开销,因为只需要发送一条SQL命令和一次执行请求,从而极大地提升了插入速度。 下面是一个具体的...

    mysql随机查询若干条数据的方法

    为了解决这个问题,可以改为分多次查询,每次只查询一条记录。 另一种改进的方法是: ```sql SELECT * FROM `table` WHERE id >= (SELECT FLOOR(MAX(id) * RAND()) FROM `table`) ORDER BY id LIMIT 1; ``` 不过,...

    sql基本语句30条

    **解释**:这些语句分别用于在Access、SQL Server和MySQL中随机选取前n条记录。 ### 8. 查询超过五分钟未完成的任务 **语法示例**: ```sql SELECT * FROM <table_name> WHERE DATEDIFF(MINUTE, start_time, ...

    mysql实现随机查询经验谈

    类似于随机查询一条数据的方法四,但在此基础上,先生成n个随机ID,然后与原表JOIN,最后按ID排序并取前n条。这种方法可以确保返回的是随机分布的多条数据。 ### 性能优化建议 - 对于大表,避免使用`ORDER BY ...

Global site tag (gtag.js) - Google Analytics