MySQl千万数据中高效率随机取数据
从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次的平均效率:
花费时间 9.151 秒
花费时间 0.005 秒
花费时间 0.013 秒
花费时间 0.005 秒
有可能是数据量太小的原因,后3条查询的速率差异不太明显,理论上应该是逐条增强的!!
写于2018年04月22日,由 archive.org 找回