Dotclear

Vous n'êtes pas identifié(e).

Annonce

13 février 2024 Sortie de Dotclear 2.29

#1 2007-11-17 01:30:46

prospere
Membre
Lieu : Nantes
Inscription : 2005-11-01
Site Web

Base de données : Index manquants

Bonjour,

J'ai modifié le Dblayer.php pour tracer les requêtes les plus longues.
D'après la liste des requêtes SQL, je pense que l'on peut rajouter un index sur :

- Le post_password et le post_status de la table dc_post
- Le champs meta_type de la table dc_meta.

0.538243 sec;SELECT meta_id, meta_type, COUNT(M.post_id) as count FROM dc_meta M LEFT JOIN dc_post P ON M.post_id = P.post_id WHERE P.blog_id = 'default'  AND meta_type = 'tag' AND ((post_status = 1 AND post_password IS NULL ) ) GROUP BY meta_id,meta_type,P.blog_id ORDER BY count DESC LIMIT 50 

0.629367 sec;SELECT P.post_id, P.blog_id, P.user_id, P.cat_id, post_dt, post_tz, post_creadt, post_upddt, post_format, post_password, post_url, post_lang, post_title, post_excerpt, post_excerpt_xhtml, post_content, post_content_xhtml, post_notes, post_type, post_meta, post_status, post_selected, post_open_comment, post_open_tb, nb_comment, nb_trackback, U.user_name, U.user_firstname, U.user_displayname, U.user_email, U.user_url, C.cat_title, C.cat_url FROM dc_post P INNER JOIN dc_user U ON U.user_id = P.user_id LEFT OUTER JOIN dc_category C ON P.cat_id = C.cat_id WHERE P.blog_id = 'default' AND ((post_status = 1 AND post_password IS NULL ) ) AND post_type = 'post' AND ( 	(post_dt = '2006-03-29 22:49:37' AND P.post_id < 315) 	OR post_dt < '2006-03-29 22:49:37' )  ORDER BY post_dt DESC, P.post_id DESC  LIMIT 1 

0.68021 sec;SELECT C.comment_id, comment_dt, comment_tz, comment_upddt, comment_author, comment_email, comment_site, comment_content,  comment_trackback, comment_status, comment_spam_status, comment_spam_filter, comment_ip, P.post_title, P.post_url, P.post_id, P.post_password, P.post_dt, P.user_id, U.user_email, U.user_url FROM dc_comment C INNER JOIN dc_post P ON C.post_id = P.post_id INNER JOIN dc_user U ON P.user_id = U.user_id WHERE P.blog_id = 'default' AND ((comment_status = 1 AND P.post_status = 1 AND post_password IS NULL ) ) ORDER BY comment_dt desc  LIMIT 10

Vous êtes d'accord avec moi ?

Hors ligne

#2 2007-11-17 01:33:28

prospere
Membre
Lieu : Nantes
Inscription : 2005-11-01
Site Web

Re : Base de données : Index manquants

Voici ma modification de la fonction select du fichier "inc/clearbricks/dblayer/dblayer.php" pour tracer les requêtes les plus longues.

        
         public function select($sql)
        {
                $starttime = microtime();
                $result = $this->db_query($this->__link,$sql);
                $endtime = microtime();

                $tracesql = false;
                $totaltime = $endtime - $starttime;

                // Si la requête est > à 0.5 sec
                if ($totaltime > 0.5 ){
                        $tracesql = true;
                }

                // On trace la requête
                if ($tracesql){

                        // Open the file and erase the contents if any
                        $fp = fopen("/tmp/db.log", "a");

                        $data = $totaltime . ";" . $sql . "\n";

                        // Write the data to the file
                        fwrite($fp, $data);

                        // Close the file
                        fclose($fp);
                }

                $this->__last_result =& $result;

                $info = array();
                $info['con'] =& $this;
                $info['cols'] = $this->db_num_fields($result);
                $info['rows'] = $this->db_num_rows($result);
                $info['info'] = array();

                for ($i=0; $i<$info['cols']; $i++) {
                        $info['info']['name'][] = $this->db_field_name($result,$i);
                        $info['info']['type'][] = $this->db_field_type($result,$i);
                }

                return new record($result,$info);
        }

Hors ligne

#3 2007-11-18 22:33:36

prospere
Membre
Lieu : Nantes
Inscription : 2005-11-01
Site Web

Re : Base de données : Index manquants

J'ai continué mon analyse :

ALTER TABLE `dc_post` ADD INDEX ( `post_status` , `post_password` )  ;
ALTER TABLE `dc_post` ADD INDEX ( `post_type` )  ;

ALTER TABLE `dc_meta` ADD INDEX ( `meta_type` )  ;

ALTER TABLE `dc_meta` ADD INDEX ( `comment_status` )  ;
ALTER TABLE `dc_meta` ADD INDEX ( `comment_dt` )  ;

http://www.geeek.org/post/2007/11/18/Op … de-donnees

Hors ligne

#4 2007-11-21 22:36:53

prospere
Membre
Lieu : Nantes
Inscription : 2005-11-01
Site Web

Re : Base de données : Index manquants

Pas de réactions ?

Hors ligne

#5 2007-11-21 22:44:56

prospere
Membre
Lieu : Nantes
Inscription : 2005-11-01
Site Web

Re : Base de données : Index manquants

Même pas un petit commentaire ;-) ?

Hors ligne

#6 2007-11-22 02:53:50

Pep
Membre
Inscription : 2004-08-24
Site Web

Re : Base de données : Index manquants

Pas encore, non. :-)

A part peut-être l'histoire des indexes sur comment_status et comment_dt pour la table dc_meta : j'avoue que là, ça m'épate... ;-)

Plus sérieusement, la multiplication des indexes n'est pas forcément une bonne chose.
Il faut donc se méfier et plus se baser sur les indications d'un EXPLAIN que sur des mesures ponctuelles.
Et puis pondérer tout ça en fonction de la fréquence des requêtes concernées. Etc.


Who Cares ?

Hors ligne

#7 2007-11-22 08:25:21

f_trt
Membre
Lieu : Saint Etienne De Tulmont
Inscription : 2005-08-05
Site Web

Re : Base de données : Index manquants

Si moi je trouve bien sympathique ton système de pistage maintenant PEP résume bien aussi la situation,
les indexes ne sont pas toujours des amis je veux dire par là qu'ils peuvent aussi être néfaste par exemple
le jour où il ont un problème d'intégrité... enfin souvent ils font du bien quand même.

Au passage merci pour ta petite astuce de traçage requète c'est un truc que je ré-emploierai quelque fois je pense,
mais surement sur des trucs à moi, la prog DC étant supérieure a mon niveau PHP.


http://www.amomp.com/recyclage-cartouche-encre.php Associez le geste écologique au geste solidaire, ne jetez plus vos cartouches d'encres
http://www.passion-tarn-et-garonne.info  Ma p'tite galerie et blog DC

Hors ligne

#8 2007-11-22 12:40:56

prospere
Membre
Lieu : Nantes
Inscription : 2005-11-01
Site Web

Re : Base de données : Index manquants

Je suis d'accord avec toi concernant la quantité d'index, il ne faut pas mettre des index partout, il faut en mettre seulement là où c'est utile (clauses Where, Group By, Order By).

Les trois requêtes qui ont été tracées sont des requêtes qui semblent être utilisées à chaque affichage de page sur mon blog. (sauf peut être à la première requête).

En metttant les index, j'ai pu faire disparaitre certaines requêtes de la liste. Cependant la requête n°2 reste toujours extremement consommatrice malgré l'ajout d'index

Vous avez des idées pistes ?

Dernière modification par prospere (2014-08-28 22:59:07)

Hors ligne

#9 2007-11-22 12:46:09

prospere
Membre
Lieu : Nantes
Inscription : 2005-11-01
Site Web

Re : Base de données : Index manquants

Pep a écrit :

A part peut-être l'histoire des indexes sur comment_status et comment_dt pour la table dc_meta : j'avoue que là, ça m'épate... ;-)

A oui .. en effet pardon il s'agit de la table dc_comment et pas de la table dc_meta

Hors ligne

#10 2008-01-23 12:16:48

Kraoc
Membre
Inscription : 2005-04-19
Site Web

Re : Base de données : Index manquants

ce qui pour une base PostgreSQL nous donnerais:

CREATE INDEX dc_idx_post_status_post_password ON dc_post USING btree (post_status, post_password);
CREATE INDEX dc_idx_post_type ON dc_post USING btree (post_type);
CREATE INDEX dc_idx_meta_type ON dc_meta USING btree (meta_type);
CREATE INDEX dc_idx_comment_status ON dc_comment USING btree (comment_status);
CREATE INDEX dc_idx_comment_dt ON dc_comment USING btree (comment_dt);

Hors ligne

Vous n'êtes pas identifié(e).

Pied de page des forums

Sites map