[mysql] 随机查询 效率比较
select
primary_count as primaryCount,
primary_score as primaryScore,
junior_count as juniorCount,
junior_score as juniorScore,
senior_count as seniorCount,
senoir_score as senoirScore,
total_score as totalScore,
pass_score as passScore
from pd_paper p
where p.is_valid = ''
order by RAND() limit 1 分析:
ORDER BY从句里面不能使用RAND()函数,因为这样会导致数据列被多次扫描。
测试发现这样效率非常低。一个15万余条的库,查询5条数据,要8秒以上。 You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY
would evaluate the column multiple times. 更高效的做法:查询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 语法 可以实现真正的随机。 SELECT *
FROM `table`
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
ORDER BY id LIMIT 1; 把语句完善一下,加上MIN(id)的判断。
如果没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
完整的语句: ① where 子句 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; ② join 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; #随机查询一套考卷定义
SELECT
p.primary_count as primaryCount,
p.primary_score as primaryScore,
p.junior_count as juniorCount,
p.junior_score as juniorScore,
p.senior_count as seniorCount,
p.senoir_score as senoirScore,
p.total_score as totalScore,
p.pass_score as passScore FROM
pd_paper AS p
JOIN
(
SELECT ROUND(
RAND()
*((SELECT MAX(id) FROM pd_paper)-(SELECT MIN(id) FROM pd_paper))
+(SELECT MIN(id) FROM pd_paper)
) AS id
)
AS p2
WHERE p.id >= p2.id
ORDER BY p.id LIMIT 1; 最后在程序对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。 附加一个复杂sql:按题目类型(三种)随机查询全部考题信息 SELECT * from (
select
p.id as id,
p.title as title,
p.question as question,
p.answer as answer,
p.crt_time as crtTime
from
pd_problem p
join
(SELECT ROUND(RAND()
* ((SELECT MAX(pp.id) FROM pd_problem pp)-(SELECT MIN(pp.id) FROM pd_problem pp))
+(SELECT MIN(pp.id) FROM pd_problem pp)) AS pid) AS p2
where p.id >= p2.pid
and p.is_valid = ''
and p.paper_type = ''
and p.paper_class = ''
order by p.id limit 5
) as t1
union all
SELECT * from (
select
p.id as id,
p.title as title,
p.question as question,
p.answer as answer,
p.crt_time as crtTime
from
pd_problem p
join
(SELECT ROUND(RAND()
* ((SELECT MAX(pp.id) FROM pd_problem pp)-(SELECT MIN(pp.id) FROM pd_problem pp))
+(SELECT MIN(pp.id) FROM pd_problem pp)) AS pid) AS p2
where p.id >= p2.pid
and p.is_valid = ''
and p.paper_type = ''
and p.paper_class = ''
order by p.id limit 5
) as t2
union all
SELECT * from (
select
p.id as id,
p.title as title,
p.question as question,
p.answer as answer,
p.crt_time as crtTime
from
pd_problem p
join
(SELECT ROUND(RAND()
* ((SELECT MAX(pp.id) FROM pd_problem pp)-(SELECT MIN(pp.id) FROM pd_problem pp))
+(SELECT MIN(pp.id) FROM pd_problem pp)) AS pid) AS p2
where p.id >= p2.pid
and p.is_valid = ''
and p.paper_type = ''
and p.paper_class = ''
order by p.id limit 5
) as t3
[mysql] 随机查询 效率比较的更多相关文章
- 分享:mysql 随机查询数据
在mysql中查询5条不重复的数据,使用以下: 1 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了.但是真正测试一下才发现这样效率非常低.一个1 ...
- 提高MySQL数据库查询效率的几个技巧(转载)
[size=5][color=Red]提高MySQL数据库查询效率的几个技巧(转)[/color][/size] MySQL由于它本身的小巧和操作的高效, 在数据库应用中越来越多的被采用.我 ...
- 如何实现MySQL随机查询数据与MySQL随机更新数据?
以下的文章主要介绍的是MySQL随机选取数据,对实现MySQ随机查询数据与MySQ随机更新数据的实际操作步骤的描述,以及对其实际操作中所要用到的语句的描述,以下就是对其具体操作步骤的描述. MySQL ...
- mysql随机查询记录的高效率方法
mysql使用rand随机查询记录的高效率方法 一直以为mysql随机查询几条数据,就用 SELECT * FROM `table` ORDER BY RAND() LIMIT 5 就可以了. 但是真 ...
- mysql随机查询符合条件的几条记录
随机查询,方法可以有很多种.比如,查询出所有记录,然后随机从列表中取n条记录.使用程序便可实现.可是程序实现必须查询出所有符合条件的记录(至少是所有符合条件的记录id),然后再随机取出n个id,查询数 ...
- mysql 随机查询 记录集
有时候需求需要随机从数据库查询若干条记录集,网上搜了一下,几篇博文都是些重复的.....不知道他们谁抄的谁的,这里除了介绍提供一种笔者自己想到的方法,本质都是利用mysql 的rand() 第一种方法 ...
- 如何提高Mysql的查询效率???
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...
- Mysql 随机查询10条数据效率最快的查询方法
1)使用join 和 rand() 耗时 0.009 SELECT * FROM `t_topic` AS t1 JOIN ( SELECT ROUND( RAND() * ( (SELECT MAX ...
- mysql随机查询若干条数据
条不重复的数据,使用以下: 秒以上 搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据. SELECT * FROM `table` AS t1 JOIN (SELE ...
随机推荐
- 未能找到类型集或命名空间名称 "xxxxxx" (是否缺少using 指令或引用?)
“未能找到类型或命名空间名称XXXX”,以往遇到这种情况第一时间想到就是没有引用需要的dll. 但今天我反复检查了好几次,还是没有解决问题.我注意到除了错误信息,还有几个警告信息“未能解析引用的程序集 ...
- Axure多人协作
这几天搞<材料採购系统>需求.我们组须要分模块画模型图,可是假设每一个人各自画各自的,最后整合,这样就太麻烦了.小左说Axure能够实现多人协作,于是我就研究了一下.我们组已经在用了.以下 ...
- DCDC纹波小实验
关于使用示波器測试纹波的注意事项 使用示波器的AC耦合方式測量 因为示波器的头套easy引人噪声,因此在測试前必需把探头的头套去掉 因为电源的高频噪声非常easy通过小电感就能够滤掉,因此更关心的是中 ...
- C#预定义类型
C#提供了16中预定义类型,其中包括13种简单类型和三种非简单类型: 所有预定义类型的名称全部由小写字母组成.预定义的简单类型包括以下3种:11种数值类型.一种Unicode字符类型char.一种布尔 ...
- SpringSecurityFilter 链
1. HttpSessionContextIntegrationFilter 位于过滤器顶端,第一个起作用的过滤器. 用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个Sec ...
- Java 异常处理的 9 个最佳实践
在 Java 中,异常处理是个很麻烦的事情.初学者觉得它很难理解,甚至是经验丰富的开发者也要花费很长时间决定异常是要处理掉和抛出. 所以很多开发团队约定一些原则处理异常.如果你是一个团队的新成员,你可 ...
- Git教程Git多人协作开发
Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...
- unity 查看prefab层次
点那个箭头,可以展开:
- 用rfkill命令管理蓝牙和wifi
rfkill是一个内核级别的管理工具,可以打开和关闭设备的蓝牙和wifi. #列出所有可用设备rfkill list 输出如下:0: phy0: Wireless LAN Soft blocke ...
- 简单实用的php分页函数代码
一个简单实用的php分页函数,分页导航中可以默认为空,在函数内部再设置本页URL. 代码: <?php /** * 分页 * @category 功能 * @param $totle:信息总数 ...