2010-10-14 11 views
0

J'ai une table qui stocke les messages d'un utilisateur à un autre. les messages (user_id, friend_id, message, created_date). Ma clé primaire est (friend_id, created_date). Cela empêche les messages en double (AFAIK), car ils ne parviennent pas à insérer.évolutivité des transactions défaillantes mysql

À l'heure actuelle, cela est correct car mon code génère environ 20 de ces requêtes à la fois par utilisateur et je n'ai qu'un seul utilisateur. Mais s'il y avait des centaines ou des milliers d'utilisateurs cela créerait-il un goulot d'étranglement dans ma base de données avec toutes les transactions échouées? Et si je pouvais faire ce genre de choses pour améliorer la situation? Question: Est-ce que je dois utiliser la contrainte de clé primaire, vérifier en dehors de mysql, ou utiliser d'autres fonctionnalités mysql pour garder les doublons hors de la base de données?

Répondre

1

Ça devrait aller, car mysql va faire une recherche de clé primaire en interne et ignorer l'enregistrement (je suppose que vous utilisez INSERT IGNORE). Si vous vérifiez s'ils existent avant l'insertion, mysql vérifiera encore quand vous insérez. Cela signifie que si la plupart des insertions réussissent, vous enregistrez une vérification supplémentaire. Si la grande majorité des inserts échouaient (peu probable), les économies réalisées en ne transmettant pas de données inutiles l'emporteraient probablement sur les vérifications répétées occasionnelles.

+0

Le nombre de transactions échouées possibles par utilisateur n'est pas statique. Le nombre de messages récupérés est statique. Donc, si l'utilisateur touche l'application 2x et qu'aucun nouveau message n'a été envoyé, tous les messages que l'on tente d'insérer vont échouer car ils sont déjà dans la base de données. Donc, je suppose que je suis confus au sujet de ce que vous dites, la réponse est. Est-ce que je le garde avec une instruction d'insertion normale et laisse la clé primaire la manipuler ou ai-je besoin de faire quelque chose d'autre? –

+0

@ controlfreak123 Je dirais généralement laisser la clé primaire s'en occuper, mais peut-être devriez-vous en dire un peu plus sur ce que vous faites? Pourquoi les gens réinséreraient-ils des messages? –

+0

@bernace Je n'ai aucun contrôle sur l'API que j'utilise pour récupérer les messages pour chaque utilisateur. Donc, si je demande à un utilisateur des messages avant qu'ils ne reçoivent des messages supplémentaires, il y en aura dans l'ensemble qui sont déjà dans la base de données. Si je gardais trace de l'horodatage du message le plus récent inséré je pourrais le comparer à chaque nouveau message avant de l'insérer. Mais la méthode de la clé primaire semble plus simple à cet égard. Bien que s'appuyer sur des inserts pour ne pas atteindre mon objectif semble hackish. D'où ma question –

Questions connexes