请选择 进入手机版 | 继续访问电脑版

爱分享吧

 找回密码
 立即注册11
搜索
热搜: 活动 交友 discuz
查看: 1371|回复: 0

select里用rand(),怎么优化效率?

[复制链接]

75

主题

75

帖子

1262

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1262
发表于 2019-10-31 22:50:24 | 显示全部楼层 |阅读模式


案例:
select id from t1 where id = round(rand()*13241324);
其中id列是IINT类型的主键

一、问题点
该SQL的问题点主要在于当使用rand()匹配时,实际上是逐行提取数据,rand()每次生成一个随机数进行单行匹配,即如果t1表有100万数据就会匹配100万次,即便有索引也没用,也要全表扫描

二、优化方式
优化方式主要有2种思路,第一种是通过子查询关联,第二种是通过范围查询加limit 1,如下所示:
1、select id from t1 join (select round(rand()*13241324) as id2) as t2 where t1.id = t2.id2

2、select id from t1 where id > (select round(rand()*(select max(id) from t1)) as nid) limit 1

再次提醒,不要用rand()直接进行匹配或者排序,会引发性能灾难


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册11

本版积分规则

Archiver|手机版|小黑屋|爱分享吧

GMT+8, 2021-12-3 23:26 , Processed in 0.052149 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表