记录一下MySQL数据库高性能的随机数据查询方式
这里用typecho的表为例子,typecho随机文章需要此方法
第一种,标签式查询
SELECT * FROM typecho_contents WHERE cid >=( SELECT FLOOR( RAND() *( SELECT MAX(cid) FROM typecho_contents )) ) AND TYPE = 'post' AND STATUS = 'publish' ORDER BY cid LIMIT 10;
第二种,JOIN查询
SELECT * FROM typecho_contents, ( SELECT cid AS sid FROM typecho_contents WHERE typecho_contents.type = 'post' AND typecho_contents.status = 'publish' ORDER BY RAND() LIMIT 10) AS tmp WHERE typecho_contents.cid = tmp.sid LIMIT 10;
第三种,标签式+JOIN查询同时使用
SELECT * FROM typecho_contents AS r1 JOIN( SELECT CEIL( RAND() *( SELECT MAX(cid) FROM typecho_contents )) AS id ) AS r2 WHERE r1.cid >= r2.id AND r1.cid <= r2.id+20 AND r1.type = 'post' AND r1.status = 'publish' ORDER BY r1.cid ASC LIMIT 10;
这几种方式个人总结
由于第一种+第三种标签式是先取出随机ID再查询,导致扫描表的范围不固定,查询速度随机.
第二种独立JOIN查询是先取出固定ID,再查询表,查询速率恒定,更优秀.
我又分析了一下,第一种不用创建临时表也许是最快的,即使扫描大多数行仍然很快
我又研究了一下,第三种可以限制扫描行数,也是非常快的
如果理解的不对,请自行修正,本文仅供参考
此处评论已关闭