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数据表之间的连接、查询
随机生成八位优惠码并保存至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……
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(%……