Je travaille sur un projet Rails et sur un problème de performances. Voici le schéma db simplifiéOptimisation de requête Mysql
table gaming_platforms (~5 rows) id table games (~10k rows) id gaming_platform_id winner (black or white or n/a) black_id => online_players.id white_id => online_players.id table online_players (~1k rows) id gaming_platform_id username
maintenant donné un nom d'utilisateur, je veux afficher les joueurs dont le nom correspond à l'entrée, sans. des jeux qu'ils ont joués, gagnés ou perdus.
J'ai créé 3 vues pour éviter le problème 1 + n.
create or replace view online_player_games as select online_players.id as online_player_id, count(*) as games from games left join online_players on games.gaming_platform_id = online_players.gaming_platform_id and (games.black_id = online_players.id or games.white_id = online_players.id) group by online_players.id; create or replace view online_player_won_games as select online_players.id as online_player_id, count(games.id) as games from online_players left join games on games.gaming_platform_id = online_players.gaming_platform_id and ((games.winner = 1 and games.black_id = online_players.id) or (games.winner = 2 and games.white_id = online_players.id)) group by online_players.id; create or replace view online_player_lost_games as select online_players.id as online_player_id, count(games.id) as games from online_players left join games on games.gaming_platform_id = online_players.gaming_platform_id and ((games.winner = 2 and games.black_id = online_players.id) or (games.winner = 1 and games.white_id = online_players.id)) group by online_players.id;
Sans utiliser d'index, il faut> 20 secondes pour interroger ces vues. La requête semble compliquée. Je ne suis pas sûr quels index je devrais créer. Toutes les opinions ou suggestions sont les bienvenues.
Vous avez raison. Il vaut mieux utiliser une table pour stocker les statistiques des joueurs et les mettre à jour chaque fois que la table des jeux change. Je vais essayer l'approche de procédure stockée. –