首页 >数据库 >mysql教程 >如何优化 MySQL 的 ORDER BY RAND() 以获得更好的性能?

如何优化 MySQL 的 ORDER BY RAND() 以获得更好的性能?

Barbara Streisand
Barbara Streisand原创
2024-12-15 22:28:11388浏览

How Can I Optimize MySQL's ORDER BY RAND() for Better Performance?

优化 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

此方法对于 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 值的分布相对均匀。通过利用这些技术,您可以显着优化涉及 ORDER BY RAND() 的 MySQL 查询。

以上是如何优化 MySQL 的 ORDER BY RAND() 以获得更好的性能?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn