Mysql 获得性能和执行快速sql查询的最佳方法?

Mysql 获得性能和执行快速sql查询的最佳方法?,mysql,database,algorithm,Mysql,Database,Algorithm,我在数据库中使用MySQL,并在数据库端进行一些处理,以使我的应用程序更加容易 我以前的查询速度非常快,直到最近我的数据库有很多数据,而且查询速度非常慢 我的应用程序主要做统计,并且有很多相关的数据库来获取数据 以下是一个例子: +--------------------------------------------------------------------------+ | gameId | playerId | frags | deaths | actions | team | pe

我在数据库中使用MySQL,并在数据库端进行一些处理,以使我的应用程序更加容易

我以前的查询速度非常快,直到最近我的数据库有很多数据,而且查询速度非常慢

我的应用程序主要做统计,并且有很多相关的数据库来获取数据

以下是一个例子:

+--------------------------------------------------------------------------+ | gameId | playerId | frags | deaths | actions | team | percent | isWinner | |--------+----------+-------+--------+---------+------+---------+----------| tbl_游戏

+-------------------------------------+ | id | winner | duration| endedAt | |--------+--------+---------+---------| | 1 | 1 | 1200 |timestamp| | 2 | 0 | 1200 |timestamp| | 3 | 1 | 1200 |timestamp| | 4 | 1 | 1200 |timestamp| +-------------------------------------+
设置索引将加快查询速度。如果有很多结果,查询可能需要一段时间才能运行,但这绝对是一个开始。

设置索引将加快查询速度。如果有很多结果,查询可能需要一段时间才能运行,但这绝对是一个开始。

很明显,索引在这里对您没有帮助,因为您需要两个表中的所有数据。您甚至需要来自
tbl\u game\u player
的数据两次,一次聚合,一次不聚合。因此,有数百万条记录需要读取和加入。你的问题很好,我认为没有办法真正改进它

当然,您应该在主键和外键上始终具有索引,以便DBMS可以在联接中使用它们。(例如,
tbl\u游戏(tgp.gameId)
上应该有一个索引)

因此,您的选项不在查询范围内:

  • 硬件(显然)
  • 将团队的计算列添加到tbl_game_player,以便在查询时至少保存其评估
  • 分区。每个团队一个分区,因此可以单独计算聚合
  • 预先计算的数据:添加一个表tbl_game_团队,保存总和;用触发器填充它。因此,您不必在查询中计算聚合
  • 数据仓库表格:制作一个包含完整结果的表格。用触发器或每隔一段时间填充它

很明显,索引在这里对您没有帮助,因为您需要两个表中的所有数据。您甚至需要来自
tbl\u game\u player
的数据两次,一次聚合,一次不聚合。因此,有数百万条记录需要读取和加入。你的问题很好,我认为没有办法真正改进它

当然,您应该在主键和外键上始终具有索引,以便DBMS可以在联接中使用它们。(例如,
tbl\u游戏(tgp.gameId)
上应该有一个索引)

因此,您的选项不在查询范围内:

  • 硬件(显然)
  • 将团队的计算列添加到tbl_game_player,以便在查询时至少保存其评估
  • 分区。每个团队一个分区,因此可以单独计算聚合
  • 预先计算的数据:添加一个表tbl_game_团队,保存总和;用触发器填充它。因此,您不必在查询中计算聚合
  • 数据仓库表格:制作一个包含完整结果的表格。用触发器或每隔一段时间填充它


对于大型数据库,Mysql索引对于解决速度问题非常有帮助,可以在表中创建索引以更快、更高效地查找数据。因此必须创建索引,您可以在此处了解有关MYsql索引的更多信息

对于大型数据库,MYsql索引在解决速度问题方面非常有用,可以在表中创建索引以更快、更高效地查找数据。因此,必须创建索引,您可以在这里了解有关MYsql索引的更多信息。

对于上面的查询,
explain select….
说明了什么?此外,哈希键可能比索引更有帮助。不使用索引会使数据库真正更快,但只在开始时使用。你能展示一下你是如何创建这些表的吗?它通常应该说什么?有2个主子查询、1个派生子查询和1个从属子查询。我不知道如何读取
解释选择…
数据。你能解释一下吗?把它们抄到问题里就行了。我知道。它返回了一个包含一些结果的表,但我不知道如何使用此结果来查找错误。
explain select….
对于上面的查询说了什么?此外,哈希键可能比索引更有帮助。不使用索引会使数据库真正更快,但只在开始时使用。你能展示一下你是如何创建这些表的吗?它通常应该说什么?有2个主子查询、1个派生子查询和1个从属子查询。我不知道如何读取
解释选择…
数据。你能解释一下吗?把它们抄到问题里就行了。我知道。它返回一个包含一些结果的表,但我不知道如何使用该结果查找错误。我应该在所有字段上添加索引吗?我的意思是,我如何知道在哪里添加索引?@user2707590不只在将用于联接的字段上应用索引。如果某个字段是主键或外键,我是否仍应在其上添加索引?是的,但仅当使用关系时。我是否应在所有字段上添加索引?我的意思是,如何才能知道在何处添加索引?@user2707590不仅在将用于联接的字段上应用索引。如果某个字段是主键或外键,我是否仍应在其上添加索引?是的,但仅当使用关系时。by 1,您的意思是,即使我有主键或外键,我应该在它上面创建另一个索引?大多数DBMS会自动在主键和外键上创建索引。我不知道MySQL是否也这样做。如果没有,那么是的,创建它们。1,你的意思是即使我有主键或外键,我也应该在上面创建另一个索引吗?大多数DBMS都会自动在主键和外键上创建索引。我不知道MySQL是否也这样做。如果不是,则是,创建它们。 +--------------------------------------------------------------------------+ | gameId | playerId | frags | deaths | actions | team | percent | isWinner | |--------+----------+-------+--------+---------+------+---------+----------|
SELECT
    tgp.gameId,
    tgp.playerId,
    tgp.frags,
    tgp.deaths,
    tgp.frags + tgp.deaths AS actions,
    IF(playerSlot in (1,2,3,4,5), 0, 1) AS team,
    ((SELECT actions) / tgpx.totalActions) * 100 AS percent,
    IF((SELECT team) = tg.winner, 1, 0) AS isWinner
FROM tbl_game_player tgp
INNER JOIN tbl_game tg on tgp.gameId = tg.id
INNER JOIN (
    SELECT
        gameId,
        SUM(frags) AS totalFrags,
        SUM(deaths) AS totalDeaths,
        SUM(frags) + SUM(deaths) as totalActions,
        IF(playerSlot in (1,2,3,4,5), 0, 1) as team
    FROM tbl_game_player
    GROUP BY gameId, team
) tgpx on tgp.gameId = tgpx.gameId and team = tgpx.team