Php 优化几个MySQL(子)查询

Php 优化几个MySQL(子)查询,php,mysql,sql,Php,Mysql,Sql,我遇到了一些大问题,无法找到让我的用户玩一张大桌子的最佳方法: 该功能是这样工作的:人们可以玩两种不同的游戏,并以此赚取游戏费。此外,他们还推荐了用户,并从中获得余额。我当前的查询将花费很长时间,如下所示: $sql = $mysqli->query("SELECT n.id, n.account, n.email, n.lastpayout, n.referupnumber, (SELECT sum(r.win) FROM rolls r WHERE r.konto

我遇到了一些大问题,无法找到让我的用户玩一张大桌子的最佳方法:

该功能是这样工作的:人们可以玩两种不同的游戏,并以此赚取游戏费。此外,他们还推荐了用户,并从中获得余额。我当前的查询将花费很长时间,如下所示:

$sql = $mysqli->query("SELECT 
    n.id, n.account, n.email, n.lastpayout, n.referupnumber, 
    (SELECT sum(r.win) FROM rolls r WHERE r.konto = n.id AND r.zeit > n.lastpayout) as sumroll,
    (SELECT sum(m.gewinn) FROM multi m WHERE m.account = n.id AND m.zeit > n.lastpayout) as summulti,
    (SELECT count(nx.referupnumber) FROM nxt_account nx WHERE nx.referupnumber = n.id) as amountref
FROM
    nxt_account n");

$amountuser = $sql->num_rows;
$c = 1;  
while($row = $sql->fetch_array()) {

    $id_thistime = $row['id'];
    $sql_ref = $mysqli->query("SELECT 
    nn.id,
    (SELECT 
            sum(rr.win)
        FROM
            rolls rr
        WHERE
            rr.zeit >= nn.lastpayout AND rr.konto = n.id) as refamount
FROM
    nxt_account nn
WHERE
    nn.referupnumber = '".$id_thistime."'");
    $total_ref = 0;

while($row_ref = $sql_ref->fetch_array()) {

    $total_ref = $total_ref + $row_ref['refamount'];

}

$total_amount = $row['sumroll'] + $row['summulti'] + $total_ref;   }
以下是查询:

SELECT n.id, n.account, n.email, n.lastpayout, n.referupnumber, 
       (SELECT sum(r.win) FROM rolls r WHERE r.konto = n.id AND r.zeit > n.lastpayout) as sumroll,
       (SELECT sum(m.gewinn) FROM multi m WHERE m.account = n.id AND m.zeit > n.lastpayout) as summulti,
       (SELECT count(nx.referupnumber) FROM nxt_account nx WHERE nx.referupnumber = n.id) as amountref
FROM nxt_account n;
您将从多个表中引入数据,因此这是一个合理的结构。我建议采用以下指标:

rolls(konto, zeit, win)
multi(account, zeit, gewinn)
nxt_account(referupnumber)
这将加快子查询并提高性能。

这是查询:

SELECT n.id, n.account, n.email, n.lastpayout, n.referupnumber, 
       (SELECT sum(r.win) FROM rolls r WHERE r.konto = n.id AND r.zeit > n.lastpayout) as sumroll,
       (SELECT sum(m.gewinn) FROM multi m WHERE m.account = n.id AND m.zeit > n.lastpayout) as summulti,
       (SELECT count(nx.referupnumber) FROM nxt_account nx WHERE nx.referupnumber = n.id) as amountref
FROM nxt_account n;
您将从多个表中引入数据,因此这是一个合理的结构。我建议采用以下指标:

rolls(konto, zeit, win)
multi(account, zeit, gewinn)
nxt_account(referupnumber)
这将加快子查询并提高性能。

这是查询:

SELECT n.id, n.account, n.email, n.lastpayout, n.referupnumber, 
       (SELECT sum(r.win) FROM rolls r WHERE r.konto = n.id AND r.zeit > n.lastpayout) as sumroll,
       (SELECT sum(m.gewinn) FROM multi m WHERE m.account = n.id AND m.zeit > n.lastpayout) as summulti,
       (SELECT count(nx.referupnumber) FROM nxt_account nx WHERE nx.referupnumber = n.id) as amountref
FROM nxt_account n;
您将从多个表中引入数据,因此这是一个合理的结构。我建议采用以下指标:

rolls(konto, zeit, win)
multi(account, zeit, gewinn)
nxt_account(referupnumber)
这将加快子查询并提高性能。

这是查询:

SELECT n.id, n.account, n.email, n.lastpayout, n.referupnumber, 
       (SELECT sum(r.win) FROM rolls r WHERE r.konto = n.id AND r.zeit > n.lastpayout) as sumroll,
       (SELECT sum(m.gewinn) FROM multi m WHERE m.account = n.id AND m.zeit > n.lastpayout) as summulti,
       (SELECT count(nx.referupnumber) FROM nxt_account nx WHERE nx.referupnumber = n.id) as amountref
FROM nxt_account n;
您将从多个表中引入数据,因此这是一个合理的结构。我建议采用以下指标:

rolls(konto, zeit, win)
multi(account, zeit, gewinn)
nxt_account(referupnumber)

这将加快子查询并提高性能。

我建议您将主查询更改为此,并从一个数据库请求进行所有计算:

    SELECT 
        n.id, n.account, n.email, n.lastpayout, n.referupnumber, 
        (SELECT sum(r.win) 
         FROM rolls r 
         WHERE r.konto = n.id AND r.zeit > n.lastpayout) as sumroll,
        (SELECT sum(m.gewinn) 
         FROM multi m 
         WHERE m.account = n.id AND m.zeit > n.lastpayout) as summulti,
        (SELECT count(nx.referupnumber) 
         FROM nxt_account nx 
         WHERE nx.referupnumber = n.id) as amountref,
        (SELECT sum(rr.win)
         FROM  rolls rr INNER JOIN nxt_account nn ON
            rr.zeit >= nn.lastpayout AND rr.konto = n.id
         WHERE nn.referupnumber =n.id) as refamount
    FROM
        nxt_account n
按照这样做的方式,
nxt\u账户
表中的记录与您的请求数量相同。这可能是计算速度慢的主要原因


如果您只需要所有帐户的一个总数,您也应该使用SQL进行计算。

我建议您将主查询更改为此,并从一个数据库请求进行所有计算:

    SELECT 
        n.id, n.account, n.email, n.lastpayout, n.referupnumber, 
        (SELECT sum(r.win) 
         FROM rolls r 
         WHERE r.konto = n.id AND r.zeit > n.lastpayout) as sumroll,
        (SELECT sum(m.gewinn) 
         FROM multi m 
         WHERE m.account = n.id AND m.zeit > n.lastpayout) as summulti,
        (SELECT count(nx.referupnumber) 
         FROM nxt_account nx 
         WHERE nx.referupnumber = n.id) as amountref,
        (SELECT sum(rr.win)
         FROM  rolls rr INNER JOIN nxt_account nn ON
            rr.zeit >= nn.lastpayout AND rr.konto = n.id
         WHERE nn.referupnumber =n.id) as refamount
    FROM
        nxt_account n
按照这样做的方式,
nxt\u账户
表中的记录与您的请求数量相同。这可能是计算速度慢的主要原因


如果您只需要所有帐户的一个总数,您也应该使用SQL进行计算。

我建议您将主查询更改为此,并从一个数据库请求进行所有计算:

    SELECT 
        n.id, n.account, n.email, n.lastpayout, n.referupnumber, 
        (SELECT sum(r.win) 
         FROM rolls r 
         WHERE r.konto = n.id AND r.zeit > n.lastpayout) as sumroll,
        (SELECT sum(m.gewinn) 
         FROM multi m 
         WHERE m.account = n.id AND m.zeit > n.lastpayout) as summulti,
        (SELECT count(nx.referupnumber) 
         FROM nxt_account nx 
         WHERE nx.referupnumber = n.id) as amountref,
        (SELECT sum(rr.win)
         FROM  rolls rr INNER JOIN nxt_account nn ON
            rr.zeit >= nn.lastpayout AND rr.konto = n.id
         WHERE nn.referupnumber =n.id) as refamount
    FROM
        nxt_account n
按照这样做的方式,
nxt\u账户
表中的记录与您的请求数量相同。这可能是计算速度慢的主要原因


如果您只需要所有帐户的一个总数,您也应该使用SQL进行计算。

我建议您将主查询更改为此,并从一个数据库请求进行所有计算:

    SELECT 
        n.id, n.account, n.email, n.lastpayout, n.referupnumber, 
        (SELECT sum(r.win) 
         FROM rolls r 
         WHERE r.konto = n.id AND r.zeit > n.lastpayout) as sumroll,
        (SELECT sum(m.gewinn) 
         FROM multi m 
         WHERE m.account = n.id AND m.zeit > n.lastpayout) as summulti,
        (SELECT count(nx.referupnumber) 
         FROM nxt_account nx 
         WHERE nx.referupnumber = n.id) as amountref,
        (SELECT sum(rr.win)
         FROM  rolls rr INNER JOIN nxt_account nn ON
            rr.zeit >= nn.lastpayout AND rr.konto = n.id
         WHERE nn.referupnumber =n.id) as refamount
    FROM
        nxt_account n
按照这样做的方式,
nxt\u账户
表中的记录与您的请求数量相同。这可能是计算速度慢的主要原因



如果您只需要所有帐户的一个总数,您也应该使用SQL进行计算。

它看起来像是主
中的SQL,而
正在复制第一个子查询。如果计算结果不完全相同,您仍应将其合并到主查询中。下面的两个答案都有助于找到更好的查询方式。谢谢大家。它看起来像主
中的SQL,而
正在复制第一个子查询。如果计算结果不完全相同,您仍应将其合并到主查询中。下面的两个答案都有助于找到更好的查询方式。谢谢大家。它看起来像主
中的SQL,而
正在复制第一个子查询。如果计算结果不完全相同,您仍应将其合并到主查询中。下面的两个答案都有助于找到更好的查询方式。谢谢大家。它看起来像主
中的SQL,而
正在复制第一个子查询。如果计算结果不完全相同,您仍应将其合并到主查询中。下面的两个答案都有助于找到更好的查询方式。谢谢你们。你们能详细说明前两个索引吗?我可以理解索引中WHERE中使用的列如何帮助引擎。但是最后一列(要求和的那列)有什么帮助呢?引擎是否因为在索引中找到要求和的值而避免访问表?谢谢。最大的延迟之一来自转诊收入。正如你所看到的,我已经为每个要检查的查询创建了一个新的查询,如果nxt_帐户中的人有任何推荐用户。子查询进入每个被引用的用户并检查他挣了多少钱。这占用了大部分时间。这还没有解决,还是我忽略了什么?@Frazz。是的,你在正确的轨道上。索引可以满足整个查询,因此不需要原始数据页。这将导致更好的性能。@Tosch。这没有考虑到最后一个查询的处理,但是Bulat是正确的,您应该在一个查询中完成所有操作。首先在没有索引的情况下运行查询,仍然需要很多时间。使用该索引后,性能大大提高。谢谢你的提示!你能详细说明前两个索引吗?我可以理解索引中WHERE中使用的列如何帮助引擎。但是最后一列(要求和的那列)有什么帮助呢?引擎是否因为在索引中找到要求和的值而避免访问表?谢谢。最大的延迟之一来自转诊收入。正如你所看到的,我已经为每个要检查的查询创建了一个新的查询,如果nxt_帐户中的人有任何推荐用户。子查询进入每个被引用的用户并检查他挣了多少钱。这占用了大部分时间。这还没有解决,还是我忽略了什么?@Frazz。是的,你在正确的轨道上。索引可以满足整个查询,因此不需要原始数据页。这将导致更好的性能。@Tosch。这没有考虑到最后一个查询的处理,但是Bulat是正确的,您应该在一个查询中完成所有操作。首先在没有索引的情况下运行查询,仍然需要很多时间