2010-02-16 2 views
2

Si vous avez 100 000 utilisateurs, MySQL exécute-t-il une requête SQL à la fois? Parce que dans mon code PHP je vérifie si une certaine ligne existe; si ce n'est pas le cas, cela en crée un. Si c'est le cas, il met juste à jour le compteur de ligne.MySQL gère une requête SQL à la fois?

J'ai pensé que peut-être 100 utilisateurs vérifient si la ligne existe en même temps, et quand ce n'est pas le cas, ils créent tous une rangée chacun.

Si MySQL les gère de manière séquentielle, je sais que ce ne sera pas un problème, alors un utilisateur va vérifier s'il existe, sinon, le créer. L'autre utilisateur va vérifier s'il existe, et puisque c'est le cas, il met juste à jour le compteur.

Mais s'ils vérifient tous si elle existe en même temps et que ce n'est pas le cas, ils créent tous une ligne et la structure de la table entière échoue.

Ce serait génial si quelqu'un pouvait faire la lumière sur ce sujet.

+0

S'il vous plaît nous montrer votre code. – SLaks

+1

MySQL ne permet-il pas de générer un identifiant unique pour une ligne? Si vous en générez un et l'utilisez comme clé primaire, vous n'aurez pas de doublons. –

+0

dans mon cas, c'est plus comme .. "quel utilisateur obtient en premier" .. le premier utilisateur va créer sa ligne et personne d'autre ne sera en mesure de créer sa propre ligne. donc je dois aller avec "vérifier ... si elle n'existe pas ... créer" – ajsie

Répondre

2

Utilisez une contrainte UNIQUE ou, si elle est viable, faites de la clé primaire l'un de vos éléments de données et le serveur SQL empêchera dupliquer les lignes d'être créé. Vous pouvez même utiliser la syntaxe "ON DUPLICATE KEY UPDATE ..." pour spécifier l'opération alternative si la ligne existe déjà.

De vos commentaires, il semble que vous pouvez utiliser la user_id comme clé primaire, auquel cas, vous seriez en mesure d'utiliser quelque chose comme ceci:

INSERT INTO usercounts (user_id,usercount) 
VALUES (id-goes-here,1) 
ON DUPLICATE KEY UPDATE usercount=usercount+1; 
1

Si vous mettez la vérification et l'insérer dans une transaction, vous pouvez éviter ce problème. De cette façon, la vérification et la création seront exécutées comme une seule requête et il ne devrait y avoir aucune confusion

+1

Incorrect. Les transactions seront également exécutées en parallèle, de sorte que deux transactions insèrent deux lignes différentes si elles sont exécutées simultanément. – SLaks

+0

Vraiment? Hmm, je ne m'en suis pas rendu compte! Merci de l'avoir souligné, j'ai maintenant appris quelque chose en essayant de répondre à une question ... Je pense que je vais laisser ma "réponse" ici au cas où il y aurait d'autres âmes mal informées comme moi là-bas. –

+0

Je ne sais même pas ce qu'est une transaction =) – ajsie

Questions connexes