2 votes

MYSQL : Rendre une requête de mise à jour plus rapide ?

J'ai un simple tableau d'utilisateurs :

userID | credits | name | etc | etc1 | etc2

Je fais une simple requête :

UPDATE users set credits = (credits - 10) where userid = 9

Ce tableau comporte 2000 lignes. Pourquoi cette requête prend-elle 0,16 seconde et comment puis-je la rendre plus rapide ?

userid est la clé primaire et a donc déjà un index sur elle. Je ne vois donc pas pourquoi cette requête pourrait être lente. D'autant plus que c'est la SEULE requête qui est exécutée, UNE FOIS, sur un serveur avec 16 Go de RAM et un processeur qui tue. Il n'y a littéralement rien d'autre sur le serveur qui pourrait monopoliser des ressources.

Des idées ?

EDIT

C'est comme ça que je le chronomètre :

private function slowQueryEvaluator($startTime, $endTime, $identifier) {

    $MAX_TIME = 0.1;

    $IP = Controller::getRealIpAddress();
    $userID = -1;
    if (isset(YII::app()->user->id)) {
      $userID = YII::app()->user->id;
    }
    $seconds = $endTime - $startTime;
    if ($seconds > $MAX_TIME ) {
      YII::log($IP.' - '.$userID.' - '.$seconds.' seconds - '.$identifier);
    }

  }

Les crédits sont une INT.

Et voici une exportation de la création de la table des utilisateurs :

CREATE TABLE IF NOT EXISTS `users` (
  `userid` int(11) NOT NULL AUTO_INCREMENT,
  `cell_nr` varchar(12) NOT NULL,
  `status` varchar(20) NOT NULL DEFAULT 'INACTIVE',
  `full_name` varchar(255) NOT NULL,
  `public_name` varchar(20) NOT NULL,
  `credits` int(11) NOT NULL DEFAULT '0',
  `national_id` varchar(20) NOT NULL,
  `email_address` varchar(255) NOT NULL,
  `OTP` int(5) NOT NULL,
  `OTP_count` int(11) NOT NULL DEFAULT '0',
  `password` char(32) NOT NULL,
  `created` int(11) NOT NULL,
  PRIMARY KEY (`userid`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

0voto

daemonThread Points 173

Votre moteur de base de données fournit le verrouillage de table ou le verrouillage de niveau de rangée ceci peut changer la vitesse et créer la procédure stockée et passer seulement des paramètres peut-être plus rapide je n'ai pas essayé d'autre part vous pouvez essayer de batch crud.par exemple 20 exécutions de sql est un commit.et vous pouvez essayer d'ajouter un autre index de corde à côté de votre existé

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X