我的网站上有+100款游戏。每个游戏都有自己的高分表。该表的结构始终相同(相同的列等)。
在中心页面上,作为摘要,我想显示用户在所有游戏中的最高得分。
最有效的方法是什么?我正在考虑只执行一次SELECT查询100次以上(每个表一次),但这听起来对性能并不友好:
$stmt = $mysqli->prepare("SELECT * FROM table WHERE user_id=? AND something_else=?");
$stmt->bind_param('is', $user_id, $something_else);
提示?
答案 0 :(得分:2)
最有效的方法是修复数据模型。拥有100多个具有相同结构的表,这表明设计非常糟糕。
只需一张桌子-以及游戏的另一列-您只需执行以下操作:
select ahs.*
from all_high_scores ahs
where ahs.use_id = ?;
否则,您将被困住。 MySQL不太擅长优化查询,因此我认为这不起作用:
create view v_all_high_scores as
select * from high_scores_01 union all
select * from high_scores_02 union all
select * from high_scores_03 union all
. . .;
select *
from v_all_high_scores ahs
where user_id = ?
您可能会很幸运–许多数据库会将条件推送到各个表。 MySQL可能会在当前版本中这样做。
另一种方法是蛮力方法,具有无数的参数:
select * from high_scores_1 where user_id = ? union all
select * from high_scores_2 where user_id = ? union all
select * from high_scores_3 where user_id = ? union all
. . .;
但是,您应该修复数据模型,以便可以在一个查询中高效地编写此模型。
答案 1 :(得分:0)
最好能够从一个桌子或类似的结构访问所有游戏的统计信息。
您是否考虑过使用分区表?这将允许根据一个分区属性(在本例中为游戏ID)将表分为许多子表(每个游戏一个)。但是,在SQL中,它显示为一个表,而不是100个子表。
当您根据说出的游戏ID进行查询时,查询将直接指向包含该游戏数据的一个子表。这样,就可以像以前一样通过将游戏数据保存在多个表中来保留您进行的优化。
执行插入操作时也会发生同样的情况-新行将存储在相关子表中。
但是,如果要跨多个子表选择数据,则可以在不指定分区值的情况下查询分区表,它将查询所有子表,就像从一个表中返回数据一样。
以下博客介绍了更多信息: