/branches/v1.7-oxygene/scripts/modules/maj/201309-index-views.sql |
---|
New file |
0,0 → 1,74 |
-- r1368/r1418: ajout de nom_referentiel à del_observations (attention, appelée "del_images" dans mysql-workbench) |
DROP VIEW IF EXISTS `BASEDEL`.`del_image` ; |
DROP TABLE IF EXISTS `BASEDEL`.`del_image`; |
CREATE OR REPLACE VIEW `BASEDEL`.`del_image` AS |
SELECT i.id_image, if((char_length(i.ce_utilisateur) <> 32),cast(i.ce_utilisateur as unsigned),0) AS ce_utilisateur, i.prenom_utilisateur, i.nom_utilisateur, i.courriel_utilisateur, i.hauteur, i.largeur, i.date_prise_de_vue, i.mots_cles_texte, |
i.commentaire, i.nom_original, i.date_modification, i.date_creation, i.publiable_eflore, o.nom_referentiel |
FROM `BASECEL`.`cel_images` AS i |
INNER JOIN `BASECEL`.`cel_obs_images` AS oi ON (i.id_image = oi.id_image) |
INNER JOIN `BASECEL`.`cel_obs` AS o ON (oi.id_observation = o.id_observation) |
WHERE o.transmission = '1' ; |
-- r1368/r1418: ajout de nom_referentiel à del_observations |
DROP VIEW IF EXISTS `BASEDEL`.`del_observations` ; |
DROP TABLE IF EXISTS `BASEDEL`.`del_observations`; |
CREATE OR REPLACE VIEW `BASEDEL`.`del_observation` AS |
SELECT id_observation, if((char_length(o.ce_utilisateur) <> 32),cast(o.ce_utilisateur as unsigned),0) AS ce_utilisateur, prenom_utilisateur, nom_utilisateur, courriel_utilisateur, nom_sel, nom_sel_nn, nom_ret, nom_ret_nn, nt, famille, |
ce_zone_geo, zone_geo, lieudit, station, milieu, nom_referentiel, |
date_observation, mots_cles_texte, commentaire, |
date_creation, date_modification, date_transmission |
FROM `BASECEL`.`cel_obs` AS o |
WHERE transmission = '1' ; |
-- r1376: ajout de la vue v_del_image (version modifiée de del_image |
DROP VIEW IF EXISTS `BASEDEL`.`v_del_image` ; |
DROP TABLE IF EXISTS `BASEDEL`.`v_del_image`; |
CREATE OR REPLACE VIEW `BASEDEL`.`v_del_image` AS |
SELECT o.*, i.id_image, i.ordre AS i_ordre, |
i.ce_utilisateur AS i_ce_utilisateur, i.prenom_utilisateur AS i_prenom_utilisateur, i.nom_utilisateur AS i_nom_utilisateur, i.courriel_utilisateur AS i_courriel_utilisateur, |
i.mots_cles_texte AS i_mots_cles_texte, hauteur, largeur, date_prise_de_vue, i.commentaire AS i_commentaire, nom_original, publiable_eflore |
FROM `BASECEL`.cel_obs AS o |
INNER JOIN `BASECEL`.cel_obs_images oi ON oi.id_observation = o.id_observation |
INNER JOIN `BASECEL`.cel_images i ON i.id_image = oi.id_image |
WHERE o.transmission = '1'; |
-- r1853 de CEL: ajout des INDEX (note: pas de commentaires sur les INDEX < MySQL 5.5) |
CREATE INDEX `date_transmission` ON `BASECEL`.`cel_obs` (`date_transmission` DESC) /* COMMENT "nécessaire à l'ORDER BY utilisé dans la liste d'observation de DEL" */ ; |
CREATE INDEX `transmission` ON `BASECEL`.`cel_obs` (`transmission`) /* COMMENT "nécessaire à CEL/DEL qui officie avec transmission = 1" */ ; |
-- cleanup |
DROP INDEX `tag_normalise_2` ON `BASEDEL`.`del_image_tag` ; |
DROP INDEX `ce_image_2` ON `BASEDEL`.`del_image_tag` ; |
DROP TABLE IF EXISTS `BASEDEL`.`del_image_stat`; |
CREATE TABLE IF NOT EXISTS `BASEDEL`.`del_image_stat` ( |
`ce_image` BIGINT(20) NOT NULL COMMENT 'id_image (tb_cel.cel_images)', |
`ce_protocole` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'un id de protocole', |
`moyenne` FLOAT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'moyenne des votes pour une image et un protocole donné', |
`nb_votes` SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'nombre de votes pour une image et un protocole donné', |
`nb_tags` TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT 'nombre de tags pictoflora pour une image donnée', |
PRIMARY KEY (`ce_image`, `ce_protocole`), |
KEY `ce_image` (`ce_image`), |
KEY `ce_protocole` (`ce_protocole`, `moyenne` DESC), |
KEY `nb_votes` (`nb_votes` DESC), |
KEY `nb_tags` (`nb_tags` DESC) |
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT 'table de stockage des statistiques utilisées pour les tri de PictoFlora'; |
INSERT INTO `BASEDEL`.`del_image_stat` ( |
SELECT id_image, divo.ce_protocole, divo.moyenne, divo.nb_votes, dit.ctags |
FROM `BASECEL`.`cel_images` ci |
LEFT JOIN |
( SELECT ce_image, ce_protocole, AVG(valeur) AS moyenne, COUNT(valeur) AS nb_votes |
FROM del_image_vote GROUP BY ce_image, ce_protocole ) AS divo |
ON ci.id_image = divo.ce_image |
LEFT JOIN |
( SELECT ce_image, COUNT(id_tag) as ctags FROM del_image_tag |
GROUP BY ce_image ) AS dit |
ON ci.id_image = dit.ce_image ); |
ALTER TABLE `BASEDEL`.`del_image_protocole` ADD `mots_cles` VARCHAR(600) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL; |
/branches/v1.7-oxygene/scripts/modules/maj/201310-propret.sql |
---|
New file |
0,0 → 1,103 |
DELIMITER | |
-- initialisation (structure) |
DROP PROCEDURE IF EXISTS update_struct; |
CREATE PROCEDURE update_struct() |
BEGIN |
-- ajout de la colonne "proposition_retenue" |
DECLARE CONTINUE HANDLER FOR SQLSTATE '42S21' SELECT "colonne proposition_retenue déjà existante"; /* = Duplicate column name */ |
ALTER TABLE `BASEDEL`.`del_commentaire` ADD `proposition_retenue` INT(1) NOT NULL DEFAULT 0 COMMENT "La proposition \"validée\" une fois que l'auteur à validé et que le nom_sel de cel_obs a été modifié à partir du nom_sel de del_commentaire."; -- ' |
END; |
| |
-- petite functon bonus |
DROP PROCEDURE IF EXISTS getCommentaires; |
CREATE PROCEDURE getCommentaires(IN _s1 INT(20)) |
BEGIN |
SELECT id_commentaire, ce_observation, ce_proposition, texte, nom_sel, nom_sel_nn, proposition_retenue FROM `BASEDEL`.`del_commentaire` WHERE ce_observation = _s1; |
END; |
| |
-- procédure créant des tables temporaires permettant de faciliter le processus de MAJ |
DROP PROCEDURE IF EXISTS rebuild_retenues; |
CREATE PROCEDURE rebuild_retenues() |
BEGIN |
DROP TEMPORARY TABLE IF EXISTS _temp_having_retenue, _temp_multi_prop, _temp_mono_prop; |
-- les observations déjà retenues (pour pouvoir être exclues des processus postérieurs) |
CREATE TEMPORARY TABLE _temp_having_retenue ENGINE=MEMORY AS ( \ |
SELECT ce_observation FROM `BASEDEL`.`del_commentaire` co WHERE proposition_retenue = 1); |
-- observations ayant plusieurs propositions (= commentaire dont nom_sel IS NOT NULL) |
CREATE TEMPORARY TABLE IF NOT EXISTS _temp_multi_prop ENGINE=MEMORY AS ( \ |
SELECT ce_observation FROM `BASEDEL`.`del_commentaire` co \ |
WHERE nom_sel IS NOT NULL \ |
AND proposition_retenue = 0 /* == ce_observation NOT IN (SELECT ce_proposition FROM _temp_having_retenue) */ \ |
GROUP BY ce_observation HAVING COUNT(id_commentaire) > 1); -- 1053 |
-- observations ayant une seule proposition (= commentaire dont nom_sel IS NOT NULL) |
CREATE TEMPORARY TABLE IF NOT EXISTS _temp_mono_prop ENGINE=MEMORY AS ( \ |
SELECT ce_observation FROM `BASEDEL`.`del_commentaire` \ |
WHERE nom_sel IS NOT NULL \ |
AND proposition_retenue = 0 /* == ce_observation NOT IN (SELECT ce_proposition FROM _temp_having_retenue) */ \ |
GROUP BY ce_observation HAVING COUNT(id_commentaire) = 1); |
END; |
| |
DELIMITER ; |
CALL update_struct(); |
-- table temporaire de tous les comptages (somme des votes pour chaque proposition de del_commentaire): |
CREATE TEMPORARY TABLE IF NOT EXISTS _temp_stats ENGINE=MEMORY AS ( SELECT ce_proposition, SUM(valeur) AS val FROM `BASEDEL`.`del_commentaire_vote` GROUP BY ce_proposition); -- 5912 |
-- propositions ayant eu au moins 1 vote positif non-anonyme |
CREATE TEMPORARY TABLE IF NOT EXISTS _temp_authvotepos ENGINE=MEMORY AS (SELECT DISTINCT ce_proposition FROM `BASEDEL`.`del_commentaire_vote` WHERE valeur = 1 AND LENGTH(ce_utilisateur) != 32 ORDER BY ce_proposition); -- 3794 |
CALL rebuild_retenues(); -- initialisation |
-- core |
-- SELECT ce_observation, id_commentaire FROM `BASEDEL`.`del_commentaire` co INNER JOIN _temp_multi_prop mp USING (ce_observation) INNER JOIN `BASECEL`.`cel_obs` ce ON mp.ce_observation = id_observation AND (co.nom_sel = ce.nom_sel AND co.nom_sel_nn = ce.nom_sel_nn) WHERE co.nom_sel_nn != 0 AND co.proposition_retenue = 0; -- 470, dont 464 ce_observation unique |
-- SELECT ce_observation, id_commentaire FROM `BASEDEL`.`del_commentaire` co INNER JOIN _temp_multi_prop mp USING (ce_observation) INNER JOIN `BASECEL`.`cel_obs` ce ON mp.ce_observation = id_observation AND (co.nom_sel = ce.nom_sel OR co.nom_sel_nn = ce.nom_sel_nn) WHERE co.nom_sel_nn != 0 AND co.proposition_retenue = 0; -- 520, dont 493 ce_observation unique |
-- Étant donné les doublons nous pouvons commencer ou finir par filtrer sur les stats de vote |
-- Comme il est plus simple de finir par ça, commençons correctement par les nom_sel comme ci-dessus avec ceux sans ambiguité: |
-- C'est à dire observations dotées de multiples proposition dont une et une seule match exactement le nom-sel du carnet en ligne |
CREATE TEMPORARY TABLE IF NOT EXISTS _temp_updatable1 ENGINE=MEMORY AS ( \ |
SELECT /* ce_observation, */ id_commentaire FROM `BASEDEL`.`del_commentaire` co \ |
INNER JOIN _temp_multi_prop mp USING (ce_observation) /* faisant partie des observations ayant plusieurs propositions */ \ |
INNER JOIN `BASECEL`.`cel_obs` ce ON mp.ce_observation = id_observation AND (co.nom_sel = ce.nom_sel AND co.nom_sel_nn = ce.nom_sel_nn) \ |
WHERE co.nom_sel_nn != 0 \ |
GROUP BY co.ce_observation HAVING COUNT(co.id_commentaire) = 1 /* observations n'ayant pas d'ambiguité sur le commentaire correspondant au nom du carnet en ligne */ ); -- 335 |
UPDATE `BASEDEL`.`del_commentaire` co SET co.proposition_retenue = 1 WHERE co.id_commentaire IN (SELECT id_commentaire FROM _temp_updatable1); |
SELECT ROW_COUNT() AS "nb MAJ par match sur nom_sel sans ambiguité"; |
CALL rebuild_retenues(); |
-- Pour les observations ayant plusieurs nom-sel communs au carnet en ligne, il s'agit de ne sélectionner que celle |
-- ayant le plus de vote (idéalement les propositions doublonnes ne devraient pas exister) |
CREATE TEMPORARY TABLE IF NOT EXISTS _temp_updatable2 ENGINE=MEMORY AS ( \ |
SELECT co.ce_observation, id_commentaire, i1.val FROM `BASEDEL`.`del_commentaire` co \ |
INNER JOIN _temp_multi_prop mp USING (ce_observation) /* uniquement les multi-propositions, inclue le check sur _temp_having_retenue */ \ |
INNER JOIN (SELECT ce_proposition, val FROM _temp_stats) AS i1 ON i1.ce_proposition = co.id_commentaire /* et ayant des votes */ \ |
INNER JOIN `BASECEL`.`cel_obs` ce ON co.ce_observation = ce.id_observation AND (co.nom_sel = ce.nom_sel AND co.nom_sel_nn = ce.nom_sel_nn) /* et un nom_sel acceptable */ \ |
WHERE co.nom_sel_nn != 0 \ |
GROUP BY ce_observation HAVING i1.val = MAX(i1.val) /* parmis les doublonnes, prendre la proposition ayant le plus de SUM(votes) */ \ |
ORDER BY ce_observation ); -- 249 (sans le processus précédent, moins autrement s'il l'on exclue les observation déjà "validée") |
UPDATE `BASEDEL`.`del_commentaire` co SET co.proposition_retenue = 1 WHERE co.id_commentaire IN (SELECT id_commentaire FROM _temp_updatable2); |
SELECT ROW_COUNT() AS "nb MAJ par nombre de vote"; |
CALL rebuild_retenues(); |
-- Enfin, les observation n'ayant qu'une seule proposition sont passées comme retenues si |
-- elles ont été notée positivement au moins une fois par un utilisateur authentifié |
CREATE TEMPORARY TABLE IF NOT EXISTS _temp_updatable3 ENGINE=MEMORY AS ( \ |
SELECT co.id_commentaire FROM `BASEDEL`.`del_commentaire` co \ |
INNER JOIN _temp_mono_prop AS i1 USING (ce_observation) /* l'inverse de _temp_multi_prop, inclue le check sur _temp_having_retenue */ \ |
INNER JOIN _temp_authvotepos ta ON co.id_commentaire = ta.ce_proposition /* et uniquement si faisant partie des commentaires doté d'un vote positif non-anonyme */ \ |
INNER JOIN `BASECEL`.`cel_obs` ce ON co.ce_observation = ce.id_observation AND (co.nom_sel = ce.nom_sel AND co.nom_sel_nn = ce.nom_sel_nn) \ |
WHERE co.nom_sel_nn != 0); -- 2216 sans test sur cel_obs, 2193 avec |
UPDATE `BASEDEL`.`del_commentaire` co SET co.proposition_retenue = 1 WHERE co.id_commentaire IN (SELECT id_commentaire FROM _temp_updatable3); |
SELECT ROW_COUNT() AS "nb MAJ ayant 1 seule proposition mais un vote non-anonyme positif"; |
CALL rebuild_retenues(); |
/branches/v1.7-oxygene/scripts/modules/maj/Makefile |
---|
New file |
0,0 → 1,36 |
celdb = tb_cel_test |
deldb = tb_del_test |
# helper |
do_subst = sed -e "1i--\n-- fichier d'origine: \"${1}\"\n" \ |
-e 's/`BASECEL`/`$(celdb)`/g' \ |
-e 's/`BASEDEL`/`$(deldb)`/g' \ |
$(1) |
# default target |
help: |
@echo "make o_maj1 [celdb=<$(celdb)>] [deldb=<$(deldb)>]" |
clean: |
rm -f *.comp.sql |
# maj1 contient: 201309-index-views.sql |
o_maj1: fichiers_generes = $(addsuffix .comp.sql,$(filter-out clean,$?)) |
o_maj1: clean o_201309-index-views |
cat $(fichiers_generes) > maj1.comp.sql |
# maj1 contient: 201310-propret.sql |
o_maj2: fichiers_generes = $(addsuffix .comp.sql,$(filter-out clean,$?)) |
o_maj2: clean o_201310-propret |
cat $(fichiers_generes) > maj2.comp.sql |
# SHOW INDEX FROM cel_obs WHERE Key_name = 'transmission'; |
# SHOW INDEX FROM cel_obs WHERE Key_name = 'date_transmission'; |
o_201309-index-views: |
$(call do_subst,201309-index-views.sql) > $@.comp.sql |
# SHOW COLUMNS FROM del_commentaire LIKE 'proposition_retenu'; |
o_201310-propret: |
$(call do_subst,201310-propret.sql) > $@.comp.sql |
Property changes: |
Added: svn:eol-style |
+native |
\ No newline at end of property |
/branches/v1.7-oxygene/scripts/modules/maj/README-Index-maj1.txt |
---|
New file |
0,0 → 1,106 |
1) accélérer le SELECT + ORDER BY sur del_observation |
C'est un aspect important de la requête car il représente près de 33% du temps. |
En local, près de 50ms sur 1.5s. |
Solution: |
CREATE INDEX `date_transmission` ON `cel_obs` (`date_transmission` DESC) COMMENT "nécessaire à l'ORDER BY utilisé dans la liste d'observation de DEL"; |
Malheureusement l'INDEX ne semble pas utilisable par la view (http://bugs.mysql.com/bug.php?id=43341 ?): |
EXPLAIN SELECT SQL_CALC_FOUND_ROWS id_observation FROM del_observation ORDER BY date_transmission desc LIMIT 0, 12; |
# Using filesort (0.46s) |
Allons donc invoquer directement la table, cependant, encore une fois l'INDEX n'est pas utilisé |
EXPLAIN SELECT SQL_CALC_FOUND_ROWS id_observation FROM tb_cel.cel_obs ORDER BY date_transmission desc LIMIT 0, 12; |
# Using filesort (0.46s) |
Nous pouvons forcer l'index: |
EXPLAIN SELECT SQL_CALC_FOUND_ROWS id_observation FROM tb_cel.cel_obs FORCE INDEX FOR ORDER BY (`date_transmission`) ORDER BY date_transmission desc LIMIT 0, 12; |
# key=date_transmission (0.0s) |
parfait ! |
Cependant, à peine ajoutons-nous le WHERE transmission = 1 que nous remontons à 0.60 seconde, et MySQL nous déconseille même l'utilisation de l'INDEX |
qui, en effet, ralenti la requête (2.38s): |
EXPLAIN SELECT SQL_CALC_FOUND_ROWS id_observation FROM tb_cel.cel_obs FORCE INDEX FOR ORDER BY (`date_transmission`) WHERE transmission = 1 ORDER BY date_transmission desc LIMIT 0, 12; |
# Using where; Using filesort (0.60s) |
# Using where; (key=date_transmission) (2.38s) [avec FORCE INDEX] |
Dans tous les cas ci-dessus, "rows" indique "291265", et le type "ref", sauf en "FORCE INDEX", mais comme nous l'avons vu, cela sous-optimal. |
Le processing de transmission = 1 est très (très) couteux et c'est lui qui s'avère bloquant. |
Tentons l'ajout d'un INDEX sur transmission ,tout TINYINT soit-il: |
CREATE INDEX `transmission` ON `tb_cel`.`cel_obs` (`transmission`) COMMENT "nécessaire à CEL/DEL qui officie avec transmission = 1" |
ANALYZE TABLE tb_cel.cel_obs; |
EXPLAIN SELECT id_observation FROM tb_cel.cel_obs WHERE transmission = 1 ORDER BY date_transmission desc LIMIT 0, 12; |
# key = date_transmission, rows = 17, type = index (0.0s) |
parfait... |
et idem pour: |
EXPLAIN SELECT * FROM del_observation ORDER BY date_transmission desc LIMIT 0, 12; |
La vue prend donc bien en compte nos 2 INDEX. |
MAIS... ... |
EXPLAIN SELECT SQL_CALC_FOUND_ROWS id_observation FROM tb_cel.cel_obs WHERE transmission = 1 ORDER BY date_transmission desc LIMIT 0, 12; |
# Using where; Using filesort, key = date_transmission, rows = 291265, type = index (0.80s) |
... à peine retrouvons-nous SQL_CALC_FOUND_ROWS() que les perf' sont à nouveau déplorable puis MySQL itère sur les 300k lignes à transmission=1 |
Cependant: |
EXPLAIN SELECT count(1) FROM del_observation; |
# key = transmission, 291265 = 17, type = ref, MAIS... "Using index" (0.10s) |
Ainsi pour une requête initiale: |
SELECT SQL_CALC_FOUND_ROWS dob.id_observation, nom_sel, famille, ce_zone_geo, zone_geo, lieudit, station, milieu, date_observation, dob.mots_cles_texte, date_transmission, dob.ce_utilisateur, prenom, nom, courriel, dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, dob.commentaire as dob_commentaire, dob.nt, dob.nom_sel_nn FROM del_observation AS dob LEFT JOIN del_utilisateur AS du ON dob.ce_utilisateur = du.id_utilisateur ORDER BY date_transmission desc LIMIT 0, 12 |
de 1.52s, la suppression SQL_CALC_FOUND_ROWS() nous amène à 0.00s + 0.10s de count() additionnel. |
Sans INDEX sur transmission, la requête est de même rapidité, mais le count(1), trois fois plus long (0.30s) |
Sans INDEX sur date_transmission, la requête est 4 fois plus longue (0.40s) et le count(1) identique (0.35s) |
Bref, les 2 INDEX sont intéressant même si l'idéal est de rendre optionnel l'affichage du total des résultats |
2) accélérer le GROUP en requête complexe: |
SELECT SQL_CALC_FOUND_ROWS dob.id_observation, nom_sel, famille, ce_zone_geo, zone_geo, lieudit, station, milieu, date_observation, dob.mots_cles_texte, date_transmission, di.id_image, dob.ce_utilisateur, prenom, nom, courriel, dob.prenom_utilisateur, dob.nom_utilisateur, dob.courriel_utilisateur, nom_original, dob.commentaire AS dob_commentaire, dob.nt, dob.nom_sel_nn FROM del_observation AS dob LEFT JOIN del_utilisateur AS du ON du.id_utilisateur = dob.ce_utilisateur LEFT JOIN del_obs_image AS doi ON doi.id_observation = dob.id_observation LEFT JOIN del_image AS di ON di.id_image = doi.id_image WHERE 1 GROUP BY doi.id_observation ORDER BY date_transmission desc LIMIT 0, 12 |
EXPLAIN SELECT dob.id_observation, di.id_image FROM cel_obs AS dob, cel_obs_images AS doi, cel_images AS di WHERE (transmission = 1 AND doi.id_observation = dob.id_observation AND di.id_image = doi.id_image) GROUP BY dob.id_observation ORDER BY date_transmission desc LIMIT 0, 12; |
+------+-------------+-------+--------+---------------------------+---------+---------+---------------------------+-------+----------------------------------------------+ |
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | |
+------+-------------+-------+--------+---------------------------+---------+---------+---------------------------+-------+----------------------------------------------+ |
| 1 | SIMPLE | doi | index | PRIMARY,observation,image | PRIMARY | 16 | NULL | 10314 | Using index; Using temporary; Using filesort | |
| 1 | SIMPLE | di | eq_ref | PRIMARY,id_image | PRIMARY | 8 | tb_cel.doi.id_image | 1 | Using index | |
| 1 | SIMPLE | dob | eq_ref | PRIMARY,transmission | PRIMARY | 8 | tb_cel.doi.id_observation | 1 | Using where | |
+------+-------------+-------+--------+---------------------------+---------+---------+---------------------------+-------+----------------------------------------------+ |
# 0.04s |
EXPLAIN SELECT dob.id_observation, di.id_image FROM del_observation AS dob, del_obs_image AS doi, del_image AS di WHERE (doi.id_observation = dob.id_observation AND di.id_image = doi.id_image) GROUP BY dob.id_observation ORDER BY date_transmission desc LIMIT 0, 12; |
+------+-------------+-------+--------+---------------------------+---------+---------+--------------------------+-------+----------------------------------------------+ |
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | |
+------+-------------+-------+--------+---------------------------+---------+---------+--------------------------+-------+----------------------------------------------+ |
| 1 | SIMPLE | oi | index | PRIMARY,observation,image | PRIMARY | 16 | NULL | 10314 | Using index; Using temporary; Using filesort | |
| 1 | SIMPLE | oi | ref | PRIMARY,observation,image | image | 8 | tb_cel.oi.id_image | 1 | | |
| 1 | SIMPLE | i | eq_ref | PRIMARY,id_image | PRIMARY | 8 | tb_cel.oi.id_image | 1 | Using index | |
| 1 | SIMPLE | o | eq_ref | PRIMARY,transmission | PRIMARY | 8 | tb_cel.oi.id_observation | 1 | Using where | |
| 1 | SIMPLE | o | eq_ref | PRIMARY,transmission | PRIMARY | 8 | tb_cel.oi.id_observation | 1 | Using where | |
| 1 | SIMPLE | o | eq_ref | PRIMARY,transmission | PRIMARY | 8 | tb_cel.oi.id_observation | 1 | Using where | |
+------+-------------+-------+--------+---------------------------+---------+---------+--------------------------+-------+----------------------------------------------+ |
# 1.67s |
En fait, del_image se définit comme suit: |
select `i`.`id_image` AS `id_image`,if((char_length(`i`.`ce_utilisateur`) <> 32),cast(`i`.`ce_utilisateur` as unsigned),0) AS `ce_utilisateur`,`i`.`prenom_utilisateur` AS `prenom_utilisateur`,`i`.`nom_utilisateur` AS `nom_utilisateur`,`i`.`courriel_utilisateur` AS `courriel_utilisateur`,`i`.`hauteur` AS `hauteur`,`i`.`largeur` AS `largeur`,`i`.`date_prise_de_vue` AS `date_prise_de_vue`,`i`.`mots_cles_texte` AS `mots_cles_texte`,`i`.`commentaire` AS `commentaire`,`i`.`nom_original` AS `nom_original`,`i`.`date_modification` AS `date_modification`,`i`.`date_creation` AS `date_creation`,`i`.`publiable_eflore` AS `publiable_eflore` from ((`tb_cel`.`cel_images` `i` join `tb_cel`.`cel_obs_images` `oi` on((`i`.`id_image` = `oi`.`id_image`))) join `tb_cel`.`cel_obs` `o` on((`oi`.`id_observation` = `o`.`id_observation`))) where (`o`.`transmission` = '1') |
soit déjà une double-jointure. |
EXPLAIN SELECT id_observation, id_image FROM del_image AS di GROUP BY id_observation ORDER BY date_transmission desc LIMIT 0, 12; |
+------+-------------+-------+--------+---------------------------+---------+---------+--------------------------+-------+----------------------------------------------+ |
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | |
+------+-------------+-------+--------+---------------------------+---------+---------+--------------------------+-------+----------------------------------------------+ |
| 1 | SIMPLE | oi | index | PRIMARY,observation,image | PRIMARY | 16 | NULL | 10314 | Using index; Using temporary; Using filesort | |
| 1 | SIMPLE | i | eq_ref | PRIMARY,id_image | PRIMARY | 8 | tb_cel.oi.id_image | 1 | Using index | |
| 1 | SIMPLE | o | eq_ref | PRIMARY,transmission | PRIMARY | 8 | tb_cel.oi.id_observation | 1 | Using where | |
+------+-------------+-------+--------+---------------------------+---------+---------+--------------------------+-------+----------------------------------------------+ |
# 0.04s |
/branches/v1.7-oxygene/scripts/modules/maj/. |
---|
New file |
Property changes: |
Added: svn:ignore |
+o_*.comp.sql |