下边给出四种方法,由慢到快,方法四最效率。
测试背景:
数据总量41万+
方法一:
这种方法可以一次查询5条,执行速度455.596s
SELECT * FROM `table` ORDER BY RAND() LIMIT 5
方法二:
这种方法如果limit5的话将会是连续的五条,所以这里是limit1,为了实现目的可以执行5次,执行速度214.54s
-
SELECT *
-
FROM `table`
-
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
-
ORDER BY id LIMIT 1;
方法三:
方法二改良版,执行速度0.151s,有没有发现速度飞快,是因为索引问题,虽然两条主要sql最终都是查询了1条记录,但是方法二中的子查询部分索引失效了。
-
SELECT * FROM `table`
-
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
-
ORDER BY id LIMIT 1;
方法四:
可以看到比方法三要快,这么看join要比子查询效率高
-
SELECT *
-
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
-
WHERE t1.id >= t2.id
-
ORDER BY t1.id LIMIT 1;
总结:
从这一个问题就能考察出应聘人员数据库方面的很多知识,所以有实力的面试官所提出的问题还是认真考虑一下,如果能考明白对自己的提升还是有的,最次也能巩固一下自己所学的知识。