mysql随机取数据优化

参考:https://blog.csdn.net/u011870280/article/details/87809570

mysql表中随机取三条数据。

本来是打算用:

`select * from table order by rand() limit 3`


结果40W的表查询要2.6秒,速度贼慢。每条记录都调用了rand()行数来排序

后来发现mysql官方手册也不推荐这种做法,找到下面这种方法:

`

1.  SELECT * FROM table  AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table)) AS id) AS t2 WHERE t1.id >= t2.id
    
2.  ORDER BY t1.id ASC LIMIT 3
    

`


不过这种方式不适用,它需要一个自增注解,而我的表主键是uuid。而且不均匀

后来又在网上找到下面这种方法

`

1.  SELECT * FROM table WHERE id IN 
    
2.  (SELECT id FROM (SELECT id FROM table ORDER BY rand() LIMIT 3) t)
    

`


查询只要0.3秒,效果贼好。原因是因为排序时只把id加载到内存,在sort buffer中排序,没有加载所有字段,减少了磁盘读取。而为什么用两层查询是因为这个:

mysql不支持在in里面放子查询(/ □ \)

posted @ 2022-11-11 16:29  狂客  阅读(72)  评论(0编辑  收藏  举报