这个问题的来由是我朋友要为一网站实现一个标签云功能,和我交流后我给出了一个方案,在此略作记录,亦求拍砖。
大概需求这是样的:

在数据库有一张表A如下图:

其中id字段的值未必是连续的,现在我朋友要做的事情就是要从这张表获取条数据,但这5条数据是具有随机性的,比如可能是[6,2,5,10,17]

解决方案和推理过程如下:

1、先求出这张表最小和最大的id还有数据的条数, 设 min 为最小id, max为最大idcount为数据的条数

从上表得知 :

 min=22;

 max=1186;

                 count=16;

那么可用的连续的 IDS=[min,max],即从221186之间,但这之间有些id是没对应上数据的,比如如果某id,那么在上表则没有对应的数据。根据要求需要从这张表随机取条数据,那么就是说我们可以从minmax之间随机产生id,但问题来了,很明显从上表可以看出产生的这id未必会是表中存在的id,那么就是说我们需要产生多少个

随机id才能保证至少能获取到条数据呢?推理过程如下:

表中不存在的ID数目=max-count=-=1170,就是说我们有id是不存在上表中的,就是说我们至少要生产+个不同的id才能保证击中上表的某个id,如果需要击中nid则的公式则为max-count+n,上面的要求是n=5,所以至少要生产的随机id+=id,然后我们可以组装select  * from A where id in [1175个id] 的方式进行数据库查询了,这样我们就可以至少得到条随机的数据了。

从上表也可以看出一个问题,就是当id的不连续区间比较大的时候需要生产的随机id就要越多,比如上面的最大id,而这张表却只有条数据,就是说count越接近max则需要生产的随机id则越少,则此算法的效率则越高。

PS1:

此前朋友也在网上搜索了一种解决方案,但我觉得不太好,所以就有了上面的文字。方案如下:

这个问题来自论坛提问。很多人都知道类似下面的语句

select top 2000 * from tb order by newid()
但是在海量数据下,它的性能是无法忍受的。这里我用一个变通的办法来实现性能的提升,思路为:表必须存在一个guid类型的主键或者索引列,然后用这个列去like一个随机字符串,随机字符串必须为guid规定的字符集合(数字+A到Z)。下面例子只用到了数字,并且只用了4个数字来匹配,你可以更改like后面的语句来调整这个策略。
--生成测试环境
use master
go
create table test(id uniqueidentifier,name varchar(100))
insert into test select newid(),name from syscolumns
--随机提取
select top 10 * from test where id like
char(48+abs(checksum(newid())%10))+ '%'+
char(48+abs(checksum(newid())%10))+ '%'+
char(48+abs(checksum(newid())%10))+ '%'+
char(48+abs(checksum(newid())%10))+'%'
--删除测试环境
drop table test
我测试了300万数据提取2000条,耗时大约1秒左右。另外提醒一点,索引对like语句是有效的。

PS2:

本文章还有一个朋友阿木的帮助才能得以完成,这种策略是我提出的,数学上的推理是阿木协助我完成的。再次感叹数学之重要。

PS3:

最后为朋友淘宝小店打个小广告:

http://keytag.taobao.com/

如何随机获取数据库不连续ID的数据?的更多相关文章

  1. 随机获取数据库中的某一条数据(基于yii2框架开发)

    注意: 使用PHP函数array_rand()得到的是这个数组中的那个值相对应的下标键值,需要配合原来的数组进行,例如: $rand_keys = array_rand($ids,1); $id = ...

  2. wireshark 获取指定进程id的数据

    >netstat -aon | findstr 11380 TCP 191.127.1.7:57936 29.225.107.216:3734 ESTABLISHED 11380 过滤器: tc ...

  3. 使用 UEditor 编辑器获取数据库中的数据

    在 ThinkPHP 3.2.2 中,使用 UEditor 编辑器获取数据库中保存的数据,可以使用 UEditor 自身提供的方法. 首先在视图模板中实例化编辑器,这是出现编辑器界面的必须的行为: & ...

  4. 随机获取oracle数据库中的任意一行数据(rownum)

    最近看oracle资料的时候,了解rownum的概念,以前只知道对数据库表进行简单的增删改查: 看到了rownum的概念后,突然想到了好多业务场景应该都可以适用的,比如在进行随机发奖的时候, 我们就可 ...

  5. 如何准确高效的获取数据库新插入数据的主键id

    例如我们新建了一张表UserInformation,字段如下Id,为主键,自增,其它字段Name,Pwd,Email 然后我们来执行一个新增插入操作: insert into UserInformat ...

  6. 使用SQL语句从数据库一个表中随机获取数据

    -- 随机获取 10 条数据 SQL Server:SELECT TOP 10 * FROM T_USER ORDER BY NEWID() ORACLE:SELECT * FROM (SELECT ...

  7. TP随机从数据库中获取一条数据

    orderRaw('rand()'): /** * 随机获取一条商品信息 * @param [type] $condition * @param [type] $field * @param [typ ...

  8. MySQL随机获取数据的方法,支持大数据量

    最近做项目,需要做一个从mysql数据库中随机取几条数据出来. 总所周知,order by rand 会死人的..因为本人对大数据量方面的只是了解的很少,无解,去找百度老师..搜索结果千篇一律.特发到 ...

  9. IOS FMDB 获取数据库表和表中的数据

    ios开发中,经常会用到数据库sqlite的知识,除了增,删,改,查之外,我们说说如何获取数据库中有多少表和表相关的内容. 前言 跟数据库使用相关的一般的增删改查的语句,这里就不做解释了.在网上有很多 ...

随机推荐

  1. CPU和线程的关系

    比如,电脑开了两个程序qq和qq音乐,假设这两个程序都只有一个线程.人能够感觉到CPU切换的频率是一秒一次,假设当前cpu计算速度是1秒1次,那么我们就能明显感到卡顿,当聊天,点击发送按钮时候,qq音 ...

  2. spring-boot项目在eclipse中指定配置文件启动

    原文:https://blog.csdn.net/ztx114/article/details/80076339 如下图我的项目有三个配置文件,假如我向指定用application-test.yml启 ...

  3. ArrayList的总结

    1.ArrayList的特点 主要特点:按照插入顺序来保存元素,可以利用下标来查找值 2.ArrayList的优点: 按照下标访问元素最快 3.ArrayList的缺点: 在中间插入元素很慢 删除元素 ...

  4. Netty精粹之JAVA NIO开发需要知道的

    学习Netty框架以及相关源码也有一小段时间了,恰逢今天除夕,写篇文章总结一下.Netty是个高效的JAVA NIO框架,总体框架基于异步非阻塞的设计,基于网络IO事件驱动,主要贡献在于可以让用户基于 ...

  5. yolo源码解析(一)

    原文:https://www.cnblogs.com/zyly/p/9534063.html yolo源码来源于网址:https://github.com/hizhangp/yolo_tensorfl ...

  6. Excel 2016 Power View选项卡不显示的问题

    https://zhuanlan.zhihu.com/p/43543442 PowerView是Excel中的Power系列插件之一,可以基于excel制作交互式仪表板. 初学者在使用Power Vi ...

  7. go语言之进阶篇数组越界导致panic

    1.数组越界导致panic 示例: package main import "fmt" func testa() { fmt.Println("aaaaaaaaaaaaa ...

  8. Sequence在Oracle中的使用

    Oracle中,当需要建立一个自增字段时,需要用到sequence.sequence也可以在mysql中使用,但是有些差别,日后再补充,先把oracle中sequence的基本使用总结一下,方便日后查 ...

  9. IOS中的网络编程详解

    在移动互联网时代,几乎所有应用都需要用到网络,比如QQ.微博.网易新闻.优酷.百度地图,只有通过网络跟外界进行数据交互.数据更新,应用才能保持新鲜.活力,如果没有了网络,也就缺少了数据变化,无论外观多 ...

  10. LigerUi之Grid使用详解(二)——数据编辑

    一.问题概述 在开发web信息管理系统时,使用Web前端框架可以帮助我们快速搭建一组风格统一的界面效果,而且能够解决大多数浏览器兼容问题,提升开发效率.所以上一篇文章为大家介绍了LigerGrid的显 ...