首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何通过RAND()函数优化MySQL的顺序?

如何通过RAND()函数优化MySQL的顺序?
EN

Stack Overflow用户
提问于 2009-08-07 12:55:24
回答 9查看 69.3K关注 0票数 91

我想优化我的查询,以便查看mysql-slow.log

我的大多数慢速查询都包含ORDER BY RAND()。我无法找到真正的解决办法来解决这个问题。在MySQLPerformanceBlog有一个可能的解决方案,但我认为这还不够。对于优化不佳(或经常更新,用户管理)的表,它不能工作,或者我需要运行两个或多个查询才能选择我的PHP-generated随机行。

这个问题有什么解决办法吗?

一个虚拟的例子:

代码语言:javascript
运行
复制
SELECT  accomodation.ac_id,
        accomodation.ac_status,
        accomodation.ac_name,
        accomodation.ac_status,
        accomodation.ac_images
FROM    accomodation, accomodation_category
WHERE   accomodation.ac_status != 'draft'
        AND accomodation.ac_category = accomodation_category.acat_id
        AND accomodation_category.acat_slug != 'vendeglatohely'
        AND ac_images != 'b:0;'
ORDER BY
        RAND()
LIMIT 1
EN

Stack Overflow用户

发布于 2009-08-07 21:00:59

我是这样做的:

代码语言:javascript
运行
复制
SET @r := (SELECT ROUND(RAND() * (SELECT COUNT(*)
  FROM    accomodation a
  JOIN    accomodation_category c
    ON (a.ac_category = c.acat_id)
  WHERE   a.ac_status != 'draft'
        AND c.acat_slug != 'vendeglatohely'
        AND a.ac_images != 'b:0;';

SET @sql := CONCAT('
  SELECT  a.ac_id,
        a.ac_status,
        a.ac_name,
        a.ac_status,
        a.ac_images
  FROM    accomodation a
  JOIN    accomodation_category c
    ON (a.ac_category = c.acat_id)
  WHERE   a.ac_status != ''draft''
        AND c.acat_slug != ''vendeglatohely''
        AND a.ac_images != ''b:0;''
  LIMIT ', @r, ', 1');

PREPARE stmt1 FROM @sql;

EXECUTE stmt1;
票数 1
EN
查看全部 9 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1244555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档