SQL反模式学习笔记16 使用随机数排序
目标:随机排序,使用高效的SQL语句查询获取随机数据样本。
反模式:使用RAND()随机函数
SELECT * FROM Employees AS e ORDER BY RAND() Limit 1
缺点:无法利用索引,每次选择的时候都不同且不可预测。进行全表遍历,性能极差。
如何识别反模式:当出现以下情况时,可能是反模式
1、在SQL中,返回一个随机行速度非常慢;
2、要获取所有的记录然后随机一个。要如何增加程序可使用的内存大小?
3、有些列出现的频率比别的列要高一些,这个随机算法不是很随机。
合理使用反模式:在数据量很小的时候,可以使用随机排序。
解决方案:没有具体的排序……
1、从1到最大值之间随机选择
select b1.*
from Bugs as b1
join (select ceiling(rand()*(select max(bugId) from Bugs)) as randId) as b2
on b1.bugId = b2.bugId
因为id可能是不连续的,所以可能有时候无法查询到结果。
2、选择下一个最大值
select b1.*
from Bugs as b1
join (select ceiling(rand()*(select max(bugId) from Bugs)) as randId) as b2
where b1.bugId >= b2.bugId --为了避免id不存在,我们找上面那条id的后一条数据。
order by b1.bugId limit 1;
当缝隙中是缝隙不是很大并且每个值都要被等概率选择的重要性不是很高时,可以考虑使用此方案。
3、索取所有的键值,随机选择一个,再使用这个随机选择的主键查找完整的记录。
4、使用偏移量选择随机行
MySQL、PostgreSQL、SQLite支持Limit关键字;
Oracle、MsSql Server使用Row_Number()函数。
5、专有解决方案
每种数据库都提供专有的解决方案:
Sql Server2005以上版本增加了 TableSample()函数 :SELECT * FROM Employees TABLESAMPLE(1 rows);
Oracle使用类似的Sample()函数:
SELECT * FROM ( SELECT * FROM Employees SAMPLE(1)
order by Employees.Id)
where rownum = 1
结论:有些查询是无法优化的,换种方法试试看。
SQL反模式,系列学习汇总
18、SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题
成在管理,败在经验;嬴在选择,输在不学! 贵在坚持!
个人作品
BIMFace.SDK.NET
开源地址:https://gitee.com/NAlps/BIMFace.SDK
系列博客:https://www.cnblogs.com/SavionZhang/p/11424431.html
系列视频:https://www.cnblogs.com/SavionZhang/p/14258393.html
技术栈
1、Visual Studio、.NET Core/.NET、MVC、Web API、RESTful API、gRPC、SignalR、Java、Python
2、jQuery、Vue.js、Bootstrap、ElementUI
3、数据库:分库分表、读写分离、SQLServer、MySQL、PostgreSQL、Redis、MongoDB、ElasticSearch、达梦DM
4、架构:DDD、ABP、SpringBoot、jFinal
5、环境:跨平台、Windows、Linux、Nginx
6、移动App:Android、IOS、HarmonyOS、微信小程序、钉钉、uni-app、MAUI
分布式、高并发、云原生、微服务、Docker、CI/CD、DevOps、K8S;Dapr、RabbitMQ、Kafka、RPC、Elasticsearch。
欢迎关注作者头条号 张传宁IT讲堂,获取更多IT文章、视频等优质内容。
出处:www.cnblogs.com/SavionZhang
作者:张传宁 技术顾问、培训讲师、微软MCP、系统架构设计师、系统集成项目管理工程师、科技部创新工程师。
专注于企业级通用开发平台、工作流引擎、自动化项目(代码)生成器、SOA 、DDD、 云原生(Docker、微服务、DevOps、CI/CD);PDF、CAD、BIM 审图等研究与应用。
多次参与电子政务、图书教育、生产制造等企业级大型项目研发与管理工作。
熟悉中小企业软件开发过程:可行调研、需求分析、架构设计、编码测试、实施部署、项目管理。通过技术与管理帮助中小企业实现互联网转型升级全流程解决方案。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如有问题,可以通过邮件905442693@qq.com联系。共同交流、互相学习。
如果您觉得文章对您有帮助,请点击文章右下角【推荐】。您的鼓励是作者持续创作的最大动力!