- 浏览: 73919 次
文章分类
- 全部博客 (47)
- 合并两个表 (1)
- java (46)
- 获得一个节点对象的节点类型 (1)
- JSP 页面不能解析EL表达式。 (1)
- 数据库连接长时间空闲后 (1)
- 爆连接已经关闭的解决方法 (1)
- 设计工作流引擎就象设计一部汽车(工作流程引擎设计思路提示) (1)
- Hadoop的下一代mapreduce (1)
- 备忘css元素定位 (1)
- 第一次通宵 (1)
- 字符编码工具类 (1)
- Asset Pipeline in rails 3.1.0 (1)
- IT行业热点----我国IT飞速发展需关注6大问题 (1)
- Web Service实践之——开始XFire (1)
- 单片机C语言编程基础模板 (1)
- 中医养生顺口溜 (1)
- Property文件读取的Util类 (1)
- JEECMS (1)
- CheckStyle使用java.header文件的问题 (1)
- JUnit4测试代码示例 (1)
- JavaScript中三个弹出窗口 (1)
- About .Net Petshop (1)
- MapXtreme2004代码 在地图上新增加点图元 (1)
- 50个GMail的邀请权 想要的留下EMail (1)
- asp.net+Access简单企业站源码 (1)
- 局域网指定ip断网工具源码 (1)
- lucene索引和搜索过程中的核心类介绍 (1)
- poi 取消科学计数法 (1)
- centos相关 (1)
- java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered (1)
- Project configuration is not up-to-date with pom.xml. 问题解决 (1)
- js截取最后一个.的字符串(IP地址判断) (1)
- Android开发之《Android应用开发揭秘》UI事件汇总 (1)
- SSH through proxy to visit ssh.github.com (ZZ) (1)
- eclipse3.7 添加任务标记 (1)
- SQLServer2005和2008的分页技术比较 (1)
- 传智播客java基础加强ppt (1)
- Struts 标签疑难问题收集-乔乐共享 (1)
- mysql使用rand随机查询记录效率测试 (1)
- 按钮实现spinner (1)
- 线程循环 (1)
- Android相关工具地址 (1)
最新评论
-
543089122:
N年前的老掉牙的手段了,原理也就是ARP
局域网指定ip断网工具源码 -
lvwenwen:
...
Web Service实践之——开始XFire -
hz_grape:
程序员的人生
第一次通宵 -
faylai:
传说中的广告贴啊!!
设计工作流引擎就象设计一部汽车(工作流程引擎设计思路提示)
一直以为mysql随机查询几条数据,就用
SELECT * FROM `table` ORDER BY RAND() LIMIT 5
就可以了。
但是真正测试一下才发现这样效率非常低。一个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中使用函数效率还要高很多。
本文章非原创mc
发表评论
-
Android相关工具地址
2012-02-08 15:57 804SDK: http://developer.andr ... -
线程循环
2012-02-07 14:28 842@selector(xxxThread)方法以后,在方 ... -
按钮实现spinner
2012-02-03 12:43 911int cityID=0; //用于默认选择哪个 ... -
Struts 标签疑难问题收集-乔乐共享
2012-02-02 15:14 886循环List:private List list; & ... -
传智播客java基础加强ppt
2012-01-31 16:13 1619<p>????? 如果想把java基础打牢 ... -
SQLServer2005和2008的分页技术比较
2012-01-31 15:53 1987<span style="fon ... -
eclipse3.7 添加任务标记
2012-01-31 15:23 2399<p>在编写程序时有一些工作要等到以后才做 ... -
SSH through proxy to visit ssh.github.com (ZZ)
2012-01-31 14:58 1932<p>Scenario:</p> ... -
Android开发之《Android应用开发揭秘》UI事件汇总
2012-01-11 14:43 1222<h1>Android开发之《Androi ... -
js截取最后一个.的字符串(IP地址判断)
2012-01-11 14:18 2279[size=small;] 由于我们的项目中需 ... -
Project configuration is not up-to-date with pom.xml. 问题解决
2012-01-11 13:09 2092<span>Project configu ... -
java.lang.IllegalStateException: No WebApplicationContext found: no ContextLoaderListener registered
2011-12-28 12:28 5527<span style="font-f ... -
centos相关
2011-12-28 11:34 857比较新的源 rpm -Uvh http://dow ... -
poi 取消科学计数法
2011-12-21 13:33 2261[size=medium;]<br>[/s ... -
lucene索引和搜索过程中的核心类介绍
2011-12-21 12:54 1250lucene索引和搜索过 ... -
局域网指定ip断网工具源码
2011-12-20 13:53 2062只适用于小型局域网 <br> <s ... -
asp.net+Access简单企业站源码
2011-12-20 12:04 3186<span style="font-f ... -
50个GMail的邀请权 想要的留下EMail
2011-12-15 13:34 770今天看到自己已经有50个GMail的邀请权了 想要的请 ... -
MapXtreme2004代码 在地图上新增加点图元
2011-12-15 13:29 817sender, System.EventArgs e ... -
About .Net Petshop
2011-12-14 19:29 741<span style="" ...
相关推荐
综上所述,优化MySQL的随机查询记录效率通常涉及避免在`ORDER BY`中使用`RAND()`,以及利用`id`字段的范围来计算随机索引。通过这样的方法,即使在大型数据集中,也能快速有效地获取随机记录,从而提高应用性能。在...
order by rand() 但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。但是在MYSQL 3.23版本中,仍然可以通过ORDER ...
举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。 但是,后来我查了一下MYSQL的官方手册,里面针对RAND()的提示大概意思就是,在ORDER BY从句...
在MySQL数据库操作中,随机查询和随机更新数据是两种常见的需求,特别是在数据分析、测试或创建随机样本时。本文将详细探讨这两个概念,并提供相应的实现代码。 首先,我们来看如何在MySQL中实现随机查询数据。当你...
在MySQL中,随机查询是常见的需求,特别是在数据分析、测试或者某些特定的应用场景中。然而,直接使用`ORDER BY RAND()`可能会导致性能问题,因为它需要全表扫描,这在大数据量时尤为明显。以下是一些避免这种性能...
在实际应用中,为了获取多条随机记录,可以将上述单条记录的查询封装在循环中,虽然这会增加总的执行时间,但每条记录的获取速度依然较快。 总结来说,从MySQL中高效地随机获取数据,需要避免在`ORDER BY`子句中...
压力测试脚本执行时,可以通过调用这个存储过程,插入大量的数据,观察MySQL服务器的响应时间、CPU使用率、内存占用、磁盘I/O等指标,从而分析其在高并发情况下的表现。此外,还可以使用像sysbench、loadrunner这样...
### MySQL性能测试脚本知识点详解 #### 一、创建数据库表结构 在MySQL性能测试脚本中,首先涉及到了三个数据库表的创建:部门表(`dept`)、员工表(`emp`)以及工资级别表(`salgrade`)。这三个表的创建语句及其...
在MySQL数据库中,有时我们需要对数据进行分组处理,并从每个分组中随机选取一条记录。这在统计分析或者抽样调查等场景中非常常见。本文将详细介绍如何在MySQL中实现这一操作,以及一些关于随机选取数据的优化方法。...
Oracle使用`DBMS_RANDOM.VALUE`,MySQL可以选择更高效的子查询方式或直接使用`RAND()`,而MS SQL Server则依赖于`NEWID()`。无论哪种方法,随机排序都可以为数据分析、测试或特定业务需求提供帮助。在实际应用中,应...
MySQL中是使用SELECT语句来查询数据的。在这一章中将讲解的内容包括。 1、查询语句的基本语法 2、在单表上查询数据 3、使用聚合函数查询数据 4、多表上联合查询 5、子查询 6、合并查询结果 7、为表和字段取别名 8、...
然而,如果需要抽取多条非连续的记录,就需要在外部进行循环,每次查询一条,这样虽然效率较高,但整体仍然不如一次性抽取所有需要的随机记录。 在实际应用中,如果表的主键ID是连续的,那么这种方法非常有效。但...
在MySQL中,插入随机字符串数据通常用于测试环境,模拟真实数据以验证数据库操作或性能测试。以下是如何在MySQL中实现这一目标的详细步骤: 首先,我们需要创建一个存储数据的表。例如,创建一个名为`tables_a`的表...
例如,`SELECT * FROM table ORDER BY RAND() LIMIT 5`将返回表中的五个随机记录。请注意,这种方法在大数据集上可能会较慢,因为需要排序整个表。 最后,**数据转换**是SQL中的一个重要方面,涉及类型转换、格式化...
例如,如果你有一个名为`table`的表,你可以使用以下SQL语句来获取5条随机记录: ```sql SELECT * FROM `table` ORDER BY RAND() LIMIT 5; ``` 然而,这种方法在数据量较大的情况下效率极低,因为它会将整个表进行...
6. **避免使用ORDER BY RAND()**:这会导致MySQL对所有结果进行随机排序,消耗大量CPU资源。若需随机选择记录,可考虑使用其他方法,如先生成一个随机ID,再根据ID进行查询。 7. **避免SELECT ***:尽量指定需要的...