当前位置:  数据库>mysql

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

    来源: 互联网  发布时间:2014-10-12

    本文导语:  在mysql中查询5条不重复的数据,使用以下: 代码如下:SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了。但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上搜索Google,网上基本上都是查询ma...

在mysql中查询5条不重复的数据,使用以下:

代码如下:

SELECT * FROM `table` ORDER BY RAND() LIMIT 5

就可以了。但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上
搜索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;

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


    
 
 

您可能感兴趣的文章:

  • mysql中字符串和时间互相转换的方法(自动转换及DATE_FORMAT函数)
  • mysql修改用户密码的方法和mysql忘记密码的解决方法
  • linux mysql登陆出错 mysql升级方法
  • MySql报错Table mysql.plugin doesn’t exist的解决方法
  • mysql启动错误之mysql启动报1067错误解决方法
  • php连接不上mysql但mysql命令行操作正常的解决方法
  • MySQL降权运行之MySQL以Guests帐户启动设置方法
  • mysql修改密码的三方法和忘记root密码的解决方法
  • mysql解决远程不能访问的二种方法
  • 强制修改mysql的root密码的六种方法分享(mysql忘记密码)
  • 修改mysql密码与忘记mysql密码的处理方法
  • linux忘记mysql密码处理方法
  • mysql服务无法启动报错误1067解决方法(mysql启动错误1067 )
  • MYSQL不能从远程连接的一个解决方法(s not allowed to connect to this MySQL server)
  • mysql Master-Master-Slaves有谁会么?求教linux下mysql Master-Master-Slaves配置方法
  • mysql中文排序注意事项与实现方法
  • mysql 查看版本的方法图文演示
  • mysql忘记密码的解决方法
  • mysql 提示INNODB错误的解决方法
  • 免安转MySQL服务的启动与停止方法
  • windows7下启动mysql服务出现服务名无效的原因及解决方法
  • php中内置的mysql数据库连接驱动mysqlnd简介及mysqlnd的配置安装方式
  • 如何将mysql的数据文件移到指定目录,而且要保证mysql要运行正常.
  • mysql数据类型datetime,date和timestamp比较
  • mysql 10w级别的mysql数据插入
  • Linux和windows下用mysql c++ library操作Mysql数据库
  • mysql数据库备份命令分享(mysql压缩数据库备份)
  • mysql jdbc连接mysql数据库步骤及常见参数详解
  • xp下的mysql数据库如何迁移到linux中的mysql
  • mysql数据库介绍
  • 解析mysql数据库还原错误:(mysql Error Code: 1005 errno 121)
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Mysql查询错误:ERROR:no query specified原因
  • mysql查询语句通过limit来限制查询的行数
  • Mysql设置查询条件(where)查询字段为NULL
  • mysql 开启慢查询 如何打开mysql的慢查询日志记录
  • mysql中查询当前正在运行的SQL语句并找出mysql中运行慢的sql语句
  • mysql 设置查询缓存
  • Mysql Select查询执行流程介绍及实例
  • MySQL 慢查询监控器 Anemometer
  • mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法
  • MySQL并行查询引擎 Shard-Query
  • Mysql大表查询优化技巧总结及案例分析
  • 清空mysql 查询缓存的可行方法
  • 在C中如何判断从mysql中查询到的NULL值?
  • php mysql查询指定范围内日期
  • mysql取当前时间与当前日期查询代码
  • MySQL运行状况查询方式介绍
  • 把mysql查询结果保存到文件的shell脚本
  • mysql 查询表中平均分最低的班级
  • mysql 跨表查询、更新、删除示例
  • mysql仿oracle的decode效果查询
  • php查询时间段 mysql时间查询
  • mysql中如何查看最大连接数(max_connections)和修改最大连接数
  • 在 linux下输入"mysql"命令,进入mysql命令行,但出现“Can't connetc to local MySQL server thuough socket /var/lib/mysql/mysql.sock
  • php安装完成后如何添加mysql扩展
  • MySQL 重装MySQL后, mysql服务无法启动
  • Myeclipse中自带Tomcat的JDBC连接池配置(mysql和mssql)
  • 为什么用linux安装盘安装了mysql后,启动mysql,提示找不到mysql.sock文件?
  • MySQL Workbench的下载安装与使用教程
  • 請教,在redhat linux7.2+mysql 中,系統提示mysql已啟動,網頁卻不能訪問mysql?
  • VS2012+MySQL+SilverLight5的MVVM开发模式介绍
  • 求解释: useradd -g mysql mysql -d /home/mysql -s /sbin/nologin


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3