从MySQl数据库中随机获取10条数据很简单:

SELECT * FROM db_contents ORDER BY RAND() LIMIT 10

但是如果一个表的数据基数很大,从百万级、千万级数据中随机产生10条数据,如果还用 rand() 那就会相当的慢,再考虑到并发。建议轻易不要用rand(),测试从100万数据里随机获取10条数据,用时9s左右,这个耗费是很惊人的。

获取MySQl的MAX(id)和MIN(id)消耗几乎是0,测试在116万数据的基数下,我们利用MAX(id):

SELECT * FROM db_contents WHERE cid >= ( SELECT FLOOR( RAND() * ( SELECT MAX( cid ) FROM db_contents ) ) ) ORDER BY cid LIMIT 10;

这样,随机产生10条数据仅消耗0.005s。然后,把SQL完善一下,加上MIN(cid):

SELECT * FROM db_contents WHERE cid >= (SELECT FLOOR( RAND() * ((SELECT MAX(cid) FROM  db_contents)-(SELECT MIN(cid) FROM db_contents)) + (SELECT MIN(cid) FROM db_contents))) ORDER BY cid LIMIT 10;

再把SQL改成JOIN语法:

SELECT * FROM  db_contents AS c1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(cid) FROM  db_contents)-(SELECT MIN(cid) FROM db_contents))+(SELECT MIN(cid) FROM db_contents)) AS cid) AS c2 WHERE c1.cid >= c2.cid ORDER BY c1.cid LIMIT 10;

最后,对这4个语句分别进行查询,查询10次的平均效率:

  1. 花费时间 9.151 秒

  2. 花费时间 0.005 秒

  3. 花费时间 0.013 秒

  4. 花费时间 0.005 秒

有可能是数据量太小的原因,后3条查询的速率差异不太明显,理论上应该是逐条增强的!!

写于2018年04月22日,由 archive.org 找回

标签: SQL优化

添加新评论