Précédent   Forum des professionnels en informatique > Bases de données > MySQL
MySQL Forum d'entraide MySQL. Avant de poster -> FAQ MySQL, Tutoriels MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/08/2008, 09h18   #1
Membre chevronné
 
Avatar de Dia_FR
 
Homme Aurélien
Développeur Web
Inscription : avril 2006
Messages : 510
Détails du profil
Informations personnelles :
Nom : Homme Aurélien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2006
Messages : 510
Points : 643
Points : 643
Par défaut Comportement étrange avec les index et "order by"

bonjour,

j'ai rencontré un comportement étrange de ma BD et après quelques tests j'ai trouvé la solution, sauf que je n'ai compris ni l'origine du problème ni le pourquoi de la solution donc si quelqu'un peut éclairer ma lanterne...

en MySQL 5, moteur InnoDB, voilà le script correspondant à la table en question, en ne gardant que le code pertinent :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE `fxc_pages` (
  `page_id` int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `page_code` varchar(255) collate latin1_general_ci NOT NULL,
  `site_id` int(11) UNSIGNED NOT NULL,
  `template_id` int(11) UNSIGNED NOT NULL,
  `parent_id` int(11) UNSIGNED DEFAULT NULL,
  `page_order` int(11) UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY  (`page_id`),
  UNIQUE KEY `page_code` (`page_code`,`site_id`),
  UNIQUE KEY `page_order` (`site_id`,`parent_id`,`page_order`),
  KEY `parent_id` (`parent_id`),
  KEY `template_id` (`template_id`),
  KEY `site_id` (`site_id`),
  CONSTRAINT `fxc_pages_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `fxc_pages` (`page_id`) ON DELETE CASCADE,
  CONSTRAINT `fxc_pages_site_id` FOREIGN KEY (`site_id`) REFERENCES `fxc_sites` (`site_id`) ON DELETE CASCADE,
  CONSTRAINT `fxc_pages_template_id` FOREIGN KEY (`template_id`) REFERENCES `fxc_templates` (`template_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;
donc en gros, une PK, 3 FK avec chacune un index et 2 index unique dont un portant sur 3 colonnes

avec cette structure, une requête comme celle là, le order by n'était pas pris en compte
Code :
UPDATE fxc_pages SET page_order = page_order - 1 WHERE site_id = x AND parent_id = y AND page_order <= z AND page_order > t ORDER BY page_order ASC
pour régler le problème, il a suffit de virer la clé sur site_id :
Code :
  KEY `site_id` (`site_id`),
je ne suis pas un pro MySQL et je connais les détails de sa gestion des index et des clés donc si quelqu'un sait...
merci d'avance
__________________
Dia [ Page DVP ] [ Blog ] [ Site pro ]
Dia_FR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2008, 01h52   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 034
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 034
Points : 18 324
Points : 18 324
Envoyer un message via MSN à CinePhil
Euh... ça sert à quoi de faire un ORDER BY sur une requête UPDATE ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/08/2008, 10h08   #3
Membre chevronné
 
Avatar de Dia_FR
 
Homme Aurélien
Développeur Web
Inscription : avril 2006
Messages : 510
Détails du profil
Informations personnelles :
Nom : Homme Aurélien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2006
Messages : 510
Points : 643
Points : 643
à l'exécuter sur les enregistrements dans un certain ordre
dans le cas que j'ai présenté j'ai une clé d'unicité sur order, site et parent
je dois changer la valeur de order, pour un site et un parent donnés
pour le faire en une seule requete sans violer l'unicité, je les ordonne par order ascendant si je dois faire order--, ou par order descendant si je dois faire order++
fin bon c de l'algo de base quoi
__________________
Dia [ Page DVP ] [ Blog ] [ Site pro ]
Dia_FR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2008, 02h17   #4
Expert Confirmé
 
Avatar de Alain Defrance
 
Homme Alain DEFRANCE
Project Lead
Inscription : août 2007
Messages : 1 993
Détails du profil
Informations personnelles :
Nom : Homme Alain DEFRANCE
Âge : 24
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Project Lead

Informations forums :
Inscription : août 2007
Messages : 1 993
Points : 2 919
Points : 2 919
Envoyer un message via MSN à Alain Defrance Envoyer un message via Skype™ à Alain Defrance
La clause UPDATE effectue un traitement ensembliste, c'est-à-dire que si tu fait :
Code :
SET un_champ = un_champ + 1
Tous les champs sont modifié en même temps, il n'y a donc pas de viol au niveau de l'intégrité.

Bien évidement dans l'exécution de la requête il dois y avoir un traitement séquentiel mais, mais le contrôle s'effectue après l'update (comme si on ouvrais une transaction avant, et on faisait un COMIT après).
D'ailleurs le DML est une transaction un court moment.
__________________
http://alaindefrance.wordpress.com - http://www.alain-defrance.com
Certifications : SCJP6 - SCWCD5 - SCBCD5 - SCMAD1
Project Lead eXo Social
Java Black Belt - Java Black Belt Coach
Alain Defrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2008, 10h57   #5
Membre chevronné
 
Avatar de Dia_FR
 
Homme Aurélien
Développeur Web
Inscription : avril 2006
Messages : 510
Détails du profil
Informations personnelles :
Nom : Homme Aurélien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2006
Messages : 510
Points : 643
Points : 643
intéressant à savoir, je ne crois pas que j'avais essayé, partant du principe que le contrôle d'intégrité se faisait à chaque modification d'un enregistrement, j'essaie ça dès lundi !
__________________
Dia [ Page DVP ] [ Blog ] [ Site pro ]
Dia_FR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/08/2008, 09h18   #6
Membre chevronné
 
Avatar de Dia_FR
 
Homme Aurélien
Développeur Web
Inscription : avril 2006
Messages : 510
Détails du profil
Informations personnelles :
Nom : Homme Aurélien
Localisation : France

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : avril 2006
Messages : 510
Points : 643
Points : 643
nan ba en virant le "order by" sur l'update, ça foire bien en posant une "integrity constraint violation"

donc j'en reviens à ma question de base si quelqu'un sait...
__________________
Dia [ Page DVP ] [ Blog ] [ Site pro ]
Dia_FR est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h17.


 
 
 
 
Partenaires

Hébergement Web