求指点带where条件的mysql随机查询n条记录的高效方法

MySql 码拜 8年前 (2016-09-11) 1554次浏览
搜索了mysql随机查询,都是没有带where条件的,直接硬套的话limit获取到的记录个数不确定就需要一个while循环知道获取到需要的记录数,加了while循环的效率当然是很低很低的。也试了从数据库直接拿全部满足where条件的记录,再在java里面随机拿若干个,这也肯定是不合理的,效率跟记录总数有关跟所需记录无关,效率也非常低。求高手指点解决方法
解决方案

15

SELECT * FROM table
WHERE id >= (
(SELECT MAX(id) FROM table WHERE xxx = “xxx”)-
(SELECT MIN(id) FROM table WHERE xxx= “xxx”)
) * RAND() + (SELECT MIN(id) FROM table WHERE xxx= “xxx”)
LIMIT n    满足where条件的随机数 取n条数据  试试题主

10

先看 where 后符合条件的有多少条,然后再讨论。

15

测试表,仅主键

CREATE TABLE `test` (
  `sss` varchar(20) NOT NULL,
  PRIMARY KEY (`sss`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;

生成100W数据

CREATE  PROCEDURE `aa`()
BEGIN
	DECLARE i int;
	DECLARE c int;
	set i = 0;
  set autocommit = 0;
	while i < 1000 do
		set c = 0;
		while c < 1000 do
			insert into test VALUES( LPAD(i*1000+c,10,"0"));
			set c=c+1;
		end while;
		commit;
	  set i=i+1;
	end while;
  set autocommit = 1;
END

查询

select * from test WHERE sss > "0000100023" and sss < "0000200023"  ORDER BY rand() LIMIT 100

耗时0.12S, 服务器是阿里云RDS最低配置。
ORDER BY rand() LIMIT N会慢吗?


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求指点带where条件的mysql随机查询n条记录的高效方法
喜欢 (0)
[1034331897@qq.com]
分享 (0)