千家信息网

MySQL随机选取资源--优化

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,接前文:http://blog.itpub.net/29254281/viewspace-2120294/前文中,Order by rand()在数据量大的时候,会有一些性能问题.set autoco
千家信息网最后更新 2025年11月07日MySQL随机选取资源--优化接前文:
http://blog.itpub.net/29254281/viewspace-2120294/

前文中,Order by rand()在数据量大的时候,会有一些性能问题.

  1. set autocommit=false;
  2. set @roomid:=-1;
  3. select
  4. min(roomid) into @roomid
  5. from
  6. room_info
  7. where
  8. roomid >
  9. (
  10. select
  11. floor(max(roomid) * rand() + 1)
  12. from
  13. room_info
  14. )
  15. and state = 1;
  16. update room_info
  17. set
  18. state = 2
  19. where
  20. roomid =@roomid
  21. and state = 1;
  22. select @roomid;
  23. commit;

优化的方式就是从最大的ID,随机选取一个值。
这样避免了排序.
但是应用程序还是需要判断,Update的影响行数是否为0.如果为0,则需要再次调用.

大招版本:
  1. set autocommit=false;
  2. set @roomid:=-1;
  3. select max(roomid) into @roomid from room_info;
  4. set @roomid:=floor(rand()*@roomid+1);
  5. update room_info
  6. set
  7. state = 2
  8. where
  9. roomid =
  10. coalesce
  11. (
  12. (select roomid from (select min(roomid) roomid from room_info where state=1 and roomid > @roomid) a),
  13. (select roomid from (select max(roomid) roomid from room_info where state=1 and roomid < @roomid) b)
  14. )
  15. and state = 1 and @roomid:=roomid;
  16. select @roomid;
  17. commit;

0