从MySQL数据库中随机查询数据[高性能方式]

记录一下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,再查询表,查询速率恒定,更优秀.
我又分析了一下,第一种不用创建临时表也许是最快的,即使扫描大多数行仍然很快
我又研究了一下,第三种可以限制扫描行数,也是非常快的
如果理解的不对,请自行修正,本文仅供参考

此处评论已关闭