首页 > 数据库 > mysql教程 > 如何优化 MySQL 的 ORDER BY RAND() 函数以加快随机行选择速度?

如何优化 MySQL 的 ORDER BY RAND() 函数以加快随机行选择速度?

Linda Hamilton
发布: 2024-12-19 22:40:15
原创
584 人浏览过

How Can I Optimize MySQL's ORDER BY RAND() Function for Faster Random Row Selection?

优化 MySQL 的 ORDER BY RAND() 函数以加快随机行选择

MySQL 的 ORDER BY RAND() 函数广泛用于选择随机行表中的行。但是,它可能效率低下,特别是对于大型表或频繁更新。这种低效率在慢速查询日志中很明显,其中包含 ORDER BY RAND() 的查询会显着降低速度。

一种潜在的解决方案是 MySQLPerformanceBlog 的方法,该方法涉及将查询拆分为多个子查询。然而,这种技术可能并不适合所有情况。

替代方法

下面显示了一种可提高效率的替代方法:

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
登录后复制

该方法通过计算基于两个变量选择的每一行的运行概率来进行操作。通过使用 STRAIGHT_JOIN,结果中的行顺序被保留,有效地提供了随机选择。

特定情况:选择单个随机记录

如果要求是要选择单个随机记录,可以使用以下查询:

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
        )
        )
登录后复制

此查询假设均匀分布ac_id 值。

通过采用这些替代方法,您可以显着提高涉及 ORDER BY RAND() 函数的 MySQL 查询的性能。

以上是如何优化 MySQL 的 ORDER BY RAND() 函数以加快随机行选择速度?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板