最近项目中遇到从论坛随机取出帖子放在首页,其实就是从数据库中随机取出一条记录,很明显,用 order by rand() 肯定不行,效率低的不行,我尝试了下在使用 order by rand()的时候,表中有 25 万条记录,随机读取一条的执行时间大约是 0.55 秒左右。总结一下优化这条 SQL 语句的效率的几种方法。

第一种方法: 结合应用层来实现 只要 SELECT MAX(id) FROM table;取出最大的 id,然后用随机生成一个 1~MAX(id)数,比如 PHP mt_rand(1, MAX(id)) 然后再在用这个随机 id 去查询那条记录。

第二种方法:

利用数据库生成的随机的 id,子查询的方式 SELECT CEIL(RAND() * (SELECT MAX(id) FROM table)); 这样我们就可以获取一个随机的 id.(对 MAX()进行优化,不使用SELECT CEIL(RAND() * MAX(id)) FROM table),执行一下,大大优化了

SELECT *
FROM table
WHERE id >= (
SELECT CEIL( RAND( ) * (
SELECT MAX( id )
FROM table ) ) )
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 ASC
LIMIT 1

这种方法我测试的结果和第二种差不多,但是 google 了一下,有文章里面提到,JOIN 查询的方式比第二中效率还要高一点。

转载请注明: 转载自Ryan 是菜鸟 | LNMP 技术栈笔记

如果觉得本篇文章对您十分有益,何不 打赏一下

谢谢打赏

本文链接地址: MySQL 随机取出记录的优化

知识共享许可协议 本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可