Que sont les triggers de Mysql

+2 votes
8,701 vues
question 7 Janvier 17 dans Sql Phpmyadmin par debo (228 points)  

A quoi ça sert ? Comment utiliser des triggers pour résoudre la question : 

mysql optimisation bizarre d'une table avec plusieurs index

1 Réponse

+1 vote
réponse 7 Janvier 17 par ladmin (2,277 points)  

Référez vous à la doc mysql qui est très facile à suivre. Mais peut être qu'un exemple simple pourrait aider à forger des applications des triggers.

Supposons qu'une table contienne les logs des courses d'un taxi : no de coureur, distance parcourue, durée du parcours

CREATE TABLE `logstaxis` (
  `nocourse` int(11) NOT NULL,
  `distance` double NOT NULL DEFAULT '0',
  `duree` double NOT NULL DEFAULT '1'
) ;

ALTER TABLE `logstaxis` ADD PRIMARY KEY (`nocourse`);

et qu'il faille classer les résultats par vitesse c'est à dire faire

select * from `logstaxis` order by `distance`/`duree` limit 0,20 ; // where `duree`>0 et limit optionnels mais conseillés  ; ajouter l'index duree

Là, mysql ne sait pas classer les lignes sans calculer les rapports et les classer. Il n'y a pas d'index qui puisse s'exprimer par un rapport.
S'il n'y a que 100 ou 200 lignes ce n'est pas grave mais ça commence à compter au delà.

Solution parfois possible : les triggers. 
Avec on peut ajouter et maintenir cette colonne sans changer le code des pages

D'abord ajoutons une colonne vitesse et faisons en un index :

ALTER TABLE `logstaxis` ADD `vitesse` REAL NOT NULL DEFAULT '0.0' AFTER `duree`, ADD INDEX (`vitesse`);

Ensuite, créons 2 triggers qui vont calculer la vitesse de chaque ligne insérée ou modifiée  :

DROP TRIGGER IF EXISTS `sum12insert`;
CREATE TRIGGER `sum12insert` BEFORE INSERT ON `table` FOR EACH ROW SET NEW.`vitesse`=NEW.`dist`/NEW.`duree` ;
DROP TRIGGER IF EXISTS `sum12update`;
CREATE TRIGGER `sum12update` BEFORE UPDATE ON `table` FOR EACH ROW SET NEW.`vitesse`=NEW.`dist`/NEW.`duree` ;

Maintenant, nous pouvons écrire

select * from `logstaxis` order by `vitesse` limit 0,20 ; // where et limit optionnels mais conseillés

et espérer à la fois un résultat juste et des performances de l'index.

Phpmyadmin peut aider à saisir les triggers et voir les effets après insertions et modifs.

Quand le truc est compris, il faut revenir à la doc pour voir tout ce qu'il est possible de faire et trouver des applications en optimisation.


 

commentée 6 Février 17 par saintjoseph (192 points)  
c'est compliqué pour moi ... A quoi ça sert sur Joomla ?
Feel free to ask and answer in english

Bienvenue sur les FAQ de 123.fr, posez vos questions ou répondez à celles des autres usagers.

...