设我当前有这样一个表,包含一个自增长的id列,一个content列保存内容。我想要从这张表中随机选取1条内容,可能还要将type作为过滤条件。
CREATE TABLE `random_select` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`content` varchar(1024) COLLATE utf8mb4_unicode_ci NOT NULL,
`type` varchar(35) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=78 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
以下方法后的时间都为本地mysql的测试平均运行时间,表内包含数据条
最简单粗暴的方法:
但这样的写法不被推荐。 在 ORDER BY 使用 RAND() 函数会导致数据列被多次扫描,导致效率相当低。
SELECT * FROM random_select where type='anytype' ORDER BY RAND() LIMIT 1;
使用join的方法:
SELECT * FROM random_select AS t1 JOIN (
SELECT ROUND(RAND()*(SELECT MAX(id) FROM random_select where type='anytype')
) AS id) AS t2
WHERE t1.id>=t2.id and type='anytype'
ORDER BY t1.id
LIMIT 1;
更优的方法,使用子查询
SELECT * FROM random_select WHERE type='anytype' and id>= (
(SELECT MAX(id) FROM random_select WHERE type='anytype' )
-
(SELECT MIN(id) FROM random_select WHERE type='anytype' )
) * RAND()
+(SELECT MIN(id) FROM random_select WHERE type='anytype' )
LIMIT 1