当前位置:首页 > 编程教程 > mysql技术文章 > mysql随机查询若干条数据的方法

mysql随机查询数据的代码分析

  • 发布时间:
  • 作者:码农之家
  • 点击:160

这篇文章主要知识点是关于mysql、随机查询、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

零点起飞学MySQL
零点起飞学MySQL原书扫描版
  • 类型:MySQL入门大小:85.8 MB格式:PDF作者:秦婧
立即下载

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

在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中使用函数效率还要高很多。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

您可能感兴趣的文章:

  • 如何开启MySQL慢查询
  • 解析mysql基础架构教程之查询语句执行的流程
  • mysql查询重复数据中SQL优化方法
  • 分享mysql简单实现查询结果添加序列号的代码
  • 实现MySQL递归查询树状表的子节点、父节点具体方法
  • MySql跨表查询的方法汇总
  • mysql查询当天、本周,本月、上一个月数据
  • 示例讲解php+mysql查询实现无限下级分类树输出
  • MySQL基本查询语句总结
  • 深入理解MySql数据表之间的连接、查询
  • 相关电子书
    学习笔记
    网友NO.955654

    随机生成八位优惠码并保存至Mysql数据库

    目前很多商家通过优惠码做活动,现在我们简单的实现八位的优惠码,并保存在数据库中。 1.随机生成优惠码代码如下: import java.util.Random;/***功能:随机生成优惠码*@author iamwiam**/public class Activatedcode { public int ACTIVATEDCODENUM = 200; //生成的优惠码数量 Random random = new Random(); String candicatedCode = "abcedefghijklmnopqrstuvwxyz";//优惠码包含小写字母 candicatedCode+=candicatedCode.toUpperCase();//优惠码包含大写字母 candicatedCode+="1234567890";//优惠码包含阿拉伯数字 for(int i=0; i ACTIVATEDCODENUM;i++){ String res =""; for(int j=0;j8;j++){ res+=candicatedCode.charAt(random.nextInt(candicatedCode.lenght())); } System.out.println(res);//随机生成200个8位的优惠码 }} 2.将优惠码保存在数据库中 private static void insertToMySql(String res){ int n = 0; try{ Class.forName(“com.mysql.jdbc.Driver”); Connection connection = DriverMannager.getConnection(“jdbc:mysql……

    网友NO.899400

    Python实现生成随机数据插入mysql数据库的方法

    本文实例讲述了Python实现生成随机数据插入mysql数据库的方法。分享给大家供大家参考,具体如下: 运行结果: 实现代码: import random as rimport pymysql first=('张','王','李','赵','金','艾','单','龚','钱','周','吴','郑','孔','曺','严','华','吕','徐','何')middle=('芳','军','建','明','辉','芬','红','丽','功')last=('明','芳','','民','敏','丽','辰','楷','龙','雪','凡','锋','芝','')name=[]passwd1=('1234','5678','147','258')for i in range(101): name1=r.choice(first)+r.choice(middle)+r.choice(last) #末尾有空格的名字 name2=name1.rstrip() #去掉末尾空格后的名字 if name2 not in name: #名字存入列表中,且没有重名 name.append(name2)conn = pymysql.connect(host='127.0.0.1', port=3306, user='root', passwd='123',db='test1')cur = conn.cursor() for i in range(len(name)): #插入数据 passwd=r.choice(passwd1) #在密码列表中随机取一个 cur.execute("insert into a2(name,passwd) values(%……

    <
    1
    >

    Copyright 2018-2020 www.xz577.com 码农之家

    版权投诉 / 书籍推广 / 赞助:520161757@qq.com