| [yejr@imysql]> select id from t_innodb_random t1 join (select rand() * (select max(id) from t_innodb_random) as nid) t2 on t1.id > t2.nid limit 1000G 1000 rows in set (0.00 sec) |
可以看到,全索引检索,发现符合记录的条件后,直接取得1000行,这个方法是最快的。
综上,想从MySQL数据库中随机取一条或者N条记录时,最好把RAND()生成随机数放在JOIN子查询中以提高效率。
上面说了那么多的废话,最后简单说下,就是把下面这个SQL:
| SELECT id FROM table ORDER BY RAND() LIMIT n; |
改造成下面这个:
| SELECT id FROM table t1 JOIN (SELECT RAND() * (SELECT MAX(id) FROM table) AS nid) t2 ON t1.id > t2.nid LIMIT n; |
如果想要达到完全随机,还可以改成下面这种写法:
| SELECT id FROM table t1 JOIN (SELECT round(RAND() * (SELECT MAX(id) FROM table)) AS nid FROM table LIMIT n) t2 ON t1.id = t2.nid; |
就可以享受在SQL中直接取得随机数了,不用再在程序中构造一串随机数去检索了。










