IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MySQL Discussion :

Plus de 100.000 entrées dans la table, pas de problème?


Sujet :

MySQL

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut Plus de 100.000 entrées dans la table, pas de problème?
    Bonjour à toutes et tous.
    Voilà mon problème:
    Je développe un concours qui inclut un formulaire avec un système de vote.
    PHP et SQL avec innoDb
    Un concours qui doit durer plusieurs mois.
    J'ai une restriction:
    1 seul utilisateur par vote.
    Donc je fais tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $stmt = $pdo->query("SELECT email FROM utilisateurs WHERE email='$email'");
        if((bool) $stmt->fetchColumn()){
    echo "utilisateur déjà enregistré";
    }
    Bon, OK, ça fonctionne.
    Mais si cette requête doit parcourir admettons dans quelques mois plus de 100.000 entrées, à quelle vitesse le moteur parcourt-il le tableau, ça ne risque pas de ramer ?

    Merci à vous.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Il faut indexer la colonne email.

    À partir de là, vous devriez être OK si le serveur suit derrière.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vu votre bout de code, il semble que l'email sera unique.
    Dans ce cas, je dirais même qu'il suffit d'ajouter une contrainte d'unicité sur la colonne email.
    Ainsi, un index unique sera créé automatiquement et permettra de supporter votre requête, et vous vous assurerez en même temps que l'unicité sera toujours respectée.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Comme Dupont et Dupond, je dirais même plus !

    Avec un index unique, vous pouvez directement insérer ou modifier l'email et traiter l'éventuel message d'erreur retourné par le SGBD en cas de doublon, plutôt que de lancer d'abord une requête SELECT pour vérifier que l'email n'existe pas déjà dans la BDD.

    Petit test sur MariaDB...
    Création d'une table avec une colonne uti_adrel munie d'un index UNIQUE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE `utilisateur` (
     `uti_id` int(11) NOT NULL AUTO_INCREMENT,
     `uti_adrel` varchar(255) NOT NULL,
     PRIMARY KEY (`uti_id`),
     UNIQUE KEY `uti_adrel` (`uti_adrel`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
    Insertion de deux utilisateurs avec la même adrel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO utilisateur(uti_adrel)
    VALUES('dupont@adrel.fr')
    => OK

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO utilisateur(uti_adrel)
    VALUES('dupont@adrel.fr')
    =>
    #1062 - Duplicate entry 'dupont@adrel.fr' for key 'uti_adrel'
    Il suffit de traiter ce cas d'erreur dans le programme qui tente d'insérer l'email dans la table.

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2013
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2013
    Messages : 47
    Points : 45
    Points
    45
    Par défaut
    parfait!
    Merci à vous trois. Sujet résolu. Chacune des réponses complétant la précédente.

    Bien amicalement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Créer un graphique à partir d'une table de plus de 100 000 lignes
    Par ClemQ dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/06/2014, 12h11
  2. Réponses: 1
    Dernier message: 01/03/2011, 17h19
  3. [AJAX] Faut-il faire de l'AJAX sur une table de plus de 11'000 entrées ?
    Par Dsphinx dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 03/08/2007, 16h58
  4. Utiliser plus de 100 critères OR dans une requête
    Par fanfoicyp dans le forum Access
    Réponses: 9
    Dernier message: 23/05/2006, 22h17
  5. Effacer des entrées dans deux tables
    Par stormz dans le forum Langage SQL
    Réponses: 1
    Dernier message: 17/01/2006, 12h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo