oracle多条数据合并成一条_MySql 100万级别数据中随机获取一条或多条记录之RAND()优化

1b6d3bb2350eb3fc78396be1d723a2a4.png

处理业务中,有这样的需求,例如:有100W甚至更多的用户,此时我们要随机一条男性或者女性用户出来做数据操作。基于这个需求,我们做一下实验。

准备一张用户表,结构如下

732836e2f64930c90f1941ed264e0d59.png

简单写个MySQL储存

010cf6aa419d8e5939a3963e4410729a.png

具体步骤:

b122b4e26355caa835b4bc38da1b373b.png

查看下自己的储存

882ed3b2c83c89b38e5421859057dc34.png

原始简单粗暴的 SQL 语句 select * from user order by RAND() LIMIT 1; (切勿使用)

035993c6a147b5bb252f6893889b8851.png
mysql> select * from user order by RAND() LIMIT 1;+--------+----------------------------------+------+--------+-------------+| uid    | name                             | age  | gender | create_time |+--------+----------------------------------+------+--------+-------------+| 318393 | 48f8b305de34c87af8143fe1f24732ad |   24 |      0 |        2017 |+--------+----------------------------------+------+--------+-------------+1 row in set (17.19 sec)mysql>

简单分析下:

813d0590ba106a175b9a2539fe0e5c72.png

type => all 呵呵,全表扫描 1000340 条数据

key => null 且没有索引,我们是随机查询

MySql 手册专门有提醒在 Order by 后面不能使用 RAND() 函数,会导致全表扫描

简单优化 SQL 语句, 使用join

d08ce6e4ac9b714cdb074f6c1440bbcb.png

以上测试发现快了不少,来分析下这个SQL语句,该SQL 语句的核心 Join和随机,随机的基本公式: RAND()*(max-min)+mix,随机出一个 uid as u2 然后 条件查询,uid 自建索引,效率蛮高的。

如果想随机多条呢?修改LIMIT?来看看

b17e9f7f942b675e2f3dd2063817a1ee.png

如果使用以上的SQL语句,发现查询到的数据是连续的,我们要的是随机的,不难理解 LIMIT 5 得到当前查询条件的前五条,所以是相对连续的,uid 是自增的,因为用的是储存插入的,实际项目也是相对连续的。这条SQL 一次性查询无法达到我们的需求,则可分别一条条查询,如果要求的随机条数较多,那就不建议使用该条SQL语句了。

再来一条SQL语句

7e8e22c33e91fe11a5011323f34db552.png

explain 下

2be4eb4f2d90b6c19a3a370478054e91.png

看看随机多条

98248f10198c0128e8d7b5dc8848ee5a.png

随机多条也是完美的,随机核心就是用 RAND() 随机出一个用户uid,或则随机区间,然后再进行limit 即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值