Mysql随机抽取解决方案
程序员文章站
2022-05-08 17:30:19
...
关于Mysql单表根据条件随机抽取N条数据的sql写法
业务要求
现在有一个题库,大概几百条数据,表格字段如下:
要求根据考题范围(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. 如果给这些固定的条件增加索引是否会显著提升查询速度。
上一篇: 关系数据库——sql查询