Mysql 获得性能和执行快速sql查询的最佳方法?
我在数据库中使用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| +-------------------------------------+Mysql 获得性能和执行快速sql查询的最佳方法?,mysql,database,algorithm,Mysql,Database,Algorithm,我在数据库中使用MySQL,并在数据库端进行一些处理,以使我的应用程序更加容易 我以前的查询速度非常快,直到最近我的数据库有很多数据,而且查询速度非常慢 我的应用程序主要做统计,并且有很多相关的数据库来获取数据 以下是一个例子: +--------------------------------------------------------------------------+ | gameId | playerId | frags | deaths | actions | team | pe
设置索引将加快查询速度。如果有很多结果,查询可能需要一段时间才能运行,但这绝对是一个开始。设置索引将加快查询速度。如果有很多结果,查询可能需要一段时间才能运行,但这绝对是一个开始。很明显,索引在这里对您没有帮助,因为您需要两个表中的所有数据。您甚至需要来自
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_团队,保存总和;用触发器填充它。因此,您不必在查询中计算聚合
- 数据仓库表格:制作一个包含完整结果的表格。用触发器或每隔一段时间填充它
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