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

MYSQL的随机查询的实现方法

阅读更多

MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。

但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,仍然可以通过ORDER BY RAND()来实现随机。

但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上。查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.
搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。
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秒不到。

下面的语句采用的是JOIN,mysql的论坛上有人使用
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;

最后在php中对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多

分享到:
评论
8 楼 hao3721 2015-08-04  
SELECT t1.`gv_title` AS `title`,t1.`gv_ico_key` AS `icon`,t1.`gv_id`,t1.`gv_package_name`
FROM `mzw_game_version` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(gv_id) FROM `mzw_game_version`)-(SELECT MIN(gv_id) FROM `mzw_game_version`))+(SELECT MIN(gv_id) FROM `mzw_game_version`)) AS gv_id) AS t2
WHERE t1.gv_id >= t2.gv_id  AND t1.`gv_type_id`=8
ORDER BY t1.gv_id LIMIT 4;

加了条件后,有时可以取4条,有时取2条,有时1条,有时一条也没有,这样不对的吧?
7 楼 yibuyimeng 2015-05-05  
jpa不支持limit关键字,请问如何修改!
6 楼 ainimaomi 2014-07-22  
是啊,我取到的也是一样的,没用,用select *, rand() as random from 'table' order by random limit 1是可以取到随机的。
5 楼 1511104848 2014-04-18  
貌似不对吧
4 楼 Rocychen 2013-12-11  
非常不错
3 楼 super-code 2013-07-21  
ORDER BY RAND()可以真正产生5条不相同的数据吗?
每次查询一条,查5次可以产生5条完全不同的数据吗?
2 楼 scut_DELL 2013-07-04  
select *, rand() as random from 'table' order by random limit 1
1 楼 wujiajun311 2012-04-17  
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;


为什么我取得的id是一样的啊。

相关推荐

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

    首先,我们来看如何在MySQL中实现随机查询数据。当你需要从表中随机选择一定数量的记录时,可以使用`ORDER BY RAND()`结合`LIMIT`子句来实现。例如,如果你有一个名为`table_name`的表,并想随机选取5条记录,你可以...

    MySQL查询随机数据的4种方法和性能对比

    在MySQL数据库中,查询...总之,选择合适的方法查询随机数据,结合SQL优化技巧和数据库设计策略,能够显著提升MySQL的查询性能。在实际应用中,应根据具体业务场景和数据量,灵活运用这些方法,以达到最佳的性能效果。

    MYSQL 随机 抽取实现方法及效率分析

    MySQL中的随机抽取记录是一种常见的需求,特别是在数据采样或者创建随机测试数据时。然而,实现这一功能的方法多种多样,每种方法的效率也不尽相同。本文将深入探讨两种常见的实现方式及其效率分析。 首先,最直观...

    mysql实现随机查询经验谈

    以下是一些避免这种性能问题并实现随机查询的方法。 ### 一、随机查询一条数据 1. **方法一:ORDER BY RAND() + LIMIT** 不推荐使用此方法,因为当表数据量较大时,效率极低。`ORDER BY RAND()`会导致全表扫描,...

    PHP实现在数据库百万条数据中随机获取20条记录的方法

    本文实例讲述了PHP实现在数据库百万条数据中随机获取20条记录的方法。分享给大家供大家参考,具体如下: 额,为什么要写这个? 在去某个公司面试时,让写个算法出来,当时就蒙了,我开发过程中用到算法的吗?又不是...

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

    在MySQL中,随机抽取查询是常见的需求,但使用`ORDER BY RAND()`往往会导致效率低下,尤其是在处理大数据量的表时。这是因为`RAND()`函数在`ORDER BY`子句中会被执行一次对应于每一行的数据扫描,这使得全表扫描成为...

    随机出题系统的java实现,使用java GUI和MySql数据库!

    ②Mysql数据库与java连接、题目的随机生成、界面切换、循环依赖都是如何设计和实现的。 阅读建议:此资源以开发随机出题系统学习其java GUI原理和内核,不仅是代码编写实现,也更注重内容上的需求分析和过程理解,...

    mysql获取随机数据的方法

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

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

    MySQL性能优化在随机读场景下是一项关键任务,特别是在大数据量和高并发的业务环境中。MyRocks作为MySQL的一个存储引擎,结合了MySQL的成熟稳定性和RocksDB的高性能特性,为解决这一问题提供了新的可能。 MyRocks是...

    单选题随机排序算法及PHP&MySQL程序实现.pdf

    本文主要介绍了单选题随机排序算法及其PHP&MySQL程序实现,旨在解决网络考试系统中的单选题随机排序问题。该算法的主要思想是以登录考生为文件名,从存放试题的数据表文件拷贝数据,得到该考生使用的表文件,然后对...

    Mysql中文汉字转拼音的实现(每个汉字转换全拼)

    以下是一个简单的实现方法,它利用自定义函数来完成这一任务。 首先,我们需要创建一个拼音对照表。这个表用于存储汉字与它们对应的拼音。创建这个表的SQL语句如下: ```sql CREATE TABLE IF NOT EXISTS `t_base_...

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

    在MySQL数据库中,随机查询数据是一项常见的需求,例如在实现推荐系统、测试或者数据分析时。本文将详细讨论如何有效地从数据库中随机选取若干条不重复的数据。 首先,基础的随机查询方法是通过`ORDER BY RAND()`...

    JAVAWEB+Mysql数据库实现注册登录数据库

    总的来说,"JAVAWEB+Mysql数据库实现注册登录数据库"是一个涵盖后端编程、数据库设计、前端交互和安全策略等多个方面的综合实践。通过这个过程,开发者可以深入理解Web应用的生命周期,提升自己的全栈开发能力。

    mysql 如何插入随机字符串数据的实现方法

    以下是如何在MySQL中实现这一目标的详细步骤: 首先,我们需要创建一个存储数据的表。例如,创建一个名为`tables_a`的表,包含一个整数ID和一个长度为50的字符型名称字段: ```sql CREATE TABLE `tables_a` ( `id...

    基于PHP的MYSQL实现Ajax图片随机载入及提示特效.zip

    在本项目中,“基于PHP的MYSQL实现Ajax图片随机载入及提示特效.zip”是一个压缩包,其中包含了使用PHP、MySQL和Ajax技术实现的一种图片展示功能。这个功能的主要目的是通过Ajax异步请求,从MySQL数据库中随机获取...

    php随机取mysql记录方法小结

    这种方法是最直观的,通过在SQL查询语句中加入`ORDER BY RAND()`来随机排序结果集,然后使用`LIMIT`来限制返回的记录数。例如,以下代码将从`tablename`表中随机选取一条记录: ```php $query = "SELECT * FROM ...

Global site tag (gtag.js) - Google Analytics