2010-08-13 5 views
0

J'ai implémenté un système d'analyse qui fonctionne très mal. Pour l'expliquer, je dois expliquer la structure de table requêtesOptimisation SQL Query For Analytics

J'ai deux tables InnoDB

Tableau 1: contient des enregistrements sur les statistiques (toutes les heures stats_id, file_id, temps): Contient Tableau2 plus de 8 millions de lignes.

Tableau 2 Structure est

full_stats (
    stats_id Int 
    file_id Int 
    stats_week Int 
    stats_month Int 
    stats_year Int 
    stats_time DATETIME 

)

Ce que je suis en train de faire est de calculer les vues au total de hourly_stats pour une période de temps donnée et les dossiers de regroupement par file_id puis-je ajouter/mettre à jour les enregistrements vers la table full_stats. Sur moy, cela prend 1-2 minutes pour traiter une ligne. J'essaie d'optimiser les requêtes pour de meilleures performances.

Voici ce que je fais

Il y a 60 chances% que file_id existe déjà dans full_stats pour une semaine donnée, le mois et l'année et 40% les chances sont qu'il n'existe pas.

donc dans la première requête, j'essaie de mettre à jour enregistrement à l'aide suite à la requête

UPDATE full_stats 
    SET total_views=XXX 
WHERE stats_week=XX stats_month=X 
    AND stats_year=YYYY 

après que je vérifie si les lignes affectées est zéro, alors j'insérer l'enregistrement. Une fois l'insertion ou la mise à jour terminée, l'enregistrement de hourly_stats est supprimé en fonction de file_id et de la période donnée.

Pouvez-vous me suggérer comment optimiser les requêtes et réduire le taux de verrouillage?

+0

Quel type d'index avez-vous mis en place sur cette table? – FrustratedWithFormsDesigner

+0

Utiliser SSD joint dans la matrice RAID, devrait accélérer les E/S. Sérieusement? Tant que les index sont ajoutés, il devrait fonctionner aussi vite que possible. Toute optimisation ferait peu de performance dans ce cas. Peut-être que vous envisagez une refonte totale du système, mais aucun indice ne peut être donné ici, parce que si vous poussez dans un endroit, vous perdez dans un autre, et trop peu de détails sont donnés pour savoir ce qui peut être mieux fait. – AlexanderMP

+0

J'ai essayé d'ajouter un index à la semaine, au mois et à l'année, mais la performance était extrêmement lente et j'ai dû l'enlever. – Maximus

Répondre

1

Un index entraîne des performances médiocres lorsque l'index doit être réécrit ou mis à jour après chaque insertion/mise à jour. Ceci est plus probable avec les index réguliers.
Cependant, dans votre cas, il semble que vous ayez besoin d'un index unique de toute façon. Avec cela, vous pourriez ne pas avoir ce problème (autant).

Assurez-vous que votre table utilise le moteur InnoDB et possède un index unique sur (stats_year, stats_month, stats_week). Puis, au lieu d'effectuer une mise à jour, puis de rechercher les lignes concernées et de les insérer si nécessaire, utilisez INSERT...ON DUPLICATE KEY UPDATE. De cette façon, dans 40% des cas, vous vous êtes épargné l'instruction de mise à jour précédente. Notez cependant que l'index unique est crucial pour cette affirmation!