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是正确的,您应该在一个查询中完成所有操作。首先在没有索引的情况下运行查询,仍然需要很多时间