【问题标题】:Generate random MySQL rows quickly and run same sql query multiple times快速生成随机 MySQL 行并多次运行相同的 sql 查询
【发布时间】:2017-02-17 18:11:58
【问题描述】:

我找到了一个快速生成随机行的示例: MySQL select 10 random rows from 600K rows fast

现在我想运行该查询 10 次,但我得到完全相同的输出而不是不同的行。任何想法如何解决这个问题:

这是我的代码:

<?php
    for ($e = 0; $e <= 14; $e++) {
         $sql_users = "SELECT user_name, user_age, country, age_from, age_to, gender, profile_image, gender_search, kind_of_relationship
                          FROM users AS r1 JOIN
                               (SELECT CEIL(RAND() *
                                             (SELECT MAX(id)
                                                FROM users)) AS id)
                                AS r2
                         WHERE r1.id >= r2.id
                         ORDER BY r1.id ASC
                         LIMIT 1";
         $statement6 = $dbConn->prepare($sql_users);
         $statement6->execute();
         more = $statement6->fetch(PDO::FETCH_BOTH);
?>

    <?php echo $more['user_name'];?>

<?php } ?>

【问题讨论】:

    标签: php mysql sql random


    【解决方案1】:

    如果要十行,性能有多差:

    select u.*
    from users u
    order by rand()
    limit 10;
    

    这确实可以满足您的需求。而且,在单个查询中获取所有行可以节省运行多个查询的大量开销。所以,尽管order by rand(),它可能比你的方法更快。但是,这取决于用户数量。

    你也可以这样做:

    select u.*
    from users u cross join
         (select count(*) as cnt from users u) x
    where rand() < (10*5 / cnt)
    order by rand()
    limit 10;
    

    where 子句随机选择大约 50 行——给予或接受。但如果置信度高,至少会有10个。这个数字排序很快,你可以随机选择其中的10个。

    【讨论】:

    • 您的第一个查询耗时:0.2934 秒。第二个查询耗时:0.0532 秒。如果我只正确编写了我写的查询,但我需要运行 10 次,则需要 1 次:0.0009 秒。问题是我需要随时运行这个 maaaaaaa,我真的不想让我的数据库超载。
    • @Mensur 。 . .但是第一个查询是单个查询,随着返回的数量增加,基本上不会花费更长的时间。
    • 我担心的是,当我在页面上生成的 sitemap.xml 显示表 10K+ 中的所有用户时,您可以单击该用户并查看有关该用户的更多信息,而且何时查看该页面上的用户页面 10 其他用户将再次随机生成。所以我的问题是,生成 sitemap.xml 文件会使网站过载吗?
    • @Mensur 。 . .在页面上显示数据后,您不应该再次“随机生成”相同的数据。也许我误解了评论。
    猜你喜欢
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-27
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多