找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 235|回复: 1

[mysql] Mysql 随机查询10条数据效率最快的查询方法:三种方法对比[归档]

  [复制链接]
发表于 2023-2-28 14:32 | 显示全部楼层 |阅读模式
1)使用join 和 rand() 耗时 0.009
SELECT * FROM `t_topic` AS t1 JOIN ( 
      SELECT
        ROUND( RAND() * (
                (SELECT MAX(id) FROM `t_topic`) - (SELECT MIN(id) FROM `t_topic`)
            ) + (SELECT MIN(id) FROM `t_topic`)
        ) AS id
) AS t2 WHERE
    t1.id >= t2.idORDER BY t1.id
LIMIT 10;

 

2) 下面这条比上面那个还要慢几秒
SELECT * FROM `t_topic` 
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `t_topic`)-(SELECT MIN(id) FROM `t_topic`)) + (SELECT MIN(id) FROM `t_topic`)))  
ORDER BY id LIMIT 10;

 

3)或者使用下面这个也可以测试也是 耗时0.0012
SELECT * FROM
    `t_topic` WHERE
    id >= ( 
           SELECT floor(RAND() * (SELECT MAX(id) FROM `t_topic`) )
    ) ORDER BY id
LIMIT 10;

 

 楼主| 发表于 2023-2-28 14:38 | 显示全部楼层
实例:mysql从600万数据中随机取10条数据
 

通常数据量少的时候我们会这样写:

SELECT * FROM _article ORDER BY RAND() LIMIT 10

在1千条数据内,效果还行,但是,随着数据量慢慢增多,上了5万条数据的时候,上面的写法会导致数据库性能急剧下降。

现在数据量为:

我们来看下上面的随机取数据所消耗的时间:

我的天呐,这样取数据,数据库会让你给搞爆的。

我们来看下大牛怎样写:

SELECT * FROM _article AS r1 JOIN
 (SELECT CEIL(RAND() * (SELECT MAX(article_id) FROM  _article)) AS article_id) AS r2
 WHERE r1.article_id >= r2.article_id
 ORDER BY r1.article_id ASC
 LIMIT 10

 

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|学习笔记

GMT+8, 2024-5-3 19:40 , Processed in 0.031349 second(s), 14 queries , APCu On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表