欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mysql随机抽取解决方案

程序员文章站 2022-05-08 17:30:19
...

关于Mysql单表根据条件随机抽取N条数据的sql写法

业务要求

现在有一个题库,大概几百条数据,表格字段如下:
Mysql随机抽取解决方案
要求根据考题范围(code_item/code_subItem)来随机抽取50道题目,其中40道单选题,10道判断题。
其他业务逻辑这里就不阐述了。只说sql语句这里有2个要求。
1.根据code_item 或者 code_subItem 随机抽取一条单选题或者判断题。
2.根据code_item 或者 code_subItem 随机抽取n条不重复的单选题或者判断题。

sql

相关资料连接:1.mysql生成不重复随机数(unique number generation)
2.mysql高效率随机获取n条数据写法

查找相关资料后,发现需要用到mysql 自带的rand()函数,但是资料里给出的答复都是大数据情况下,直接用order by rand()会造成全表查询非常影响查询效率。
参考资料生成符合自身表格查询的sql如下:

随机抽取单条数据示例:直接用函数

SELECT * FROM t_safe_assessment_questions WHERE code_item = 01 AND question_type = 1 ORDER BY RAND() limit 1;

随机抽取单条数据示例:右连接

SELECT * FROM t_safe_assessment_questions t1 RIGHT JOIN (SELECT * FROM t_safe_assessment_questions WHERE code_item = 01 AND question_type = 1 ) t2 ON t1.question_id=t2.question_id ORDER BY RAND() LIMIT 1;

通过数次的单条sql语句查询发现,在数据量很小的时候,查询速度并无太大区别,直接引用的波动更大一点。
尝试多次查询单条数据测试:
第一条sql查询50次需要的时间在0.8s~2.8s;多数情况在0.8s左右。
第二条sql查询50次需要的时间在0.8s~1.7s;多数情况在0.9s-1s左右。

存在疑问:
1. 当数据量并不是很大的时候,rand()可以直接使用,甚至可能因为单表查询,sql语句越简单,导致查询速度更快。
2. 如果给这些固定的条件增加索引是否会显著提升查询速度。

相关标签: 存在疑问