Php 结合查询以提高速度

Php 结合查询以提高速度,php,mysql,Php,Mysql,我开始只使用一个查询,但后来我希望一些查询比其他查询显示得更多,所以我最终执行了更多的查询,但这确实减慢了加载时间,有没有一种方法可以在一个查询中完成所有查询,但都使用单独的变量名 $sql23 = "SELECT * FROM monsters WHERE rare='0' AND level<='".$row['level']."' ORDER BY RAND() LIMIT 1;"; $result23 = mysqli_query($link,$sql23) or die(mysq

我开始只使用一个查询,但后来我希望一些查询比其他查询显示得更多,所以我最终执行了更多的查询,但这确实减慢了加载时间,有没有一种方法可以在一个查询中完成所有查询,但都使用单独的变量名

$sql23 = "SELECT * FROM monsters WHERE rare='0' AND level<='".$row['level']."' ORDER BY RAND() LIMIT 1;";
$result23 = mysqli_query($link,$sql23) or die(mysqli_error());
$battle_get23 = mysqli_fetch_array($result23);

$boss = "SELECT * FROM monsters WHERE rare='1' AND level<='".$row['level']."' ORDER BY RAND() LIMIT 1;";
$boss = mysqli_query($link,$boss) or die(mysqli_error());
$boss = mysqli_fetch_array($boss);

$rare1 = "SELECT * FROM monsters WHERE rare='2' AND level<='".$row['level']."' ORDER BY RAND() LIMIT 1;";
$rare1 = mysqli_query($link,$rare1) or die(mysqli_error());
$rare1 = mysqli_fetch_array($rare1);

$rare2 = "SELECT * FROM monsters WHERE rare='3' AND level<='".$row['level']."' ORDER BY RAND() LIMIT 1;";
$rare2 = mysqli_query($link,$rare2) or die(mysqli_error());
$rare2 = mysqli_fetch_array($rare2);

$rare3 = "SELECT * FROM monsters WHERE rare='4' AND level<='".$row['level']."' ORDER BY RAND() LIMIT 1;";
$rare3 = mysqli_query($link,$rare3) or die(mysqli_error());
$rare3 = mysqli_fetch_array($rare3);

$rare4 = "SELECT * FROM monsters WHERE rare='5' AND level<='".$row['level']."' ORDER BY RAND() LIMIT 1;";
$rare4 = mysqli_query($link,$rare4) or die(mysqli_error());
$rare4 = mysqli_fetch_array($rare4);

$rare5 = "SELECT * FROM monsters WHERE rare='6' AND level<='".$row['level']."' ORDER BY RAND() LIMIT 1;";
$rare5 = mysqli_query($link,$rare5) or die(mysqli_error());
$rare5 = mysqli_fetch_array($rare5);

$rare6 = "SELECT * FROM monsters WHERE rare='7' AND level<='".$row['level']."' ORDER BY RAND() LIMIT 1;";
$rare6 = mysqli_query($link,$rare6) or die(mysqli_error());
$rare6 = mysqli_fetch_array($rare6);

$rare7 = "SELECT * FROM monsters WHERE rare='8' AND level<='".$row['level']."' ORDER BY RAND() LIMIT 1;";
$rare7 = mysqli_query($link,$rare7) or die(mysqli_error());
$rare7 = mysqli_fetch_array($rare7);

$rare8 = "SELECT * FROM monsters WHERE rare='9' AND level<='".$row['level']."' ORDER BY RAND() LIMIT 1;";
$rare8 = mysqli_query($link,$rare8) or die(mysqli_error());
$rare8 = mysqli_fetch_array($rare8);

$rare9 = "SELECT * FROM monsters WHERE rare='10' AND level<='".$row['level']."' ORDER BY RAND() LIMIT 1;";
$rare9 = mysqli_query($link,$rare9) or die(mysqli_error());
$rare9 = mysqli_fetch_array($rare9);

$sql23=“先从稀有的怪物那里选择*”和等级。你选错了树。
将大量缓慢的查询组合在一个查询中并不会使它们变快。运行查询的开销并不像大多数php用户认为的那么重要。如果查询本身是快速的,无论调用多少次(当然是在合理的数量范围内)。如果查询是缓慢的,组合都不会有帮助

您必须注意查询本身,而不是试图将它们组合起来。因此,要解决您的问题,您必须提供更多信息:

  • 某些数字中定义“真慢”。用于一个查询中的所有查询和每个查询
  • 提供数据库模式和数据量
  • 提供与
    EXPLAIN
    关键字相关的查询运行结果

  • 你可以给你的怪物一个随机数,一天一次或一小时一次,所以

    更新怪物集sortorder=rand()

    在关键排序器上建立索引可能会有所帮助

    然后,您可以在php中为每次读取计算一个随机数:

    $rand=mt_rand(0,1);//或调用mt_rand()的方式

    然后您可以选择:

    $sql23 = "SELECT * FROM monsters WHERE rare='0' AND level<='".intval($row['level'])."' ORDER BY (sortorder-$rand) DESC LIMIT 1;";
    $result23 = mysqli_query($link,$sql23) or die(mysqli_error());
    $battle_get23 = mysqli_fetch_array($result23);
    
    把你的珍品放在那里:

    INSERT INTO raretype (id, name) values (0, 'battle_get23'),(1,'boss'),(2,'rare1'),...
    
    为您的阅读创建一个随机排序器:

    DROP TEMPORARY TABLE IF EXISTS tmp_rare_sort;
    CREATE TEMPORARY TABLE tmp_rare_sort (raretype int(11) not null primary key, sortorder float);
    INSERT INTO tmp_rare_sort SELECT id, rand() from raretype;
    
    读出来:

    SELECT rt.name as type, m.*
    FROM raretype rt
    INNER JOIN tmp_rare_sort rts on rts.raretype = rt.id
    LEFT JOIN monsters m on m.id = 
     ( select id from monsters imo where imo.rare = rt.id 
       and imo.level <= {intval($level)} 
       order by abs(sortorder - rts.sortorder) desc 
       limit 1
     )
    
    因此$allMonsters['boss']会给boss一个额外的字段'type',这应该不会造成伤害

    如果您确实希望它作为单个变量,可以
    extract()
    此数组

    希望有帮助! 如果有语法错误,请创建一个SQL FIDLE,我会检查。只是没有时间自己创建表。;-

    1)按兰德()取出所有订单,并限制1

    2) 查询后进行随机化

    $bossSql = "SELECT * FROM monsters WHERE rare='1' AND level<='".$row['level']."' ";
    $bossRs = mysqli_query($link,$bossSql) or die(mysqli_error());
    $bossArray = mysqli_fetch_array($bossRs);
    //just saw you had limit in your sql, edited
    //shuffle($bossArray);
    $randomBosskey = array_rand($bossArray);
    $randomBoss = $bossArray[$randomBossKey];
    

    将其保存在一个变量中,然后在每次需要怪物时根据稀有度和级别从同一变量中选择随机怪物?但此方法会占用未知的内存量,具体取决于您的表大小,并且可能比原始方法快/慢,具体取决于“随机怪物”的数量“您在程序中实际使用的查询。这也可能取决于您机器的“功率”,假设您的数据库和服务器不在同一台机器上,并且这两台机器的处理能力有显著差异。

    ORDER BY RAND()
    已知性能较差。检查。我还可以使用什么?另外,您的查询很容易受到攻击。请使用而不是直接将输入值连接到查询中。使用UNION会增加一些speed@Sakai你在我的第一条评论中看到链接了吗?读这篇文章。我刚从兰德公司拿了所有的订单,现在真的很快。有没有什么方法可以让我在查询后以更快的方式将它们随机化?这个问题很难回答。这里有一些技巧。但如果您提供所需的信息,这将非常有帮助。这是我能想象的唯一比原始答案慢得多的解决方案。如果
    orderbyrand()
    的速度很慢,那就意味着有很多不同的怪物。这意味着对于您的解决方案,所有这些都将被传输到php,并存储在一个数组中。我希望对于大量的怪物来说,这个解决方案会慢30-80倍。有趣的是,我从来没有这样想过。我会保留我现在所拥有的,这样OP可以选择最适合他的,但我会更深入地研究,看看我是否能找到任何反驳/改进我的答案。谢谢
    $allMonsters = array();
    while($line = $rs->next()){
        $allMonsters[$line['type']] = $line;
    }
    
    $bossSql = "SELECT * FROM monsters WHERE rare='1' AND level<='".$row['level']."' ";
    $bossRs = mysqli_query($link,$bossSql) or die(mysqli_error());
    $bossArray = mysqli_fetch_array($bossRs);
    //just saw you had limit in your sql, edited
    //shuffle($bossArray);
    $randomBosskey = array_rand($bossArray);
    $randomBoss = $bossArray[$randomBossKey];
    
    SELECT * FROM monsters