【问题标题】:Order by rand() on a large mysql database在大型 mysql 数据库上按 rand() 排序
【发布时间】:2015-04-11 00:26:28
【问题描述】:

由于这个 mysql 查询,我的网站非常慢。

SELECT content.*,
       (SELECT content_views.views FROM content_views WHERE content_views.content = content.record_num) as views ,
       (SELECT images.filename FROM images WHERE images.record_num = content.thumbnail) AS thumbfile
FROM content WHERE enabled = 1  $filterAnd
ORDER BY RAND()
LIMIT $from,$max_results

我知道最好的方法是这样使用它:

SELECT name
  FROM random AS r1 JOIN
       (SELECT CEIL(RAND() *
                     (SELECT MAX(id)
                        FROM random)) AS id)
        AS r2
 WHERE r1.id >= r2.id
 ORDER BY r1.id ASC
 LIMIT 1

但我正在使用多个 mysql 表,我不知道如何使用我的查询这样的人可以帮助我?

谢谢

编辑:

我试过了:

SELECT content.*,
       (SELECT content_views.views FROM content_views WHERE content_views.content = content.record_num) as views ,
       (SELECT images.filename FROM images WHERE images.record_num = content.thumbnail) AS thumbfile
FROM content AS r1 JOIN
     (SELECT (RAND() * (SELECT MAX(record_num) FROM content)) AS id) AS r2
WHERE r1.id >= r2.id
ORDER BY r1.id ASC
LIMIT 1

但现在我收到错误:未知表“内容”

【问题讨论】:

    标签: php mysql performance random


    【解决方案1】:

    此代码从 content 表中随机选择一行。

    (SELECT 
        *
    FROM
        content AS r1
            JOIN
        (SELECT 
            CEIL(RAND() * (SELECT 
                        MAX(id)
                    FROM
                        content WHERE enabled = 1 $filterAnd)) AS id
        ) AS r2
    WHERE
        r1.id >= r2.id AND r1.enabled=1 AND $filterAnd
    ORDER BY r1.id ASC
    LIMIT 1) randomTable
    

    现在您需要将此查询视为具有名称randomTable 字段的表,如content 表。现在你可以从中选择,加入它,做你需要的一切。注意$filterAnd - 我用了两次。这仅在$filterAnd 包含与content 表相关的条件时才有效。

    【讨论】:

      【解决方案2】:

      您为表content 指定了一个别名r1。然后,您需要使用该别名来引用该特定表:

      SELECT r1.*,
             (SELECT cv.views
              FROM content_views cv
              WHERE cv.content = r1.record_num
             ) as views,
             (SELECT i.filename
              FROM images i
              WHERE i.record_num = r1.thumbnail
             ) AS thumbfile
      FROM content r1 JOIN
           (SELECT RAND() * (SELECT MAX(record_num) FROM content) AS id
           ) r2
      WHERE r1.id >= r2.id
      ORDER BY r1.id ASC
      LIMIT 1
      

      这个版本有许多表的表别名。

      【讨论】:

        【解决方案3】:

        到目前为止,大多数建议都假设AUTO_INCREMENT id 没有漏洞。如果这不适用,请参阅 my blog 了解该解决方案,以及另外 7 个。

        【讨论】:

          猜你喜欢
          • 2016-12-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          • 1970-01-01
          相关资源
          最近更新 更多