您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

我如何优化MySQL的ORDER BY RAND()函数?

我如何优化MySQL的ORDER BY RAND()函数?

尝试这个:

SELECT  *
FROM    (
        SELECT  @cnt := COUNT(*) + 1,
                @lim := 10
        FROM    t_random
        ) vars
STRAIGHT_JOIN
        (
        SELECT  r.*,
                @lim := @lim - 1
        FROM    t_random r
        WHERE   (@cnt := @cnt - 1)
                AND RAND(20090301) < @lim / @cnt
        ) i
@H_502_4@

MyISAM@H_502_4@(由于COUNT(*)@H_502_4@是即时的),此方法特别有效,但即使这样,InnoDB@H_502_4@其10@H_502_4@效率也比更高ORDER BY RAND()@H_502_4@。

这里的主要思想是我们不进行排序,而是保留两个变量并计算running probability@H_502_4@要在当前步骤中选择的行的。

有关更多详细信息,请参见我的博客中的这篇文章

如果您只需要选择一条随机记录,请尝试以下操作:

SELECT  aco.*
FROM    (
        SELECT  minid + FLOOR((maxid - minid) * RAND()) AS randid
        FROM    (
                SELECT  MAX(ac_id) AS maxid, MIN(ac_id) AS minid
                FROM    accomodation
                ) q
        ) q2
JOIN    accomodation aco
ON      aco.ac_id =
        COALESCE
        (
        (
        SELECT  accomodation.ac_id
        FROM    accomodation
        WHERE   ac_id > randid
                AND ac_status != 'draft'
                AND ac_images != 'b:0;'
                AND NOT EXISTS
                (
                SELECT  NULL
                FROM    accomodation_category
                WHERE   acat_id = ac_category
                        AND acat_slug = 'vendeglatohely'
                )
        ORDER BY
                ac_id
        LIMIT   1
        ),
        (
        SELECT  accomodation.ac_id
        FROM    accomodation
        WHERE   ac_status != 'draft'
                AND ac_images != 'b:0;'
                AND NOT EXISTS
                (
                SELECT  NULL
                FROM    accomodation_category
                WHERE   acat_id = ac_category
                        AND acat_slug = 'vendeglatohely'
                )
        ORDER BY
                ac_id
        LIMIT   1
        )
        )
@H_502_4@

假设您ac_id@H_502_4@的或多或少均匀分布。

MySQL 2022/1/1 18:20:41 有539人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶