加入收藏 | 设为首页 | 会员中心 | 我要投稿 甘孜站长网 (https://www.0836zz.com.cn/)- 运维、物联设备、数据计算、智能推荐、云管理!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

MySQL中从表中取出随机数据性能优化

发布时间:2022-07-04 10:37:14 所属栏目:MySql教程 来源:互联网
导读:在mysql中随机读取数据的方法可能大家最简单且常用的做是rand() 这个函数,但是如果上千万数据就有问题了,下面我来介绍. 最简的办法 rand() 函数实例,代码如下: SELECT * FROM table_name ORDER BY rand() LIMIT 5; 花时间为 0.7888. 如果这样在数据量大时就
  在mysql中随机读取数据的方法可能大家最简单且常用的做是rand() 这个函数,但是如果上千万数据就有问题了,下面我来介绍.
 
  最简的办法
 
  rand() 函数实例,代码如下:
 
  SELECT * FROM table_name ORDER BY rand() LIMIT 5;
 
  花时间为 0.7888.
 
  如果这样在数据量大时就挂了,后来找到一个办法,代码如下:
 
  SELECT * FROM table_name AS r1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM table_name)) AS id) AS
   
  r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT 5;
   
  --花时间0.02 sec
  上面的语句采用的是JOIN,mysql的论坛上有人使用,代码如下:
 
  SELECT *  
  FROM `table`  
  WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )  
  ORDER BY id LIMIT 1;
  我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距,总觉有什么地方不正常,于是我把语句改写了一下,代码如下:
 
  SELECT * FROM `table`  
  WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))   
  ORDER BY id LIMIT 1;
  这下,效率又提高了,查询时间只有0.01秒.
 
  最后,再把语句完善一下,加上MIN(id)的判断,我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行.
 
  完整查询语句是,代码如下:
 
  SELECT * FROM `table`  
  WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) +
   
  (SELECT MIN(id) FROM `table`)))  ORDER BY id LIMIT 1;
  --phpfensi.com
   
  SELECT *  
  FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM
   
  `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2  
  WHERE t1.id >= t2.id  
  ORDER BY t1.id LIMIT 1;
  最后在php中对这两个语句进行分别查询10次,前者花费时间 0.147433 秒,后者花费时间 0.015130 秒

(编辑:甘孜站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读