首页 > 数据库 > mysql教程 > 如何提高 MySQL 对大型数据集的 ORDER BY RAND() 性能?

如何提高 MySQL 对大型数据集的 ORDER BY RAND() 性能?

Mary-Kate Olsen
发布: 2024-12-18 08:11:14
原创
350 人浏览过

How to Improve MySQL's ORDER BY RAND() Performance for Large Datasets?

如何增强 MySQL 的 ORDER BY RAND() 性能

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

该技术在 MyISAM 数据库中非常高效,并且在 InnoDB 中也提供了显着的性能改进。

选择单个随机记录

对于涉及选择单个随机记录的场景,请考虑以下内容查询:

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 值均匀分布。

以上是如何提高 MySQL 对大型数据集的 ORDER BY RAND() 性能?的详细内容。更多信息请关注PHP中文网其他相关文章!

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