2013-03-12 4 views
0

Actuellement, j'ai une table, et il se peuplé très rapidement. J'ai 50 appareils. Je rassemble les données de chaque appareil toutes les 30 secondes. Par conséquent, après avoir ajouté 10 000 appareils, ils généreraient 876 000 000 d'enregistrements par mois, ce qui est beaucoup!Base de données de conception - comment structurer

INSERT INTO unit_data 
(`id`,`dt`,`id_unit`,`data1`,`data2`, 
`ip`,`unique_id`,`loc_age`,`reason_code`, 
`data3`,`data4`,`Odo`,`event_time_gmt_unix`, 
`switches`,`on_off`,`data5`) 

ici sont mes relations

PRIMARY KEY (`id`), 
    UNIQUE KEY `id_unit_data_UNIQUE` `id`), 
    KEY `fk_gp2` (`id_unit`), 
    KEY `unit_dt_id` (`dt`,`id_unit`), 
    KEY `unit_id_dt` (`id_unit`,`dt`), 
    CONSTRAINT `fk_gp2` FOREIGN KEY (`id_unit`) REFERENCES `unit` (`id_unit`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB AUTO_INCREMENT=1049392 DEFAULT CHARSET=utf8$$ 

Je suis confronté à des requêtes assez complexes et des rapports, et quand je les fais, notre système ne répond pas et frapper délai d'exécution. (c'est avec 2mil + enregistrements)

Je dois repenser et ré-implémenter la structure de base de données. Et actuellement, je pense à deux

  • Créer une nouvelle table pour chaque unité
  • Créer une nouvelle table pour chaque unité pour chaque mois

Que proposeriez-vous?

+0

Unité = appareil, n'est-ce pas? Je ne suggérerais pas de créer une table séparée pour chaque appareil. Vos indices répondent-ils aux requêtes que vous devez exécuter? – Melanie

+0

À quoi ressemble la requête de longue durée? –

+0

Darius, je suis actuellement, essayant également de résoudre la question: http://stackoverflow.com/questions/15367719 – Andrew

Répondre

0

Créer de nouvelles tables est une bonne idée, mais vous n'avez pas besoin de l'implémenter, MySql a déjà un tel outil - google pour les mots clés "mysql + partitioning". Je recommande de l'utiliser car vous n'avez pas besoin de changer vos requêtes, mysql lui-même s'en soucie. Ajoutez simplement le mot clé "partition by" à votre création de table.

Encore une astuce pour vous: je vous suggère de rassembler beaucoup d'informations sur une grande table et de sélectionner parfois des données. Mais l'insertion de nombreuses nouvelles lignes provoque la fermeture de la table (indisponible pour les sélections) et la reconstruction des index (je suis sûr que votre table est indexée). Dans mon projet actuel, je fais quelque chose de similaire à vous et je vous conseille de faire ce qui suit:

1) créer un clone de table de votre BIG-TABLE. Il devrait avoir la même structure avec BIG-TABLE avec une différence - table-clone n'a pas d'index.

2) lorsque vous recevez des données de vos appareils, placez-les dans le tableau-clone. 3) écrire un robot-agent qui mettra les enregistrements de la petite table dans la grande table chaque heure ou chaque jour - cela dépend de vous mais le meilleur cas est de choisir tel intervalle que la taille de la table sera assez petite pour faire fullscan (Rappelez-vous, il n'est pas indexé). 4) lorsque vous voulez effectuer une requête SELECT, vous le faites dans 2 tables - dans une table BIG indexée - assez vite car personne n'essaie d'y insérer des données (seul le robot le fait parfois), et fullscan dans une petite table - aussi assez vite parce que vous pouvez le garder petit.

5) le robot doit se réveiller au calme c- peut être la nuit.

+0

J'ai déjà une table qui montre les derniers enregistrements, tandis que cette grande table est utilisée pour les rapports. Donc quand je lance mon rapport, mon serveur atteint 100% en CPU Tous les clients souffrent pendant 30 secondes – Andrew

+0

Voulez-vous dire que le temps de reporting coïncide avec l'insertion de nouveaux enregistrements récents de la petite table à la grande table? Parce que cette affaire semble être le seul mauvais cas. Peut être vous devriez stocker 2 copies de la grande table - BT1, BT2; écrire les derniers enregistrements dans BT1 chaque "quelques_interval" heures, supprimer prev BT2 et le remplacer par une nouvelle copie de BT1. Exécuter le rapport sur BT2. Une telle structure garantit que vos requêtes de rapport (select)/populate (insert) ne se croisent pas. – Baurzhan

Questions connexes