<?xml version="1.0" encoding="iso-8859-1" ?>
<rss version="2.0"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:content="http://purl.org/rss/1.0/modules/content/">

<channel>
  <title>Planet MySQL</title>
  <link>http://www.planetmysql.org/</link>
  <pubDate>Fri, 04 Jul 2008 18:51:31 +0000</pubDate>
  <language>fr</language>
  <description>Planet MySQL - http://www.planetmysql.org/</description>

  <item>
    <title>Calculer les centiles MySQL</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/trucs/18525-calculer_les_centiles_mysql.php</guid>
    <link>http://www.nexen.net/actualites/trucs/18525-calculer_les_centiles_mysql.php</link>
    <description>
					
				    
Les centiles sont une des 99 valeurs qui divise les données triées en 100 parts égales. Le premier centile (abusivement appelé percentile, de la version anglaise), identifie les valeurs le plus basses du groupe. On connaît souvent la médiane, qui découpe le groupe en 2 part de même taille : le concept est similaire.
Roland Bouman publie un article où il arrive à calculer les percentiles sans jointures, sous-requêtes ni variables utilisateurs : il se base sur GROUP_CONCAT, et SUBSTRING pour ordonner le groupe, et en extraire des portions intéressantes. Le tout se fait en une seule passe, et quelques manipulations de chaînes.
C'est un bon truc, mais je crois que je préfèrerai les variables utilisateurs, pour éviter de concaténer des chaînes trop grosses dans group_concat.&amp;nbsp;Calculating the Nth percentile in MySQL (0 visite)&amp;nbsp;Calculating the financial median in MySQL (0 visite)</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/statistics.png">
				    </div><div class="blogcontent">
Les centiles sont une des 99 valeurs qui divise les données triées en 100 parts égales. Le premier centile (abusivement appelé percentile, de la version anglaise), identifie les valeurs le plus basses du groupe. On connaît souvent la médiane, qui découpe le groupe en 2 part de même taille : le concept est similaire.<br />
Roland Bouman publie un article où il arrive à calculer les percentiles sans jointures, sous-requêtes ni variables utilisateurs : il se base sur GROUP_CONCAT, et SUBSTRING pour ordonner le groupe, et en extraire des portions intéressantes. Le tout se fait en une seule passe, et quelques manipulations de chaînes.<br />
C'est un bon truc, mais je crois que je préfèrerai les variables utilisateurs, pour éviter de concaténer des chaînes trop grosses dans group_concat.<ul><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://rpbouman.blogspot.com/2008/07/calculating-nth-percentile-in-mysql.html" title="http://rpbouman.blogspot.com/2008/07/calculating-nth-percentile-in-mysql.html"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Calculating+the+Nth+percentile+in+MySQL&amp;content_id=0'; return false;"  class="weblink_img">Calculating the Nth percentile in MySQL</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://rpbouman.blogspot.com/2007/12/calculating-financial-median-in-mysql.html" title="http://rpbouman.blogspot.com/2007/12/calculating-financial-median-in-mysql.html"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Calculating+the+financial+median+in+MySQL&amp;content_id=0'; return false;"  class="weblink_img">Calculating the financial median in MySQL</a> (0 visite)</li></ul></div>]]></content:encoded>
    <pubDate>Thu, 03 Jul 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>Vidéo PHP et MySQL, édition 51</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/php/18526-video_php_et_mysql,_edition_51.php</guid>
    <link>http://www.nexen.net/actualites/php/18526-video_php_et_mysql,_edition_51.php</link>
    <description>
					
				    
Voici les 5 dernières vidéos PHP et MySQL.

&amp;nbsp;PHP Streams : lucky dip (0 visite)
&amp;nbsp;Installer MAMP (0 visite)
&amp;nbsp;Symfony 1.1 Fabien Potencier (0 visite)
&amp;nbsp;Php 5.3 And Php 6 A Look Ahead DPC 2008, Amsterdam (0 visite)
&amp;nbsp;Web Browsers And Other Mistakes (0 visite)
&amp;nbsp;MySQL Tuning (0 visite)


Ces vidéos sont publiés sur les sites de partagent de vidéo. Ce sont des tutoriels enregistrés, des sessions de conférences, des screencast ou encore des slides de conférences. 


N'hésitez pas à nous contacter pour signaler tout media qui mérite d'être ajouté à cette liste.
</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/video.png">
				    </div><div class="blogcontent">
Voici les 5 dernières vidéos PHP et MySQL.<br />
<ul><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.nexen.net/video.php?video=171" title="http://www.nexen.net/video.php?video=171"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=PHP+Streams+%3A+lucky+dip&amp;content_id=0'; return false;"  class="weblink_img">PHP Streams : lucky dip</a> (0 visite)</li><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.nexen.net/video.php?video=170" title="http://www.nexen.net/video.php?video=170"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Installer+MAMP&amp;content_id=0'; return false;"  class="weblink_img">Installer MAMP</a> (0 visite)</li><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.nexen.net/video.php?video=168" title="http://www.nexen.net/video.php?video=168"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Symfony+1.1+Fabien+Potencier&amp;content_id=0'; return false;"  class="weblink_img">Symfony 1.1 Fabien Potencier</a> (0 visite)</li><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.nexen.net/video.php?video=167" title="http://www.nexen.net/video.php?video=167"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Php+5.3+And+Php+6+A+Look+Ahead+DPC+2008%2C+Amsterdam&amp;content_id=0'; return false;"  class="weblink_img">Php 5.3 And Php 6 A Look Ahead DPC 2008, Amsterdam</a> (0 visite)</li><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.nexen.net/video.php?video=166" title="http://www.nexen.net/video.php?video=166"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Web+Browsers+And+Other+Mistakes&amp;content_id=0'; return false;"  class="weblink_img">Web Browsers And Other Mistakes</a> (0 visite)</li><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.nexen.net/video.php?video=165" title="http://www.nexen.net/video.php?video=165"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=MySQL+Tuning&amp;content_id=0'; return false;"  class="weblink_img">MySQL Tuning</a> (0 visite)</li><br />
</ul><br />
<p><br />
Ces vidéos sont publiés sur les sites de partagent de vidéo. Ce sont des tutoriels enregistrés, des sessions de conférences, des screencast ou encore des slides de conférences. <br />
</p><br />
<p><br />
N'hésitez pas à nous contacter pour signaler tout media qui mérite d'être ajouté à cette liste.<br />
</p></div>]]></content:encoded>
    <pubDate>Thu, 03 Jul 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>MySQL proxy tests de performances</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/mysql/18522-mysql_proxy_tests_de_performances.php</guid>
    <link>http://www.nexen.net/actualites/mysql/18522-mysql_proxy_tests_de_performances.php</link>
    <description>
					
				    
Alex Tomic a testé le proxy MySQL en charge sur EC2 : un proxy et 4 serveurs MySQL. Les requêtes sont réparties sur 4 serveurs MySQL, et distribuées (entrée et sortie) via le proxy. Les résultats montrent que le point critique est entre 4 et 8 threads concurrents : en dessous de ce niveau d'activité, le surcoût de MySQL proxy rend l'architecture plus lente. Une fois ce cap passé, le gain devient plus intéressant, et l'archi proxy est capable de monter en puissance jusqu'à 4 fois la charge nominale de chaque serveur.&amp;nbsp;mysql proxy 0.6.1 performance tests (0 visite)&amp;nbsp;mysql proxy project (0 visite)</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/perilleux.png">
				    </div><div class="blogcontent">
Alex Tomic a testé le proxy MySQL en charge sur EC2 : un proxy et 4 serveurs MySQL. Les requêtes sont réparties sur 4 serveurs MySQL, et distribuées (entrée et sortie) via le proxy. Les résultats montrent que le point critique est entre 4 et 8 threads concurrents : en dessous de ce niveau d'activité, le surcoût de MySQL proxy rend l'architecture plus lente. Une fois ce cap passé, le gain devient plus intéressant, et l'archi proxy est capable de monter en puissance jusqu'à 4 fois la charge nominale de chaque serveur.<ul><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://tomictech.com/2008/07/02/mysql-proxy-061-performance-tests/" title="http://tomictech.com/2008/07/02/mysql-proxy-061-performance-tests/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=mysql+proxy+0.6.1+performance+tests&amp;content_id=0'; return false;"  class="weblink_img">mysql proxy 0.6.1 performance tests</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://forge.mysql.com/wiki/MySQL_Proxy" title="http://forge.mysql.com/wiki/MySQL_Proxy"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=mysql+proxy+project&amp;content_id=0'; return false;"  class="weblink_img">mysql proxy project</a> (0 visite)</li></ul></div>]]></content:encoded>
    <pubDate>Wed, 02 Jul 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>Revue de MONyog, moniteur pour MySQL</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/logiciels/18515-revue_de_monyog,_moniteur_pour_mysql.php</guid>
    <link>http://www.nexen.net/actualites/logiciels/18515-revue_de_monyog,_moniteur_pour_mysql.php</link>
    <description>
					
				    
Sheeri Kabral passe en revue MONyog, un moniteur MySQL dédié. Il s'installe en quelques minutes, surveille les requêtes SQL (tentatives de piratage, qualité des requêtes SQL), et produit des graphiques de performances. MONYog se distingue des autres outils de surveillance, comme MySQL entreprise, par l'absence d'agent local : pas besoin d'installation particulière sur le serveur de destination pour le suivre.
MONyog coûte 129 $ US, avec 1 an de support.&amp;nbsp;Reviewing MONyog (0 visite)&amp;nbsp;MONyog (0 visite)&amp;nbsp;MonYog screenshot (0 visite)</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/monyog.png">
				    </div><div class="blogcontent">
Sheeri Kabral passe en revue MONyog, un moniteur MySQL dédié. Il s'installe en quelques minutes, surveille les requêtes SQL (tentatives de piratage, qualité des requêtes SQL), et produit des graphiques de performances. MONYog se distingue des autres outils de surveillance, comme MySQL entreprise, par l'absence d'agent local : pas besoin d'installation particulière sur le serveur de destination pour le suivre.<br />
MONyog coûte 129 $ US, avec 1 an de support.<ul><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.pythian.com/blogs/1086/reviewing-monyog" title="http://www.pythian.com/blogs/1086/reviewing-monyog"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Reviewing+MONyog&amp;content_id=0'; return false;"  class="weblink_img">Reviewing MONyog</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://webyog.com/en/index.php" title="http://webyog.com/en/index.php"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=MONyog&amp;content_id=0'; return false;"  class="weblink_img">MONyog</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://webyog.com/en/screenshots_monyog.php" title="http://webyog.com/en/screenshots_monyog.php"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=MonYog+screenshot&amp;content_id=0'; return false;"  class="weblink_img">MonYog screenshot</a> (0 visite)</li></ul></div>]]></content:encoded>
    <pubDate>Tue, 01 Jul 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>Les tables de décisions en MySQL</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/tutorial/18510-les_tables_de_decisions_en_mysql.php</guid>
    <link>http://www.nexen.net/actualites/tutorial/18510-les_tables_de_decisions_en_mysql.php</link>
    <description>
					
				    
Les tables de décisions rassemblent la logique métier dans un tableau, simple à lire et à comprendre. &quot;Les tables de décisions, pour moi [Jonathan], prennent tout leur sens dans le fait que leur logique métier est aisée à comprendre, et peut être facilement vérifiée.&quot;
Jonathan suit alors son idée de stocker de telles tables en base de données, avec la possibilité de les traduire en code (PHP ou autre) facilement. Cela redonne la main aux utilisateurs pour établir leurs processus de fonctionnement. L'article ne va pas aussi loin, mais c'est déjà un bon début.&amp;nbsp;Decisions in Your Tables (0 visite)</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/deception.png">
				    </div><div class="blogcontent">
Les tables de décisions rassemblent la logique métier dans un tableau, simple à lire et à comprendre. "Les tables de décisions, pour moi [Jonathan], prennent tout leur sens dans le fait que leur logique métier est aisée à comprendre, et peut être facilement vérifiée."<br />
Jonathan suit alors son idée de stocker de telles tables en base de données, avec la possibilité de les traduire en code (PHP ou autre) facilement. Cela redonne la main aux utilisateurs pour établir leurs processus de fonctionnement. L'article ne va pas aussi loin, mais c'est déjà un bon début.<ul><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://mysqlbarbeque.blogspot.com/2008/06/decisions-in-your-tables.html" title="http://mysqlbarbeque.blogspot.com/2008/06/decisions-in-your-tables.html"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Decisions+in+Your+Tables&amp;content_id=0'; return false;"  class="weblink_img">Decisions in Your Tables</a> (0 visite)</li></ul></div>]]></content:encoded>
    <pubDate>Mon, 30 Jun 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>Mélanger des commandes Shell avec du code SQL</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/trucs/18505-melanger_des_commandes_shell_avec_du_code_sql.php</guid>
    <link>http://www.nexen.net/actualites/trucs/18505-melanger_des_commandes_shell_avec_du_code_sql.php</link>
    <description>
					
				    
&quot;Lorsque vous utilisez MySQL en mode batch, vous aurez souvent besoin d'utiliser les commandes en ligne UNIX en collaboration avec des requêtes SQL. Ce script de démonstration vous montre comment faire cela.&quot;
Amit K. Saha présente ici un truc pratique pour tout faire dans un script Shell, sans passer par un langage de programmation complémentaire.&amp;nbsp;Mixing SQL and shell commands in MySQL (0 visite)</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/treemap.png">
				    </div><div class="blogcontent">
"Lorsque vous utilisez MySQL en mode batch, vous aurez souvent besoin d'utiliser les commandes en ligne UNIX en collaboration avec des requêtes SQL. Ce script de démonstration vous montre comment faire cela."<br />
Amit K. Saha présente ici un truc pratique pour tout faire dans un script Shell, sans passer par un langage de programmation complémentaire.<ul><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://blogs.sun.com/amitsaha/entry/mixing_sql_and_shell_commands" title="http://blogs.sun.com/amitsaha/entry/mixing_sql_and_shell_commands"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Mixing+SQL+and+shell+commands+in+MySQL&amp;content_id=0'; return false;"  class="weblink_img">Mixing SQL and shell commands in MySQL</a> (0 visite)</li></ul></div>]]></content:encoded>
    <pubDate>Sun, 29 Jun 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>Trouver les index MySQL inutiles</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/tutorial/18506-trouver_les_index_mysql_inutiles.php</guid>
    <link>http://www.nexen.net/actualites/tutorial/18506-trouver_les_index_mysql_inutiles.php</link>
    <description>
					
				    
Arjen Lentz propose la requête suivante pour détecter les index qui ne servent à rien dans MySQL : 
&amp;nbsp;
&amp;nbsp;
SELECT s.table_name,
&amp;nbsp;
       concat&amp;#40;s.index_name,'(',group_concat&amp;#40;s.column_name order by s.seq_in_index&amp;#41;,')'&amp;#41; as idx,
&amp;nbsp;
       GROUP_CONCAT&amp;#40;s.cardinality ORDER BY s.seq_in_index&amp;#41; AS card,
&amp;nbsp;
       t.table_rows
&amp;nbsp;
  FROM information_schema.tables t
&amp;nbsp;
  JOIN information_schema.statistics s USING &amp;#40;table_schema,table_name&amp;#41;
&amp;nbsp;
 WHERE t.table_schema='dbname'
&amp;nbsp;
   AND t.table_rows &amp;gt; 1000
&amp;nbsp;
   AND s.non_unique
&amp;nbsp;
 GROUP BY s.table_name,s.index_name
&amp;nbsp;
HAVING &amp;#40;card + 0&amp;#41; &amp;lt; &amp;#40;t.table_rows / 3&amp;#41;;
&amp;nbsp;
La requête utilise la base information_schema (MySQL 5.0 et supérieur), pour repérer les index dont la cardinalité est inférieure à 30% : c'est le niveau à partir duquel MySQL va décider que l'index est utile, et en dessous de ce niveau, MySQL décidera d'ignorer l'index et de tout analyser. Cela revient à décider de tout ranger quand le désordre est tellement grand que corriger les erreurs sera beaucoup plus long encore.&amp;nbsp;Arjen's Journal - Finding useless indexes (0 visite)</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/open.query.png">
				    </div><div class="blogcontent">
Arjen Lentz propose la requête suivante pour détecter les index qui ne servent à rien dans MySQL : <br />
<pre>&nbsp;
&nbsp;
SELECT s.table_name,
&nbsp;
       concat<span style="color: #66cc66;">&#40;</span>s.index_name,<span style="color: #ff0000;">'('</span>,group_concat<span style="color: #66cc66;">&#40;</span>s.column_name order by s.seq_in_index<span style="color: #66cc66;">&#41;</span>,<span style="color: #ff0000;">')'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">as</span> idx,
&nbsp;
       GROUP_CONCAT<span style="color: #66cc66;">&#40;</span>s.cardinality ORDER BY s.seq_in_index<span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">AS</span> card,
&nbsp;
       t.table_rows
&nbsp;
  FROM information_schema.tables t
&nbsp;
  <a href="http://www.php.net/join"><span style="color: #000066;">JOIN</span></a> information_schema.statistics s USING <span style="color: #66cc66;">&#40;</span>table_schema,table_name<span style="color: #66cc66;">&#41;</span>
&nbsp;
 WHERE t.table_schema=<span style="color: #ff0000;">'dbname'</span>
&nbsp;
   AND t.table_rows &gt; <span style="color: #cc66cc;">1000</span>
&nbsp;
   AND s.non_unique
&nbsp;
 GROUP BY s.table_name,s.index_name
&nbsp;
HAVING <span style="color: #66cc66;">&#40;</span>card + <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> &lt; <span style="color: #66cc66;">&#40;</span>t.table_rows / <span style="color: #cc66cc;">3</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;</pre><br />
La requête utilise la base information_schema (MySQL 5.0 et supérieur), pour repérer les index dont la cardinalité est inférieure à 30% : c'est le niveau à partir duquel MySQL va décider que l'index est utile, et en dessous de ce niveau, MySQL décidera d'ignorer l'index et de tout analyser. Cela revient à décider de tout ranger quand le désordre est tellement grand que corriger les erreurs sera beaucoup plus long encore.<ul><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://arjen-lentz.livejournal.com/122399.html" title="http://arjen-lentz.livejournal.com/122399.html"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Arjens+Journal+Finding+useless+indexes&amp;content_id=0'; return false;"  class="weblink_img">Arjen's Journal - Finding useless indexes</a> (0 visite)</li></ul></div>]]></content:encoded>
    <pubDate>Sun, 29 Jun 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>Alertes sécurité des applications PHP et MySQL, édition 208</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/securite/18499-alertes_securite_des_applications_php_et_mysql,_edition_208.php</guid>
    <link>http://www.nexen.net/actualites/securite/18499-alertes_securite_des_applications_php_et_mysql,_edition_208.php</link>
    <description>
					
				    

PHP et MySQL ne font l'objet d'aucune alerte de sécurité dans leurs versions courantes :
PHP 5.2.6 et 4.4.8; MySQL 5.0.51 (communauté) , 5.1.25 et 6.0.5. 
Les mises à jour sont recommandées vers ces versions.


5 alertes de sécurité ont été émises cette semaine, concernant des applications suivantes : 
Drupal, Gallery, Joomla, phpMyAdmin et vBulletin


Drupal TrailScout Module Cross-Site Scripting and SQL I...
&amp;nbsp;http://secunia.com/advisories/30764/ (0 visite)
Site : &amp;nbsp;http://drupal.org/ (0 visite)
Gallery 2.2.4 and Prior Versions Multiple Vulnerabilities
&amp;nbsp;http://www.securityfocus.com/bid/29681 (0 visite)
Site : &amp;nbsp;http://gallery.sourceforge.net/ (0 visite)
Joomla EXP Shop Component &amp;quot;catid&amp;quot; SQL Injection
&amp;nbsp;http://www.secunia.com/advisories/30791/ (0 visite)
Site : &amp;nbsp;http://www.frsirt.com/bulletins/14801 (0 visite)
phpMyAdmin &quot;libraries&quot; Scripts Cross Site Scripting Vulnerabilities
&amp;nbsp;http://www.phpmyadmin.net/ (0 visite)
Site : &amp;nbsp;http://www.securityfocus.com/archive/1/493471 (0 visite)
vBulletin 3.7.1 PL1 and lower, vBulletin 3.6.10 PL1: ...
&amp;nbsp;http://www.vbulletin.com/ (0 visite)
Site : &amp;nbsp;frsirt (0 visite)


&amp;nbsp;phpsecure (0 visite)
&amp;nbsp;secunia (0 visite)
&amp;nbsp;securityfocus (0 visite)
</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/securite.png">
				    </div><div class="blogcontent">
<p><br />
PHP et MySQL ne font l'objet d'aucune alerte de sécurité dans leurs versions courantes :<br />
PHP 5.2.6 et 4.4.8; MySQL 5.0.51 (communauté) , 5.1.25 et 6.0.5. <br />
Les mises à jour sont recommandées vers ces versions.<br />
</p><br />
<p><br />
5 alertes de sécurité ont été émises cette semaine, concernant des applications suivantes : <br />
Drupal, Gallery, Joomla, phpMyAdmin et vBulletin<br />
</p><br />
<ul><br />
<li><strong>Drupal TrailScout Module Cross-Site Scripting and SQL I...</strong><br />
<img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://secunia.com/advisories/30764/" title="http://secunia.com/advisories/30764/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fsecunia.com%2Fadvisories%2F30764%2F&amp;content_id=0'; return false;"  class="weblink_img">http://secunia.com/advisories/30764/</a> (0 visite)<br />
<em>Site :</em> <img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://drupal.org/" title="http://drupal.org/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fdrupal.org%2F&amp;content_id=0'; return false;"  class="weblink_img">http://drupal.org/</a> (0 visite)</li><br />
<li><strong>Gallery 2.2.4 and Prior Versions Multiple Vulnerabilities</strong><br />
<img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.securityfocus.com/bid/29681" title="http://www.securityfocus.com/bid/29681"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fwww.securityfocus.com%2Fbid%2F29681&amp;content_id=0'; return false;"  class="weblink_img">http://www.securityfocus.com/bid/29681</a> (0 visite)<br />
<em>Site :</em> <img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://gallery.sourceforge.net/" title="http://gallery.sourceforge.net/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fgallery.sourceforge.net%2F&amp;content_id=0'; return false;"  class="weblink_img">http://gallery.sourceforge.net/</a> (0 visite)</li><br />
<li><strong>Joomla EXP Shop Component &quot;catid&quot; SQL Injection</strong><br />
<img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.secunia.com/advisories/30791/" title="http://www.secunia.com/advisories/30791/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fwww.secunia.com%2Fadvisories%2F30791%2F&amp;content_id=0'; return false;"  class="weblink_img">http://www.secunia.com/advisories/30791/</a> (0 visite)<br />
<em>Site :</em> <img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.frsirt.com/bulletins/14801" title="http://www.frsirt.com/bulletins/14801"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fwww.frsirt.com%2Fbulletins%2F14801&amp;content_id=0'; return false;"  class="weblink_img">http://www.frsirt.com/bulletins/14801</a> (0 visite)</li><br />
<li><strong>phpMyAdmin "libraries" Scripts Cross Site Scripting Vulnerabilities</strong><br />
<img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.phpmyadmin.net/" title="http://www.phpmyadmin.net/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fwww.phpmyadmin.net%2F&amp;content_id=0'; return false;"  class="weblink_img">http://www.phpmyadmin.net/</a> (0 visite)<br />
<em>Site :</em> <img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.securityfocus.com/archive/1/493471" title="http://www.securityfocus.com/archive/1/493471"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fwww.securityfocus.com%2Farchive%2F1%2F493471&amp;content_id=0'; return false;"  class="weblink_img">http://www.securityfocus.com/archive/1/493471</a> (0 visite)</li><br />
<li><strong>vBulletin 3.7.1 PL1 and lower, vBulletin 3.6.10 PL1: ...</strong><br />
<img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.vbulletin.com/" title="http://www.vbulletin.com/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fwww.vbulletin.com%2F&amp;content_id=0'; return false;"  class="weblink_img">http://www.vbulletin.com/</a> (0 visite)<br />
<em>Site :</em> <img src= "http://www.nexen.net/nx_media/images/drapeaux/fr.png" alt="fr" witdth="18" height="12" />&nbsp;<a href="http://www.frsirt.com/" title="http://www.frsirt.com/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=frsirt&amp;content_id=0'; return false;"  class="weblink_img">frsirt</a> (0 visite)</li><br />
</ul><br />
<ul><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/fr.png" alt="fr" witdth="18" height="12" />&nbsp;<a href="http://www.phpsecure.info/" title="http://www.phpsecure.info/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=phpsecure&amp;content_id=0'; return false;"  class="weblink_img">phpsecure</a> (0 visite)</li><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/fr.png" alt="fr" witdth="18" height="12" />&nbsp;<a href="http://secunia.com/" title="http://secunia.com/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=secunia&amp;content_id=0'; return false;"  class="weblink_img">secunia</a> (0 visite)</li><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/fr.png" alt="fr" witdth="18" height="12" />&nbsp;<a href="http://www.securityfocus.com/search" title="http://www.securityfocus.com/search"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=securityfocus&amp;content_id=0'; return false;"  class="weblink_img">securityfocus</a> (0 visite)</li><br />
</ul></div>]]></content:encoded>
    <pubDate>Fri, 27 Jun 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>Nouvelle version de MySQL : 6.0.5</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/mysql/18500-nouvelle_version_de_mysql_:_6.0.5.php</guid>
    <link>http://www.nexen.net/actualites/mysql/18500-nouvelle_version_de_mysql_:_6.0.5.php</link>
    <description>
					
				    
MySQL 6.0.5, avec la dernière version de Falcon, est disponible au téléchargement. MySQL 6.0 inclut essentiellement le nouveau moteur Falcon, développé pour MySQL par Jim Starkey. 
MySQL 6.0.4 apporte 2 correctifs de sécurité, portant sur  les tables MyISAM et la version Microsoft. Un total de 400 bugs ont été corrigés dans cette nouvelle version.
Changements incompatibles : 

Les tables de logs sont maintenant de type FILE, et non plus TABLE.
La bibliothèque de conversion chaîne  nombre a été changée
MySQL Cluster est doit être téléchargé séparément
NDB_LE_MemoryUsage.page_size_kb est renommé page_size_bytes
Une colonne ROUTINE_TYPE a été ajouté dans information_schema.PARAMETER

Corrections : 

Sécurité : Correction liées aux tables MyISAM et aux options DATA DIRECTORY
et INDEX DIRECTORY.
Correction sur les versions Microsoft Windows Vista et Server 2008.
Correction des AUTO_INCREMENT du NDB
Correction d'un bug de réplication lors des crash sur UPDATE
Il n'est plus possible de créer de fichiers de plus de 4 Go sur les systèmes 32 bits
FRAC_SECOND n'est plus un synonyme de MICROSECOND
InnoDB affiche l'espace libre dans son status.
Changement de traitement pour les espaces finaux 
Correction du déclenchement de TRIGGER AFTER UPDATE
Amélioration de la gestion du réseau par la réplication
&amp;nbsp;MySQL 6.0 home page (0 visite)&amp;nbsp;Téléchargement mysql 6.0.5 (0 visite)&amp;nbsp;News MySQL 6.0.5 (0 visite)&amp;nbsp;Falcon Evaluation Guide (0 visite)&amp;nbsp;Falcon White Paper (0 visite)</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/mysql.png">
				    </div><div class="blogcontent">
MySQL 6.0.5, avec la dernière version de Falcon, est disponible au téléchargement. MySQL 6.0 inclut essentiellement le nouveau moteur Falcon, développé pour MySQL par Jim Starkey. <br />
MySQL 6.0.4 apporte 2 correctifs de sécurité, portant sur  les tables MyISAM et la version Microsoft. Un total de 400 bugs ont été corrigés dans cette nouvelle version.<br />
Changements incompatibles : <br />
<ul><br />
<li>Les tables de logs sont maintenant de type FILE, et non plus TABLE.</li><br />
<li>La bibliothèque de conversion chaîne <-> nombre a été changée</li><br />
<li>MySQL Cluster est doit être téléchargé séparément</li><br />
<li>NDB_LE_MemoryUsage.page_size_kb est renommé page_size_bytes</li><br />
<li>Une colonne ROUTINE_TYPE a été ajouté dans information_schema.PARAMETER</li><br />
</ul><br />
Corrections : <br />
<ul><br />
<li>Sécurité : Correction liées aux tables MyISAM et aux options DATA DIRECTORY</li><br />
et INDEX DIRECTORY.<br />
<li>Correction sur les versions Microsoft Windows Vista et Server 2008.</li><br />
<li>Correction des AUTO_INCREMENT du NDB</li><br />
<li>Correction d'un bug de réplication lors des crash sur UPDATE</li><br />
<li>Il n'est plus possible de créer de fichiers de plus de 4 Go sur les systèmes 32 bits</li><br />
<li>FRAC_SECOND n'est plus un synonyme de MICROSECOND</li><br />
<li>InnoDB affiche l'espace libre dans son status.</li><br />
<li>Changement de traitement pour les espaces finaux </li><br />
<li>Correction du déclenchement de TRIGGER AFTER UPDATE</li><br />
<li>Amélioration de la gestion du réseau par la réplication</li><br />
<ul><ul><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.mysql.com/mysql60/" title="http://www.mysql.com/mysql60/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=MySQL+6.0+home+page&amp;content_id=0'; return false;"  class="weblink_img">MySQL 6.0 home page</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://dev.mysql.com/downloads/mysql/6.0.html" title="http://dev.mysql.com/downloads/mysql/6.0.html"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=TAclAcchargement+mysql+6.0.5&amp;content_id=0'; return false;"  class="weblink_img">Téléchargement mysql 6.0.5</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://dev.mysql.com/doc/refman/6.0/en/news-6-0-5.html" title="http://dev.mysql.com/doc/refman/6.0/en/news-6-0-5.html"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=News+MySQL+6.0.5&amp;content_id=0'; return false;"  class="weblink_img">News MySQL 6.0.5</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.mysql.com/why-mysql/white-papers/falcon-getting-started.php" title="http://www.mysql.com/why-mysql/white-papers/falcon-getting-started.php"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Falcon+Evaluation+Guide&amp;content_id=0'; return false;"  class="weblink_img">Falcon Evaluation Guide</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.mysql.com/why-mysql/white-papers/storage-engines-falcon.php" title="http://www.mysql.com/why-mysql/white-papers/storage-engines-falcon.php"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Falcon+White+Paper&amp;content_id=0'; return false;"  class="weblink_img">Falcon White Paper</a> (0 visite)</li></ul></div>]]></content:encoded>
    <pubDate>Fri, 27 Jun 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>Les index MySQL : types, placements, efficacité</title>
    <guid isPermaLink="false">http://www.dbnewz.com/?p=48</guid>
    <link>http://www.dbnewz.com/2008/06/27/les-index-mysql-types-placements-efficacite/</link>
    <description>Déjà trois semaines d&amp;#8217;écoulées depuis que certains d&amp;#8217;entre vous, les &amp;#8220;héros&amp;#8221;, ont posé leurs questions (oui il est possible de devenir un héros rien qu&amp;#8217;en lisant dbnewz ! Les véritables héros sont d&amp;#8217;ailleurs abonnés au tout nouveau flux feedburner  )
Trois semaines d&amp;#8217;attente, cela mérite un billet digne de ce nom, c&amp;#8217;est parti.
Indexer, pourquoi ?L&amp;#8217;indexation peut avoir plusieurs buts : - Accéder à ses données plus rapidement, les index sont en effet l&amp;#8217;outil le plus puissant pour accélérer les temps d&amp;#8217;exécution de vos requêtes jusqu&amp;#8217;à parfois plusieurs centaines de % !- Définir le degré d&amp;#8217;unicité d&amp;#8217;une colonne donnée : chaque champ doit-il être unique ? les doublons sont-ils autorisés ?Principe de fonctionnementLorsque vous envoyez une requête à votre serveur MySQL, celle-ci est d&amp;#8217;abord confiée au &amp;#8220;parseur&amp;#8221; SQL qui a pour but de vérifier si la syntaxe de votre demande est correcte. Cette étape franchie, la requête passe par &amp;#8220;l&amp;#8217;optimiseur&amp;#8221;. Il s&amp;#8217;agit ici de déterminer le plan d&amp;#8217;exécution de la requête afin que celle-ci s&amp;#8217;exécute le plus rapidement possible.
L&amp;#8217;optimiseur détecte si d&amp;#8217;éventuels index sont disponibles, si c&amp;#8217;est le cas il décidera de s&amp;#8217;en servir&amp;#8230; ou pas : il est parfois plus rapide de ne pas se servir d&amp;#8217;un index ! Nous verrons pourquoi au cours de cette série d&amp;#8217;articles.
Une fois le plan d&amp;#8217;exécution achevé, c&amp;#8217;est le moteur de stockage qui prend le relais, celui-ci peut être vu comme un &amp;#8220;module&amp;#8221; de MySQL :

Pour schématiser, et dans un monde idéal, lorsqu&amp;#8217;un index est disponible et &amp;#8220;compatible&amp;#8221; avec votre requête, l&amp;#8217;optimiseur MySQL peut décider de l&amp;#8217;utiliser afin d&amp;#8217;éviter de parcourir l&amp;#8217;ensemble des données des tables concernées.
Un exemple couramment employé pour illustrer ce propos consiste à imaginer la difficultée que nous aurions à retrouver quelqu&amp;#8217;un dans l&amp;#8217;annuaire si nous connaissions son nom mais pas l&amp;#8217;alphabet (qui est notre index)&amp;#8230; Transposé au monde informatique cela donne un serveur MySQL qui compare une à une les entrées du botin pour trouver toutes celles qui correspondent au nom recherché. Si au contraire ce nom est indexé, et si celui-ci commence par exemple par &amp;#8216;T&amp;#8217;, le serveur sait directement qu&amp;#8217;il doit démarrer sa recherche à partir du &amp;#8216;T&amp;#8217;. Imaginez l&amp;#8217;impact en terme de gain de temps lorsque plusieurs jointures sont concernées : deux tables de 10 000 lignes chacune forment un produit cartésien de 100 000 lignes environ à étudier&amp;#8230;Les index n&amp;#8217;ont hélas pas que des avantages :- Les opérations de mises à jour (INSERT, UPDATE, DELETE) sont en effet ralenties puisqu&amp;#8217;en plus des données, les index doivent eux aussi être mis à jour lors de ces opérations, c&amp;#8217;est le prix à payer&amp;#8230; Ce prix peut néamoins se &amp;#8220;négocier&amp;#8221;, nous verrons cela plus tard.Notre terrain de jeu, la base &amp;#8220;world&amp;#8221;
MySQL propose au téléchargement plusieurs bases d&amp;#8217;exemple dont &amp;#8220;world&amp;#8221; et &amp;#8220;sakila&amp;#8221;. Elles épargnent le soin aux utilisateurs de MySQL souhaitant tester quelques requêtes de se constituer eux-mêmes une base de test, celles-ci sont prêtes à l&amp;#8217;emploi.
Nous utiliserons pour nos tests la base &amp;#8220;world&amp;#8221;. Très simple puisque constituée uniquement de trois petites tables MyISAM (Country, CountryLanguage et City), elle permet de se concentrer uniquement sur les index sans perdre de temps à assimiler un schéma plus complexe.Si vous souhaitez transformer le script de création SQL de la base &amp;#8220;world&amp;#8221; en une version graphique &amp;#8220;presque&amp;#8221; MCD (les relations entre les tables ne sont pas générées automatiquement pour cette base), le billet précédent est fait pour vous, les étapes d&amp;#8217;installation et de génération du MCD par &amp;#8220;reverse engineering&amp;#8221; avec DBDesigner 4 y sont décrites.Voici ce qu&amp;#8217;on peut obtenir pour cette base à partir de DBDesigner :
Quel type d&amp;#8217;index choisir : PRIMARY KEY, UNIQUE, ou INDEX ?Choisissez le type de vos index avec soin :- Une clé primaire (PRIMARY KEY) est strictement unique, les NULL ne sont pas autorisés.- Un index de type UNIQUE est comparable à une clé primaire, mis à part pour les valeurs NULL puisque celles-ci sont autorisées (et potentiellement en plusieurs occurences).- Un index de type INDEX ou KEY (c&amp;#8217;est un alias) signifie simplement que l&amp;#8217;on souhaite indexer une colonne susceptible de contenir des doublons.Les index de type FULLTEXT et SPATIAL sont particuliers et méritent un épisode à eux seuls, ils seront donc évoqués ultérieurement.Passons rapidement sur l&amp;#8217;étape de déclaration d&amp;#8217;un index, celle-ci s&amp;#8217;effectue soit au moment de la création de la table, soit plus tard comme ici :mysql&amp;gt; CREATE INDEX idx_district ON City (District);Query OK, 4079 rows affected (0.04 sec)Records: 4079&amp;nbsp; Duplicates: 0&amp;nbsp; Warnings: 0Nous venons de créer un index de type INDEX (autorise les doublons) sur la colonne District de la table City.Attention, si nous avions tenté la même chose avec un index de type UNIQUE&amp;#8230;mysql&amp;gt; CREATE UNIQUE INDEX idx_district ON City (District);ERROR 1062 (23000): Duplicate entry &amp;#8216;Zuid-Holland&amp;#8217; for key 2&amp;#8230; MySQL nous signale qu&amp;#8217;il y&amp;#8217;a déjà des doublons dans la colonne District, impossible donc de créer un index de type UNIQUE sur celle-ci.Pour supprimer cet index :mysql&amp;gt; DROP INDEX idx_district ON City;Ou :mysql&amp;gt; ALTER TABLE City DROP INDEX idx_district;Pour visualiser les index d&amp;#8217;une table :mysql&amp;gt; SHOW INDEX FROM Country;
Attention aux doublons !Inutile de rajouter un index de type &amp;#8220;INDEX&amp;#8221; ou encore &amp;#8220;UNIQUE&amp;#8221; sur un champ qui est déjà clé primaire par exemple&amp;#8230; Vous dupliqueriez inutilement les index avec à la clé un gaspillage d&amp;#8217;espace disque/mémoire, des ralentissements inutiles lors des mises à jour, davantage de travail pour l&amp;#8217;optimiseur&amp;#8230;Quels types de champ indexer ?INT, VARCHAR, BLOB&amp;#8230; ? Quels sont les meilleurs candidats à l&amp;#8217;indexation ?
Plus l&amp;#8217;index est court, mieux c&amp;#8217;est : un index est en permanence comparé à d&amp;#8217;autres valeurs (celles recherchées), ces comparaisons sont plus rapides si la zone à comparer est plus courte. Des index concis occupent également moins de place sur disque, génèrent moins d&amp;#8217;I/O (activité disque s&amp;#8217;ils ne sont pas en mémoire) et peuvent ainsi être stockés en plus grand nombre dans une même quantité de RAM (pensez au key_buffer_size de MyISAM par exemple).Bref, si vous désirez stocker une liste de noms de villes sous forme de chaînes de caractères, sachez qu&amp;#8217;il est inutile de réserver un champ de type CHAR(255) : rares sont celles qui atteindront cette longueur, pensez plutôt au VARCHAR qui s&amp;#8217;adaptera à la longueur de vos valeurs.Plus malin encore, lors de la conception de votre base de données, intéressez-vous aux différentes formes de normalisation : 1NF, 2NF, 3NF, ces méthodes permettent d&amp;#8217;obtenir un schéma qui permet de partir sur de bonnes bases.En gardant cet exemple des villes, si vous stockez dans une table &amp;#8220;inscrits&amp;#8221; toutes les infos contextuelles à un utilisateur, dont sa ville, envisagez de stocker dans une table &amp;#8220;ville&amp;#8221;, toutes les infos qui s&amp;#8217;y rapportent : nom, population, etc. Reliez ensuite votre table &amp;#8220;inscrits&amp;#8221; à la table &amp;#8220;ville&amp;#8221; par la valeur de la clé primaire de ville et vous supprimerez ainsi tous ces libellés de villes identiques au profit d&amp;#8217;un ID bien plus rapide et économique.
Soyez radins !
Vos index seront d&amp;#8217;autant plus efficaces s&amp;#8217;ils sont apposés sur des champs bien adaptés à vos données. Ne gaspillez pas le capital &amp;#8220;performance&amp;#8221; de vos index en utilisant un INT pour stocker par exemple la vitesse légale sur autoroute en France (par temps sec) : 130 km/h&amp;#8230;&amp;nbsp; Un TINY INT UNSIGNED suffira (permet de stocker les valeurs de 0 à 255). Un INT permet lui de stocker des valeurs comprises entre -2.147.483.648 2.147.483.647, et en rajoutant l'attribut UNSIGNED, on obtient un rayon d&amp;#8217;action de 0 à plus de 4 milliards ! A quoi bon utiliser un INT dans cet exemple ? Quand on sait de plus qu&amp;#8217;un INT occupe quatre fois plus de place qu&amp;#8217;un TINY INT, l&amp;#8217;impact sur les performances et la perte d&amp;#8217;espace avec une table de plusieurs millions d&amp;#8217;enregistrements est évident&amp;#8230;
Prenez connaissance des caractéristiques des types de données que vous utilisez. Visualisez également la taille requise, c&amp;#8217;est un élement qui peut s&amp;#8217;avérer dissuasif.Pour résumer, n&amp;#8217;indexez pas une colonne en fonction de son type, mais prenez soin dans un premier temps de définir celles-ci avec le type de données qui leur convient le mieux, le plus économique. Prévoyez une marge néanmoins : n&amp;#8217;utilisez pas un TINY INT même UNSIGNED pour un identifiant de clé primaire AUTO_INCREMENT concernant une newsletter d&amp;#8217;un grand service commercial : si tout se passe bien vous devriez rapidement dépasser le seuil des 255 inscrits&amp;#8230; Le type de données juste &amp;#8220;au-dessus&amp;#8221;, SMALLINT UNSIGNED, qui permet d&amp;#8217;aller jusqu&amp;#8217;à 65535, est sans doute plus confortable.Le tips dbnewz : utilisez la commande PROCEDURE ANALYSE()Cette commande analyse pour vous vos tables et vous propose le type idéal pour vos données&amp;#8230; si vous en avez bien sûr, ça ne peut pas vous aider lors d&amp;#8217;une création de table. En revanche, elle permet &amp;#8220;d&amp;#8217;auditer&amp;#8221; vos enregistrements actuels, d&amp;#8217;en tirer quelques statistiques et propose le type le plus adapté :mysql&amp;gt; SELECT Name FROM Country PROCEDURE ANALYSE(10,256)\G Field_name: world.Country.Name Min_value: Afghanistan Max_value: Zimbabwe Min_length: 4 Max_length: 44 Empties_or_zeros: 0 Nulls: 0Avg_value_or_avg_length: 10.0962 Std: NULL Optimal_fieldtype: VARCHAR(44) NOT NULL1 row in set (0.00 sec)Vous pouvez bien sûr effectuer cette requête sur l&amp;#8217;intégralité des champs de l&amp;#8217;une de vos tables (SELECT *&amp;#8230;)Les paramètres fournis à PROCEDURE ANALYSE () sont à modifier en fonction de vos souhaits. Par défaut cette fonction a tendance à vouloir transformer toutes vos chaînes de caractères en champs ENUM (stockés sous forme numérique en interne), à vous de définir combien de champs ENUM vous êtes prêts à utiliser. Réservez-les pour les cas où le champ représente une courte liste &amp;#8220;fermée&amp;#8221;, ex &amp;#8220;M&amp;#8221; ou &amp;#8220;F&amp;#8221;, les jours de la semaine par exemple, etc.Où placer ses index : quels sont les champs à indexer ?Les champs concernés par une clause WHERE, ORDER BY, GROUP BY, MIN(), MAX(), ainsi que les champs qui permettent de relier des tables entre elles, sont de bons candidats à l&amp;#8217;indexation, exemple :SELECT ci.Name, ci.Population FROM City ci INNER JOIN Country co ON ci.CountryCode = co.CodeWHERE ci.Population &amp;gt; 5000000ORDER BY ci.District ASC LIMIT 3- Le champ CountryCode de la table City ainsi que le champ Code de la table Country sont tous les deux à indexer. C&amp;#8217;est d&amp;#8217;ailleurs le cas ici puisque ces deux champs sont respectivement clés primaires de la table City et Country.- Le champ Population est intéressant à indexer, il permet à MySQL de parcourir très rapidement les villes par leur population triée et évite de comparer l&amp;#8217;intégralité des populations de chaque ville, une à une.- Le champ District est également un candidat à l&amp;#8217;indexation, il peut aider MySQL à trier les données plus rapidement.A retenir : on indexe en priorité les champs impliqués dans les clauses évoqués ci-dessus (en gras), pas forcément ceux présents dans le SELECT.Les index composés (ou multiples) et la règle du leftmost prefixing&amp;#8220;Faut-il préférer un index unique ou composé&amp;#8221; était l&amp;#8217;une des questions posées par l&amp;#8217;un d&amp;#8217;entre vous il y&amp;#8217;a quelques semaines&amp;#8230;Un index composé doit se construire en fonction des requêtes que vous effectuez sur la table concernée.Prenons pour exemple la table City et ses cinq champs (ID, Name, CountryCode, District, Population).Si les seules requêtes que vous avez sur City sont du type :
SELECT ... FROM City WHERE Name = &quot;...&quot;
&amp;#8230; Indexez Name et tout ira bien.
Si en revanche il vous arrive de trier non seulement sur &amp;#8220;Name&amp;#8221; mais également sur le code du pays :
SELECT ... FROM City WHERE Name = &quot;...&quot; AND CountryCode = &quot;...&quot;Dans ce cas, plutôt que de laisser MySQL comparer tous les CountryCode de la table avec votre recherche (ex : &amp;#8220;FRA&amp;#8221;), indexez la colonne CountryCode&amp;#8230; Oui mais pas toute seule !Considérez en effet pour l&amp;#8217;instant que MySQL n&amp;#8217;utilise qu&amp;#8217;un index par table, l&amp;#8217;optimiseur MySQL choisit donc le plus restrictif afin que votre requête s&amp;#8217;exécute le plus rapidement possible (nous verrons plus tard les cas particuliers où MySQL peut tirer parti de plusieurs index).Conséquence, il vous faut trouver un index qui soit utilisable pour vos deux critères de recherche : &amp;#8220;Name&amp;#8221; et &amp;#8220;CountryCode&amp;#8221;. La solution : créez un index multiple sur ces deux champs.Dès lors que vous utilisez un index multiple, la règle du leftmost prefixing rentre en jeu. Trop souvent méconnue, elle permet pourtant de créer ses index de façon efficace et d&amp;#8217;éviter les doublons.Afin d&amp;#8217;illustrer cette règle, ajoutons cette fois à la table City un index multiple sur les champs Name, CountryCode, District et Population :
mysql&amp;gt; CREATE INDEX name_cc_dis_pop ON City (Name, CountryCode, District, Population);
Voici ce que l&amp;#8217;on obtient avec le SHOW INDEX correspondant (la clé primaire existait déjà à la création de la table, ci-dessous une vue partielle des résultats réels) :
mysql&amp;gt; SHOW INDEX FROM City;
| Key_name | Seq_in_index | Column_name +&amp;#8212;&amp;#8212;-+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;+
|name_cc_dis_pop |&amp;nbsp;&amp;nbsp; 1 |&amp;nbsp; Name 
|name_cc_dis_pop |&amp;nbsp;&amp;nbsp; 2 | CountryCode 
|name_cc_dis_pop |&amp;nbsp;&amp;nbsp; 3 | District 
 |name_cc_dis_pop |&amp;nbsp;&amp;nbsp; 4 | Population |&amp;nbsp; +&amp;#8212;&amp;#8212;-+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;+&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8212;&amp;#8211;+
On remarque par rapport au SHOW INDEX précédent que cette fois-ci nous avons la colonne &amp;#8220;Seq_in_index&amp;#8221; qui s&amp;#8217;incrémente pour chaque colonne qui compose notre index multiple. La position de chaque index dans cette séquence a une importance, c&amp;#8217;est ce que nous allons voir maintenant.
Tel quel, cet index multiple sera potentiellement utilisé pour les requêtes de ce type :
SELECT ... FROM City WHERE Name = ... AND CountryCode = ... AND District = ... AND Population = ...SELECT &amp;#8230; FROM City WHERE Name = &amp;#8230; AND CountryCode = &amp;#8230; AND District = &amp;#8230; SELECT &amp;#8230; FROM City WHERE Name = &amp;#8230; AND CountryCode = &amp;#8230; SELECT &amp;#8230; FROM City WHERE Name = &amp;#8230;Une fois cette &amp;#8220;logique&amp;#8221; acquise, on comprend qu&amp;#8217;il est inutile de rajouter un index sur Name par exemple puisque cette colonne est déjà indexée grâce à cet index multiple. Idem pour notre exemple précédent&amp;nbsp; d&amp;#8217;index multiple concernant les champs Name et CountryCode, là encore inutile de recréer un index sur ces deux champs puisque ces derniers sont déjà représentés dans notre dernier exemple.En revanche, si l&amp;#8217;ordre de vos champs ne respecte pas l&amp;#8217;ordre de séquence de votre index, comme ici :
SELECT ... FROM City WHERE Name = ... AND Population = ..
Cette requête ne bénéficiera pas complètement de l&amp;#8217;index multiple précedemment crée, cela dit l&amp;#8217;optimiseur tirera sûrement parti de cet index pour la colonne Name, mais pas pour le second critère de recherche.De même si votre requête est du type :
SELECT ... FROM City WHERE CountryCode = ...SELECT &amp;#8230; FROM City WHERE District = &amp;#8230;SELECT &amp;#8230; FROM City WHERE Population = &amp;#8230;SELECT &amp;#8230; FROM City WHERE CountryCode = &amp;#8230; AND District = &amp;#8230; AND Population = &amp;#8230;
&amp;#8230; et autres variations qui ne débutent pas avec &amp;#8220;Name&amp;#8221; et ne respectent pas ensuite l&amp;#8217;ordre de séquence de l&amp;#8217;index (Name, CountryCode, District, et Population), l&amp;#8217;index ne sera pas utilisé.En conséquence, il est donc tout à fait légitime d&amp;#8217;indexer par ailleurs la colonne Population seule si vous avez des requêtes du type :
SELECT ... FROM City WHERE Population &amp;gt; ... Mesurez l&amp;#8217;efficacité des index avec EXPLAIN
Impossible d&amp;#8217;évoquer les index sans parler de la commande EXPLAIN. Absolument fondamentale, elle affiche le plan d&amp;#8217;exécution décidé par l&amp;#8217;optimiseur MySQL et vous permet de mesurer si oui ou non vos index sont réellement utilisés.Reprenons une des premières requêtes de ce billet et rajoutons-lui le mot clé EXPLAIN :(on considère ici que la table City ne contient que sa clé primaire, pas les index rajoutés précedemment)
mysql&amp;gt; EXPLAIN SELECT ci.Name, ci.PopulationFROM City ci INNER JOIN Country co ON ci.CountryCode = co.CodeWHERE ci.Population &amp;gt; 5000000ORDER BY ci.District ASC LIMIT 3\G
*************************** 1. row *************
id: 1
select_type: SIMPLE
table: ci
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 4079
Extra: Using where; Using filesort
*************************** 2. row *************
id: 1
select_type: SIMPLE
table: co
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 3
ref: world.ci.CountryCode
rows: 1
Extra: Using index
2 rows in set (0.00 sec)
La commande EXPLAIN sera étudiée plus précisemment dans un autre épisode, pour le moment contentons-nous de prêter attention aux champs en gras :
- Sur la première ligne le type ALL signale que MySQL doit effectuer un &amp;#8220;full table scan&amp;#8221; c&amp;#8217;est à dire parcourir entièrement la table City qui compte 4079 enregistrements, ceci afin de repérer quelles sont les villes qui ont une population supérieure à 5M d&amp;#8217;habitants. Aucun index/key n&amp;#8217;a pu être utilisé (possible_keys : NULL) pour résoudre cette partie de la requête. La colonne &amp;#8220;rows&amp;#8221; indique le nombre approximatif d&amp;#8217;enregistrements que MySQL pense devoir analyser pour mener à bien l&amp;#8217;opération.
- La seconde ligne nous indique que cette fois MySQL a un candidat pour l&amp;#8217;indexation, il s&amp;#8217;agit de la clé primaire de la table Country, la jointure s&amp;#8217;effectuant avec le champ &amp;#8220;CountryCode&amp;#8221; de la table City, qui est également une clé primaire. Résultat : MySQL effectue la correspondance très rapidement (rows : 1 et extra : Using index).Ceci répond à une des questions posées précedemment par un lecteur : &amp;#8220;Quand préférer le FULL TABLE SCAN à l&amp;#8217;index ?&amp;#8221; C&amp;#8217;est en fait le travail de l&amp;#8217;optimiseur, il doit déterminer si oui ou non un index vous fera gagner du temps. Il se peut qu&amp;#8217;il se trompe (rarement), nous verrons comment orienter ses choix si besoin.Rajoutons maintenant un index de type &amp;#8220;INDEX&amp;#8221; sur la colonne Population :
mysql&amp;gt; CREATE INDEX idx_pop ON City (Population);Puis appliquons à nouveau la même commande EXPLAIN, on obtient cette fois :
*************************** 1. row ************
id: 1
select_type: SIMPLE
table: ci
type: range
possible_keys: idx_pop
key: idx_pop
key_len: 4
ref: NULL
rows: 25
Extra: Using where; Using filesort
*************************** 2. row ************
id: 1
select_type: SIMPLE
table: co
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 3
ref: world.ci.CountryCode
rows: 1
Extra: Using index
2 rows in set (0.02 sec)Notre index a permis à MySQL de lire 160 fois moins de lignes cette fois-ci par rapport à l&amp;#8217;exemple précédent&amp;#8230; Seules 25 lignes de la table City sont lues désormais (au lieu des 4079 lignes précedemment parcourues). C&amp;#8217;est un gain très intéressant en termes de ressources serveur ! Amateurs de chiffres, des benchmarks sont prévus dans la suite de cette série.Afin de patienter jusqu&amp;#8217;aux prochains épisodes justement, vous pouvez commencer par appliquer les quelques conseils de ce billet tout en relisant pourquoi pas l&amp;#8217;article concernant l&amp;#8217;implémentation des index (BTREE ou HASH) selon le type de votre moteur de stockage (MyISAM, InnoDB ou MEMORY). Il reste certaines de vos questions en suspens, elles ne sont pas oubliées et seront débattues ici très prochainement.
Si vous avez des questions ou des remarques concernant cette première étape, n&amp;#8217;hésitez pas.</description>
    <content:encoded><![CDATA[<p>Déjà trois semaines d&#8217;écoulées depuis que certains d&#8217;entre vous, les &#8220;héros&#8221;, ont posé leurs questions (oui il est possible de <a href="http://www.dbnewz.com/2008/06/05/les-index-mysql-la-serie-dont-vous-etes-le-heros/" target="_blank">devenir un héros</a> rien qu&#8217;en lisant dbnewz ! Les véritables héros sont d&#8217;ailleurs abonnés au tout nouveau flux <a href="http://feeds.feedburner.com/Dbnewz" target="_blank">feedburner</a> <img src='http://www.dbnewz.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> )</p>
<p>Trois semaines d&#8217;attente, cela mérite un billet digne de ce nom, c&#8217;est parti.</p>
<p><strong>Indexer, pourquoi ?</strong><br id="dz-w" /><br id="yo1g" />L&#8217;indexation peut avoir plusieurs buts : <br id="gpy7" />- Accéder à ses données plus rapidement, les index sont en effet l&#8217;outil le plus puissant pour <strong>accélérer les temps d&#8217;exécution de vos requêtes</strong> jusqu&#8217;à parfois plusieurs centaines de % !<br id="gpy70" />- Définir le degré d&#8217;unicité d&#8217;une colonne donnée : chaque champ doit-il être unique ? les doublons sont-ils autorisés ?<br id="e0_r" /><br id="uby5" /><strong>Principe de fonctionnement</strong><br id="kvk1" /><br id="kvk10" />Lorsque vous envoyez une requête à votre serveur MySQL, celle-ci est d&#8217;abord confiée au &#8220;parseur&#8221; SQL qui a pour but de vérifier si la syntaxe de votre demande est correcte. Cette étape franchie, la requête passe par &#8220;l&#8217;optimiseur&#8221;. Il s&#8217;agit ici de déterminer le <strong>plan d&#8217;exécution</strong> de la requête afin que celle-ci s&#8217;exécute le plus rapidement possible.</p>
<p>L&#8217;optimiseur détecte si d&#8217;éventuels index sont disponibles, si c&#8217;est le cas il décidera de s&#8217;en servir&#8230; ou pas : il est parfois plus rapide de ne pas se servir d&#8217;un index <strong>!</strong> Nous verrons pourquoi au cours de cette série d&#8217;articles.</p>
<p>Une fois le plan d&#8217;exécution achevé, c&#8217;est le moteur de stockage qui prend le relais, celui-ci peut être vu comme un &#8220;module&#8221; de MySQL :</p>
<p><a href="http://dev.mysql.com/tech-resources/articles/mysql_5.0_psea1.html" target="_blank"><img class="alignnone" src="http://dev.mysql.com/tech-resources/articles/mysql_5.0_psea1.jpg" alt="Les moteurs de stockage MySQL sont des \" width="362" height="261" /></a></p>
<p><span id="more-48"></span>Pour schématiser, et dans un monde idéal, lorsqu&#8217;un index est disponible et &#8220;compatible&#8221; avec votre requête, l&#8217;optimiseur MySQL peut décider de l&#8217;utiliser afin d&#8217;éviter de parcourir l&#8217;ensemble des données des tables concernées.</p>
<p>Un exemple couramment employé pour illustrer ce propos consiste à imaginer la difficultée que nous aurions à retrouver quelqu&#8217;un dans l&#8217;annuaire si nous connaissions son nom mais pas l&#8217;alphabet (qui est notre index)&#8230; Transposé au monde informatique cela donne un serveur MySQL qui compare une à une les entrées du botin pour trouver toutes celles qui correspondent au nom recherché. Si au contraire ce nom est indexé, et si celui-ci commence par exemple par &#8216;T&#8217;, le serveur sait directement qu&#8217;il doit démarrer sa recherche à partir du &#8216;T&#8217;. Imaginez l&#8217;impact en terme de gain de temps lorsque plusieurs jointures sont concernées : deux tables de 10 000 lignes chacune forment un produit cartésien de 100 000 lignes environ à étudier&#8230;<br id="mxtu" /><br id="mxtu0" />Les index n&#8217;ont hélas pas que des avantages :<br id="mxtu4" />- Les opérations de mises à jour (INSERT, UPDATE, DELETE) sont en effet ralenties puisqu&#8217;en plus des données, les index doivent eux aussi être mis à jour lors de ces opérations, c&#8217;est le prix à payer&#8230; Ce prix peut néamoins se &#8220;négocier&#8221;, nous verrons cela plus tard.<br id="q.-8" /><br id="q.-80" /><strong>Notre terrain de jeu, la base &#8220;world&#8221;</strong><br id="w4ef" /></p>
<p>MySQL propose au téléchargement plusieurs bases d&#8217;exemple dont <a href="http://dev.mysql.com/doc/" target="_blank">&#8220;world&#8221; et &#8220;sakila&#8221;</a>. Elles épargnent le soin aux utilisateurs de MySQL souhaitant tester quelques requêtes de se constituer eux-mêmes une base de test, celles-ci sont prêtes à l&#8217;emploi.</p>
<p>Nous utiliserons pour nos tests la base &#8220;world&#8221;. Très simple puisque constituée uniquement de trois petites tables MyISAM (Country, CountryLanguage et City), elle permet de se concentrer uniquement sur les index sans perdre de temps à assimiler un schéma plus complexe.<br id="m4x6" /><br id="m4x60" />Si vous souhaitez transformer le script de création SQL de la base &#8220;world&#8221; en une version graphique &#8220;presque&#8221; MCD (les relations entre les tables ne sont pas générées automatiquement pour cette base), le billet précédent est fait pour vous, <a href="http://www.dbnewz.com/2008/06/22/dbdesigner-4-generer-son-mcd-par-reverse-engineering/" target="_blank">les étapes d&#8217;installation et de génération du MCD par &#8220;reverse engineering&#8221; avec DBDesigner 4</a> y sont décrites.<br id="lfl2" /><br id="lfl20" />Voici ce qu&#8217;on peut obtenir pour cette base à partir de DBDesigner :<br id="lfl21" /><br id="lfl22" /><a href="http://www.dbnewz.com/wp-content/uploads/2008/06/world_db_small.png" target="_blank"><img class="alignnone size-thumbnail wp-image-50" title="world_db_small" src="http://www.dbnewz.com/wp-content/uploads/2008/06/world_db_small-150x150.png" alt="" width="150" height="150" /></a><br id="lfl23" /><br id="lfl24" /></p>
<p><strong id="xz5z">Quel type d&#8217;index choisir : PRIMARY KEY, UNIQUE, ou INDEX ?</strong><br id="txto" /><br id="txto0" />Choisissez le type de vos index avec soin :<br id="txto1" />- Une clé primaire (<strong>PRIMARY KEY</strong>) est strictement unique, les NULL ne sont pas autorisés.<br id="e.px" />- Un index de type <strong>UNIQUE </strong>est comparable à une clé primaire, mis à part pour les valeurs NULL puisque celles-ci sont autorisées (et potentiellement en plusieurs occurences).<br id="fy.m" />- Un index de type <strong>INDEX </strong>ou <strong>KEY </strong>(c&#8217;est un alias) signifie simplement que l&#8217;on souhaite indexer une colonne susceptible de contenir des doublons.<br id="blrx" /><br id="blrx0" />Les index de type <strong>FULLTEXT</strong> et <strong>SPATIAL</strong> sont particuliers et méritent un épisode à eux seuls, ils seront donc évoqués ultérieurement.<br id="k7_h" /><br id="k7_h0" />Passons rapidement sur l&#8217;étape de <a href="http://dev.mysql.com/doc/refman/5.0/fr/create-index.html" target="_blank">déclaration d&#8217;un index</a>, celle-ci s&#8217;effectue soit au moment de la création de la table, soit plus tard comme ici :<br id="or3." /><br id="or3.0" />mysql&gt; <code>CREATE INDEX idx_district ON City (District);<br id="n0.-" />Query OK, 4079 rows affected (0.04 sec)<br id="n0.-0" />Records: 4079&nbsp; Duplicates: 0&nbsp; Warnings: 0</code><br id="n0.-1" /><br id="n0.-2" />Nous venons de créer un index de type INDEX (autorise les doublons) sur la colonne District de la table City.<br id="n0.-3" /><br id="n0.-4" />Attention, si nous avions tenté la même chose avec un index de type UNIQUE&#8230;<br id="l3as" /><br id="l3as0" />mysql&gt; <code>CREATE UNIQUE INDEX idx_district ON City (District);<br id="l3as1" />ERROR 1062 (23000): Duplicate entry &#8216;Zuid-Holland&#8217; for key 2</code><br id="dh1k" /><br id="dh1k0" />&#8230; MySQL nous signale qu&#8217;il y&#8217;a déjà des doublons dans la colonne District, impossible donc de créer un index de type UNIQUE sur celle-ci.<br id="najp" /><br id="najp0" /><strong>Pour supprimer cet index :</strong><br id="najp1" />mysql&gt; <code>DROP INDEX idx_district ON City;</code><br id="a8y02" />Ou :<br id="a8y04" />mysql&gt; <code>ALTER TABLE City DROP INDEX idx_district;</code><br id="bim:" /><strong><br id="bim:0" />Pour visualiser les index d&#8217;une table :</strong><br id="zw.m" /><br id="zw.m0" />mysql&gt; SHOW INDEX FROM Country;</p>
<p><strong>Attention aux doublons !</strong><br id="zw.m17" /><br id="bim:2" />Inutile de rajouter un index de type &#8220;INDEX&#8221; ou encore &#8220;UNIQUE&#8221; sur un champ qui est déjà clé primaire par exemple&#8230; Vous dupliqueriez inutilement les index avec à la clé un gaspillage d&#8217;espace disque/mémoire, des ralentissements inutiles lors des mises à jour, davantage de travail pour l&#8217;optimiseur&#8230;<br id="fq0r" /><br id="p-i7" /><strong id="kw9g2">Quels types de champ indexer ?</strong><br id="bo1r" /><br id="bo1r0" />INT, VARCHAR, BLOB&#8230; ? Quels sont les meilleurs candidats à l&#8217;indexation ?</p>
<p><strong>Plus l&#8217;index est court, mieux c&#8217;est</strong> : un index est en permanence comparé à d&#8217;autres valeurs (celles recherchées), ces comparaisons sont plus rapides si la zone à comparer est plus courte. Des index concis occupent également moins de place sur disque, génèrent moins d&#8217;I/O (activité disque s&#8217;ils ne sont pas en mémoire) et peuvent ainsi être stockés en plus grand nombre dans une même quantité de RAM (pensez au <a href="http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#option_mysqld_key_buffer_size" target="_blank">key_buffer_size</a> de MyISAM par exemple).<br id="e1fk" /><br id="e1fk0" />Bref, si vous désirez stocker une liste de noms de villes sous forme de chaînes de caractères, sachez qu&#8217;il est inutile de réserver un champ de type CHAR(255) : rares sont celles qui atteindront cette longueur, pensez plutôt au VARCHAR qui s&#8217;adaptera à la longueur de vos valeurs.<br id="g6j1" />Plus malin encore, lors de la conception de votre base de données, intéressez-vous aux différentes formes de normalisation : 1NF, 2NF, 3NF, ces méthodes permettent d&#8217;obtenir un schéma qui permet de partir sur de bonnes bases.<br id="ist_" />En gardant cet exemple des villes, si vous stockez dans une table &#8220;inscrits&#8221; toutes les infos contextuelles à un utilisateur, dont sa ville, envisagez de stocker dans une table &#8220;ville&#8221;, toutes les infos qui s&#8217;y rapportent : nom, population, etc. Reliez ensuite votre table &#8220;inscrits&#8221; à la table &#8220;ville&#8221; par la valeur de la clé primaire de ville et vous supprimerez ainsi tous ces libellés de villes identiques au profit d&#8217;un ID bien plus rapide et économique.<br id="yxd7" /></p>
<p><strong>Soyez radins !</strong></p>
<p>Vos index seront d&#8217;autant plus efficaces s&#8217;ils sont apposés sur des champs bien adaptés à vos données. <strong>Ne gaspillez pas le capital &#8220;performance&#8221; de vos index</strong> en utilisant un INT pour stocker par exemple la vitesse légale sur autoroute en France (par temps sec) : 130 km/h&#8230;&nbsp; Un TINY INT UNSIGNED suffira (permet de stocker les valeurs de 0 à 255). Un INT permet lui de stocker des valeurs comprises entre <code id="cps40" class="literal" style="font-family: Verdana;">-2.147.483.648</code> <code id="cps42" class="literal" style="font-family: Verdana;">2.147.483.647, et en rajoutant l'attri</code>but UNSIGNED, on obtient un rayon d&#8217;action de 0 à plus de 4 milliards ! A quoi bon utiliser un INT dans cet exemple ? Quand on sait de plus qu&#8217;un INT occupe quatre fois plus de place qu&#8217;un TINY INT, l&#8217;impact sur les performances et la perte d&#8217;espace avec une table de plusieurs millions d&#8217;enregistrements est évident&#8230;</p>
<p>Prenez connaissance des <a href="http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html" target="_blank">caractéristiques des types de données</a> que vous utilisez. Visualisez également <a href="http://dev.mysql.com/doc/refman/5.0/fr/storage-requirements.html" target="_blank">la taille requise</a>, c&#8217;est un élement qui peut s&#8217;avérer dissuasif.<br id="x-cm" /><br id="x-cm0" />Pour résumer, n&#8217;indexez pas une colonne en fonction de son type, mais prenez soin dans un premier temps de définir celles-ci avec le type de données qui leur convient le mieux, le plus économique. Prévoyez une marge néanmoins : n&#8217;utilisez pas un TINY INT même UNSIGNED pour un identifiant de clé primaire AUTO_INCREMENT concernant une newsletter d&#8217;un grand service commercial : si tout se passe bien vous devriez rapidement dépasser le seuil des 255 inscrits&#8230; Le type de données juste &#8220;au-dessus&#8221;, SMALLINT UNSIGNED, qui permet d&#8217;aller jusqu&#8217;à 65535, est sans doute plus confortable.<br id="t9cg" /><br id="t9cg0" /><strong id="n1bv">Le tips dbnewz : </strong>utilisez la commande <strong id="dwmm">PROCEDURE ANALYSE()</strong><br id="n1bv0" /><br id="n1bv1" />Cette commande analyse pour vous vos tables et vous propose le type idéal pour vos données&#8230; si vous en avez bien sûr, ça ne peut pas vous aider lors d&#8217;une création de table. En revanche, elle permet &#8220;d&#8217;auditer&#8221; vos enregistrements actuels, d&#8217;en tirer quelques statistiques et propose le type le plus adapté :<br id="n3yt" /><br id="uv4e" />mysql&gt; <code>SELECT Name FROM Country PROCEDURE ANALYSE(10,256)\G<br id="uv4e1" /> Field_name: world.Country.<strong>Name</strong><br id="uv4e2" /> Min_value: Afghanistan<br id="uv4e3" /> Max_value: Zimbabwe<br id="uv4e4" /> <strong>Min_length: 4</strong><br id="uv4e5" /> <strong>Max_length: 44</strong><br id="uv4e6" /> Empties_or_zeros: 0<br id="uv4e7" /> Nulls: 0<br id="uv4e8" /><strong>Avg_value_or_avg_length: 10.0962</strong><br id="uv4e9" /> Std: NULL<br id="uv4e10" /> <strong>Optimal_fieldtype</strong>: VARCHAR(44) NOT NULL<br id="uv4e11" />1 row in set (0.00 sec)</code><br id="uv4e12" /><br id="n3yt0" />Vous pouvez bien sûr effectuer cette requête sur l&#8217;intégralité des champs de l&#8217;une de vos tables (SELECT *&#8230;)<br id="lgar" />Les paramètres fournis à <a href="http://dev.mysql.com/doc/refman/5.1/en/procedure-analyse.html" target="_blank">PROCEDURE ANALYSE ()</a> sont à modifier en fonction de vos souhaits. Par défaut cette fonction a tendance à vouloir transformer toutes vos chaînes de caractères en champs <a href="http://dev.mysql.com/doc/refman/5.1/en/enum.html" target="_blank">ENUM</a> (stockés sous forme numérique en interne), à vous de définir combien de champs ENUM vous êtes prêts à utiliser. Réservez-les pour les cas où le champ représente une courte liste &#8220;fermée&#8221;, ex &#8220;M&#8221; ou &#8220;F&#8221;, les jours de la semaine par exemple, etc.<br id="hj59" /><br id="hj590" /><strong id="ny9g">Où placer ses index : quels sont les champs à indexer ?</strong><br id="ny9g0" /><br id="ny9g1" />Les champs concernés par une clause <strong>WHERE, ORDER BY, GROUP BY, MIN(), MAX()</strong>, ainsi que les champs qui permettent de <strong>relier des tables entre elles</strong>, sont de bons candidats à l&#8217;indexation, exemple :<br id="abxv" /><br id="aln7" /><code>SELECT ci.Name, ci.Population <br id="aln70" />FROM City ci INNER JOIN Country co ON ci.CountryCode = co.Code<br id="aln71" />WHERE ci.Population &gt; 5000000<br id="aln72" />ORDER BY ci.District ASC LIMIT 3</code><br id="aln73" /><br id="ulja" />- Le champ CountryCode de la table City ainsi que le champ Code de la table Country sont tous les deux à indexer. C&#8217;est d&#8217;ailleurs le cas ici puisque ces deux champs sont respectivement clés primaires de la table City et Country.<br id="ulja0" />- Le champ Population est intéressant à indexer, il permet à MySQL de parcourir très rapidement les villes par leur population triée et évite de comparer l&#8217;intégralité des populations de chaque ville, une à une.<br id="fv9-" />- Le champ District est également un candidat à l&#8217;indexation, il peut aider MySQL à trier les données plus rapidement.<br id="o0-s" /><br id="o0-s0" />A retenir : on indexe en priorité les champs impliqués dans les clauses évoqués ci-dessus (en gras), pas forcément ceux présents dans le SELECT.<br id="aln75" /><br id="o98j6" /><strong>Les index composés (ou multiples) et la règle du leftmost prefixing</strong><br id="ebx3" /><br id="ebx30" />&#8220;Faut-il préférer un index unique ou composé&#8221; était <a href="http://www.dbnewz.com/2008/06/05/les-index-mysql-la-serie-dont-vous-etes-le-heros/#comments" target="_blank">l&#8217;une des questions posées</a> par l&#8217;un d&#8217;entre vous il y&#8217;a quelques semaines&#8230;<br id="zkm0" /><br id="zkm00" />Un index composé doit se construire en fonction des requêtes que vous effectuez sur la table concernée.<br id="ku.e" />Prenons pour exemple la table City et ses cinq champs (ID, Name, CountryCode, District, Population).<br id="ku.e0" /><br id="ku.e1" />Si les seules requêtes que vous avez sur City sont du type :</p>
<p><code>SELECT ... FROM City WHERE Name = "..."</code></p>
<p>&#8230; Indexez Name et tout ira bien.</p>
<p>Si en revanche il vous arrive de trier non seulement sur &#8220;Name&#8221; mais également sur le code du pays :</p>
<p><code>SELECT ... FROM City WHERE Name = "..." AND CountryCode = "..."</code><br id="f50i0" /><br id="f50i1" />Dans ce cas, plutôt que de laisser MySQL comparer tous les CountryCode de la table avec votre recherche (ex : &#8220;FRA&#8221;), indexez la colonne CountryCode&#8230; Oui mais pas toute seule !<br id="lkbv" />Considérez en effet pour l&#8217;instant que MySQL n&#8217;utilise qu&#8217;un index par table, l&#8217;optimiseur MySQL choisit donc le plus restrictif afin que votre requête s&#8217;exécute le plus rapidement possible (nous verrons plus tard les cas particuliers où MySQL peut tirer parti de plusieurs index).<br id="w0mb" />Conséquence, il vous faut trouver un index qui soit utilisable pour vos deux critères de recherche : &#8220;Name&#8221; et &#8220;CountryCode&#8221;. La solution : créez un index multiple sur ces deux champs.<br id="tilr" /><br id="tilr0" />Dès lors que vous utilisez un index multiple, <strong>la règle </strong><strong>du leftmost prefixing</strong> rentre en jeu. Trop souvent méconnue, elle permet pourtant de créer ses index de façon efficace et d&#8217;éviter les doublons.<br id="ny9g2" /><br id="mqai" />Afin d&#8217;illustrer cette règle, ajoutons cette fois à la table City un index multiple sur les champs Name, CountryCode, District et Population :</p>
<p>mysql&gt; <code>CREATE INDEX name_cc_dis_pop ON City (Name, CountryCode, District, Population);</code><br id="ub980" /></p>
<p>Voici ce que l&#8217;on obtient avec le <strong>SHOW INDEX</strong> correspondant (la clé primaire existait déjà à la création de la table, ci-dessous une vue partielle des résultats réels) :</p>
<p>mysql&gt; <code>SHOW INDEX FROM City;<br id="cvh60" /></code></p>
<p>|<code> <strong>Key_name</strong> | <strong>Seq_in_index</strong> | <strong>Column_name</strong> <br id="cvh62" />+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+</code></p>
<p><code><strong>|name_cc_dis_pop</strong> |&nbsp;&nbsp; <strong>1</strong> |&nbsp; <strong>Name</strong> </code></p>
<p><strong>|</strong><code><strong>name_cc_dis_pop</strong> |&nbsp;&nbsp; <strong>2</strong> | <strong>CountryCode</strong> </code></p>
<p><code><strong>|</strong><strong>name_cc_dis_pop</strong> |&nbsp;&nbsp; <strong>3</strong> | <strong>District</strong> </code></p>
<p><code> <strong>|name_cc_dis_pop</strong> |&nbsp;&nbsp; <strong>4</strong> | <strong>Population</strong> |&nbsp; <br id="cvh68" />+&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+</code></p>
<p>On remarque par rapport au SHOW INDEX précédent que cette fois-ci nous avons la colonne &#8220;Seq_in_index&#8221; qui s&#8217;incrémente pour chaque colonne qui compose notre index multiple. La position de chaque index dans cette séquence a une importance, c&#8217;est ce que nous allons voir maintenant.</p>
<p>Tel quel, cet index multiple sera potentiellement utilisé pour les requêtes de ce type :</p>
<p><code>SELECT ... FROM City WHERE Name = ... AND CountryCode = ... AND District = ... AND Population = ...<br id="w2qj" />SELECT &#8230; FROM City WHERE Name = &#8230; AND CountryCode = &#8230; AND District = &#8230; <br id="w2qj0" />SELECT &#8230; FROM City WHERE Name = &#8230; AND CountryCode = &#8230; <br id="w2qj1" />SELECT &#8230; FROM City WHERE Name = &#8230;</code><br id="w2qj2" /><br id="w2qj3" />Une fois cette &#8220;logique&#8221; acquise, on comprend qu&#8217;il est inutile de rajouter un index sur Name par exemple puisque cette colonne est déjà indexée grâce à cet index multiple. Idem pour notre exemple précédent&nbsp; d&#8217;index multiple concernant les champs Name et CountryCode, là encore inutile de recréer un index sur ces deux champs puisque ces derniers sont déjà représentés dans notre dernier exemple.<br id="niuy" /><br id="niuy0" />En revanche, si l&#8217;ordre de vos champs ne respecte pas l&#8217;ordre de séquence de votre index, comme ici :</p>
<p><code>SELECT ... FROM City WHERE Name = ... AND Population = ..</code></p>
<p>Cette requête ne bénéficiera pas complètement de l&#8217;index multiple précedemment crée, cela dit l&#8217;optimiseur tirera sûrement parti de cet index pour la colonne Name, mais pas pour le second critère de recherche.<br id="ewwh0" /><br id="ewwh1" />De même si votre requête est du type :</p>
<p><code>SELECT ... FROM City WHERE CountryCode = ...<br id="ewwh3" />SELECT &#8230; FROM City WHERE District = &#8230;<br id="ewwh4" />SELECT &#8230; FROM City WHERE Population = &#8230;<br id="ewwh5" />SELECT &#8230; FROM City WHERE CountryCode = &#8230; AND District = &#8230; AND Population = &#8230;</code><br id="ewwh6" /></p>
<p>&#8230; et autres variations qui ne débutent pas avec &#8220;Name&#8221; et ne respectent pas ensuite l&#8217;ordre de séquence de l&#8217;index (Name, CountryCode, District, et Population), l&#8217;index ne sera pas utilisé.<br id="z9sx" /><br id="z9sx0" />En conséquence, il est donc tout à fait légitime d&#8217;indexer par ailleurs la colonne Population seule si vous avez des requêtes du type :</p>
<p><code>SELECT ... FROM City WHERE Population &gt; ... </code><br id="p_16" /><br id="ny9g4" /><strong>Mesurez l&#8217;efficacité des index avec EXPLAIN</strong><br id="n6b2" /></p>
<p>Impossible d&#8217;évoquer les index sans parler de la commande <strong>EXPLAIN</strong>. Absolument <strong id="kjkb">fondamentale</strong>, elle affiche le plan d&#8217;exécution décidé par l&#8217;optimiseur MySQL et vous permet de mesurer si oui ou non vos index sont réellement utilisés.<br id="tqy0" /><br id="tqy00" />Reprenons une des premières requêtes de ce billet et rajoutons-lui le mot clé EXPLAIN :<br id="fo2v" />(on considère ici que la table City ne contient que sa clé primaire, pas les index rajoutés précedemment)</p>
<p>mysql&gt; <code><strong>EXPLAIN </strong>SELECT ci.Name, ci.Population<br id="dhkz" />FROM City ci INNER JOIN Country co ON ci.CountryCode = co.Code<br id="dhkz0" />WHERE ci.Population &gt; 5000000<br id="dhkz1" />ORDER BY ci.District ASC LIMIT 3\G<br id="dhkz2" /></code></p>
<p><code>*************************** 1. row *************<br />
id: 1<br />
select_type: SIMPLE<br />
table: ci<br />
type: ALL<br />
<strong>possible_keys: NULL</strong><br />
key: NULL<br />
key_len: NULL<br />
ref: NULL<br />
<strong>rows: 4079</strong><br />
Extra: Using where; Using filesort<br />
*************************** 2. row *************<br />
id: 1<br />
select_type: SIMPLE<br />
table: co<br />
type: eq_ref<br />
<strong>possible_keys: PRIMARY</strong><br />
<strong>key: PRIMARY</strong><br />
key_len: 3<br />
<strong>ref: world.ci.CountryCode</strong><br />
<strong>rows: 1</strong><br />
<strong>Extra: Using index</strong><br />
2 rows in set (0.00 sec)</code></p>
<p>La commande EXPLAIN sera étudiée plus précisemment dans un autre épisode, pour le moment contentons-nous de prêter attention aux champs en gras :</p>
<p>- Sur la première ligne le type ALL signale que MySQL doit effectuer un &#8220;full table scan&#8221; c&#8217;est à dire parcourir entièrement la table City qui compte 4079 enregistrements, ceci afin de repérer quelles sont les villes qui ont une population supérieure à 5M d&#8217;habitants. Aucun index/key n&#8217;a pu être utilisé (possible_keys : NULL) pour résoudre cette partie de la requête. La colonne &#8220;rows&#8221; indique le nombre approximatif d&#8217;enregistrements que MySQL pense devoir analyser pour mener à bien l&#8217;opération.</p>
<p>- La seconde ligne nous indique que cette fois MySQL a un candidat pour l&#8217;indexation, il s&#8217;agit de la clé primaire de la table Country, la jointure s&#8217;effectuant avec le champ &#8220;CountryCode&#8221; de la table City, qui est également une clé primaire. Résultat : MySQL effectue la correspondance très rapidement (rows : 1 et extra : Using index).<br id="sewv" /><br id="sewv0" />Ceci répond à une des questions posées précedemment par un lecteur : &#8220;Quand préférer le FULL TABLE SCAN à l&#8217;index ?&#8221; C&#8217;est en fait le travail de l&#8217;optimiseur, il doit déterminer si oui ou non un index vous fera gagner du temps. Il se peut qu&#8217;il se trompe (rarement), nous verrons comment orienter ses choix si besoin.<br id="ai:q" /><br id="ai:q0" />Rajoutons maintenant un index de type &#8220;INDEX&#8221; sur la colonne Population :<br id="ai:q1" /></p>
<p>mysql&gt; <code>CREATE INDEX idx_pop ON City (Population);</code><br id="j6rd" /><br id="j6rd0" />Puis appliquons à nouveau la même commande EXPLAIN, on obtient cette fois :</p>
<p><code>*************************** 1. row ************<br />
id: 1<br />
select_type: SIMPLE<br />
table: ci<br />
type: range<br />
<strong>possible_keys: idx_pop</strong><br />
<strong>key: idx_pop</strong><br />
key_len: 4<br />
ref: NULL<br />
<strong>rows: 25</strong><br />
Extra: Using where; Using filesort<br />
*************************** 2. row ************<br />
id: 1<br />
select_type: SIMPLE<br />
table: co<br />
type: eq_ref<br />
<strong>possible_keys: PRIMARY<br />
key: PRIMARY</strong><br />
key_len: 3<br />
ref: world.ci.CountryCode<br />
<strong>rows: 1</strong><br />
Extra: Using index<br />
2 rows in set (0.02 sec)<br id="ecl19" /></code><br id="ecl110" />Notre index a permis à MySQL de lire <strong>160 fois moins de lignes</strong> cette fois-ci par rapport à l&#8217;exemple précédent&#8230; Seules 25 lignes de la table City sont lues désormais (au lieu des 4079 lignes précedemment parcourues). C&#8217;est un gain très intéressant en termes de ressources serveur ! Amateurs de chiffres, des benchmarks sont prévus dans la suite de cette série.<br id="laec" /><br id="laec0" />Afin de patienter jusqu&#8217;aux prochains épisodes justement, vous pouvez commencer par appliquer les quelques conseils de ce billet tout en relisant pourquoi pas l&#8217;article concernant <a href="http://www.dbnewz.com/2008/05/19/choisir-limplementation-de-ses-index-b-tree-ou-hash-quelles-differences/" target="_blank">l&#8217;implémentation des index (BTREE ou HASH)</a> selon le type de votre moteur de stockage (MyISAM, InnoDB ou MEMORY). <br id="dhkz10" /><br id="m:ru" />Il reste certaines de vos questions en suspens, elles ne sont pas oubliées et seront débattues ici très prochainement.</p>
<p>Si vous avez des questions ou des remarques concernant cette première étape, n&#8217;hésitez pas.</p>]]></content:encoded>
    <pubDate>Fri, 27 Jun 2008 06:52:44 +0000</pubDate>
    <comments>http://www.dbnewz.com/2008/06/27/les-index-mysql-types-placements-efficacite/#comments</comments>
    <dc:creator>DBNewz</dc:creator>
    <category>4.0</category>
    <category>4.1</category>
    <category>5.0</category>
    <category>5.1</category>
    <category>MySQL</category>
    <category>index</category>
    <category>tuning</category>
  </item>

  <item>
    <title>Tout sur les index</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/tutorial/18496-tout_sur_les_index.php</guid>
    <link>http://www.nexen.net/actualites/tutorial/18496-tout_sur_les_index.php</link>
    <description>
					
				    
Les index n'ont plus de secret pour dbnewz, et il n'en n'auront plus pour vous non plus quand vous aurez lu ce long dossier. En plus du classique EXPLAIN qui explique l'utilisation des index par les requêtes, vous pourrez découvrir PROCEDURE ANALYSE(), qui optimise le type de données pour votre table. 
Index simples, index multiple, choix des index : tout y passe. Il ne reste que la structure des index et leurs performances, à voir dans les prochains articles.&amp;nbsp;Les index MySQL : types, placements, efficacité (0 visite)</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/imprimer.png">
				    </div><div class="blogcontent">
Les index n'ont plus de secret pour dbnewz, et il n'en n'auront plus pour vous non plus quand vous aurez lu ce long dossier. En plus du classique EXPLAIN qui explique l'utilisation des index par les requêtes, vous pourrez découvrir PROCEDURE ANALYSE(), qui optimise le type de données pour votre table. <br />
Index simples, index multiple, choix des index : tout y passe. Il ne reste que la structure des index et leurs performances, à voir dans les prochains articles.<ul><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/fr.png" alt="fr" witdth="18" height="12" />&nbsp;<a href="http://www.dbnewz.com/2008/06/27/les-index-mysql-types-placements-efficacite/" title="http://www.dbnewz.com/2008/06/27/les-index-mysql-types-placements-efficacite/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Les+index+MySQL+%3A+types%2C+placements%2C+efficacitAc&amp;content_id=0'; return false;"  class="weblink_img">Les index MySQL : types, placements, efficacité</a> (0 visite)</li></ul></div>]]></content:encoded>
    <pubDate>Thu, 26 Jun 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>Introduction à PHP Reports</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/tutorial/18498-introduction_a_php_reports.php</guid>
    <link>http://www.nexen.net/actualites/tutorial/18498-introduction_a_php_reports.php</link>
    <description>
					
				    
PHP Reports est une bibliothèque qui aide à la génération de formulaires de rapports. Elle découpe la production des rapports en trois couches : les données, la page et les groupes. Cela permet de maîtriser les différents regroupements et aspects d'un rapport, pour produire rapidement un fichier HTML sans reinventer la roue à chaque fois. Sans être une révolution, cette petite bibliothèque peut se révéler utile à bien des moments.&amp;nbsp;Using PHPReports Generator for Database Reports (0 visite)&amp;nbsp;PHP Report (0 visite)&amp;nbsp;PHP Report samples (0 visite)</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/phpreport.png">
				    </div><div class="blogcontent">
PHP Reports est une bibliothèque qui aide à la génération de formulaires de rapports. Elle découpe la production des rapports en trois couches : les données, la page et les groupes. Cela permet de maîtriser les différents regroupements et aspects d'un rapport, pour produire rapidement un fichier HTML sans reinventer la roue à chaque fois. Sans être une révolution, cette petite bibliothèque peut se révéler utile à bien des moments.<ul><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.devx.com/webdev/Article/38409" title="http://www.devx.com/webdev/Article/38409"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Using+PHPReports+Generator+for+Database+Reports&amp;content_id=0'; return false;"  class="weblink_img">Using PHPReports Generator for Database Reports</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://phpreports.sourceforge.net/" title="http://phpreports.sourceforge.net/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=PHP+Report&amp;content_id=0'; return false;"  class="weblink_img">PHP Report</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://phpreports.sourceforge.net/samples.html" title="http://phpreports.sourceforge.net/samples.html"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=PHP+Report+samples&amp;content_id=0'; return false;"  class="weblink_img">PHP Report samples</a> (0 visite)</li></ul></div>]]></content:encoded>
    <pubDate>Thu, 26 Jun 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>Vidéo PHP et MySQL, édition 50</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/php/18495-video_php_et_mysql,_edition_50.php</guid>
    <link>http://www.nexen.net/actualites/php/18495-video_php_et_mysql,_edition_50.php</link>
    <description>
					
				    
Voici les 5 dernières vidéos PHP et MySQL.

&amp;nbsp;Installer MAMP (0 visite)
&amp;nbsp;Symfony 1.1 Fabien Potencier (0 visite)
&amp;nbsp;Php 5.3 And Php 6 A Look Ahead DPC 2008, Amsterdam (0 visite)
&amp;nbsp;Web Browsers And Other Mistakes (0 visite)
&amp;nbsp;MySQL Tuning (0 visite)
&amp;nbsp;Import Excel to MySQL Database (0 visite)


Ces vidéos sont publiés sur les sites de partagent de vidéo. Ce sont des tutoriels enregistrés, des sessions de conférences, des screencast ou encore des slides de conférences. 


N'hésitez pas à nous contacter pour signaler tout media qui mérite d'être ajouté à cette liste.
</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/securite.png">
				    </div><div class="blogcontent">
Voici les 5 dernières vidéos PHP et MySQL.<br />
<ul><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.nexen.net/video.php?video=170" title="http://www.nexen.net/video.php?video=170"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Installer+MAMP&amp;content_id=0'; return false;"  class="weblink_img">Installer MAMP</a> (0 visite)</li><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.nexen.net/video.php?video=168" title="http://www.nexen.net/video.php?video=168"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Symfony+1.1+Fabien+Potencier&amp;content_id=0'; return false;"  class="weblink_img">Symfony 1.1 Fabien Potencier</a> (0 visite)</li><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.nexen.net/video.php?video=167" title="http://www.nexen.net/video.php?video=167"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Php+5.3+And+Php+6+A+Look+Ahead+DPC+2008%2C+Amsterdam&amp;content_id=0'; return false;"  class="weblink_img">Php 5.3 And Php 6 A Look Ahead DPC 2008, Amsterdam</a> (0 visite)</li><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.nexen.net/video.php?video=166" title="http://www.nexen.net/video.php?video=166"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Web+Browsers+And+Other+Mistakes&amp;content_id=0'; return false;"  class="weblink_img">Web Browsers And Other Mistakes</a> (0 visite)</li><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.nexen.net/video.php?video=165" title="http://www.nexen.net/video.php?video=165"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=MySQL+Tuning&amp;content_id=0'; return false;"  class="weblink_img">MySQL Tuning</a> (0 visite)</li><br />
<li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.nexen.net/video.php?video=163" title="http://www.nexen.net/video.php?video=163"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Import+Excel+to+MySQL+Database&amp;content_id=0'; return false;"  class="weblink_img">Import Excel to MySQL Database</a> (0 visite)</li><br />
</ul><br />
<p><br />
Ces vidéos sont publiés sur les sites de partagent de vidéo. Ce sont des tutoriels enregistrés, des sessions de conférences, des screencast ou encore des slides de conférences. <br />
</p><br />
<p><br />
N'hésitez pas à nous contacter pour signaler tout media qui mérite d'être ajouté à cette liste.<br />
</p></div>]]></content:encoded>
    <pubDate>Wed, 25 Jun 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>Appeler du code Java depuis MySQL</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/php/18493-appeler_du_code_java_depuis_mysql.php</guid>
    <link>http://www.nexen.net/actualites/php/18493-appeler_du_code_java_depuis_mysql.php</link>
    <description>
					
				    
&quot;Cette dépêche est la suite de ma session à JavaDeus 2008, où j'ai montré comment utiliser Lucene à l'intérieur de MySQL, en utilisant une branche expérimentale, quelques procédures stockées et déclencheurs.
Comme le processus n'est pas entièrement évident, et que cette branche est très expérimentale, j'ai pensé qu'il serait utile de détailler tout cela en ligne. Il est vraiment surprenant de voir comment peu de code (en Java, en tous cas) peut vous donner un moteur de recherche en texte intégral complet et souple.&quot;
Où il est question de faire une procédure stockée en Java. Beaucoup de compilation, et au final, l'utilisation directe de Java en MySQL.&amp;nbsp;Calling Java Code from MySQL (0 visite)&amp;nbsp;Lucene (0 visite)&amp;nbsp;sakila-server (0 visite)</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/java.png">
				    </div><div class="blogcontent">
"Cette dépêche est la suite de ma session à JavaDeus 2008, où j'ai montré comment utiliser Lucene à l'intérieur de MySQL, en utilisant une branche expérimentale, quelques procédures stockées et déclencheurs.<br />
Comme le processus n'est pas entièrement évident, et que cette branche est très expérimentale, j'ai pensé qu'il serait utile de détailler tout cela en ligne. Il est vraiment surprenant de voir comment peu de code (en Java, en tous cas) peut vous donner un moteur de recherche en texte intégral complet et souple."<br />
Où il est question de faire une procédure stockée en Java. Beaucoup de compilation, et au final, l'utilisation directe de Java en MySQL.<ul><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://blogs.sun.com/kay/entry/calling_java_code_in_mysql" title="http://blogs.sun.com/kay/entry/calling_java_code_in_mysql"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Calling+Java+Code+from+MySQL&amp;content_id=0'; return false;"  class="weblink_img">Calling Java Code from MySQL</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://lucene.apache.org/" title="http://lucene.apache.org/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Lucene&amp;content_id=0'; return false;"  class="weblink_img">Lucene</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="https://code.launchpad.net/sakila-server" title="https://code.launchpad.net/sakila-server"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=sakilaserver&amp;content_id=0'; return false;"  class="weblink_img">sakila-server</a> (0 visite)</li></ul></div>]]></content:encoded>
    <pubDate>Tue, 24 Jun 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>DBDesigner 4 : générer son MCD par reverse engineering</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/tutorial/18490-dbdesigner_4_:_generer_son_mcd_par_reverse_engineering.php</guid>
    <link>http://www.nexen.net/actualites/tutorial/18490-dbdesigner_4_:_generer_son_mcd_par_reverse_engineering.php</link>
    <description>
					
				    
Disposer dun MCD (modèle conceptuel de données) lorsquon travaille sur une requête SQL impliquant différentes tables représente un gain de temps.
Il est en effet plus rapide de jeter un coup doeil sur un MCD afin de repérer quels sont les champs qui lient une table à une autre plutôt que denchaîner les DESC ma_table, puis repérer la clé primaire et les éventuelles clés étrangères, et rebolote sur la ou les tables de destination
La prochaine série darticles sur les index MySQL va nous amener à enchaîner quelques requêtes sur une des deux bases dexemple disponibles sur le site de MySQL : world et sakila, le prétexte est donc tout trouvé pour évoquer ici la solution que jai retenu pour obtenir le MCD de ces tables : DBDesigner 4.
Cet outil nest pas nouveau, son successeur officiel est même déjà connu, il sagit de MySQL Workbench. Celui-ci nétant pas encore disponible sous linux, nous utiliserons son ancêtre et plus particulièrement sa fonctionnalité de reverse engineering : une fois connecté à votre base, DBDesigner 4 va générer sous forme graphique vos tables, leurs descriptions, et si tout se passe bien, les relations entre vos tables.&amp;nbsp;DBDesigner 4 : générer son MCD par reverse engineering (0 visite)&amp;nbsp;sakila (0 visite)&amp;nbsp;MySQL workbench (0 visite)&amp;nbsp;DBdesigner 4 (0 visite)</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/poo.png">
				    </div><div class="blogcontent">
Disposer dun MCD (modèle conceptuel de données) lorsquon travaille sur une requête SQL impliquant différentes tables représente un gain de temps.<br />
Il est en effet plus rapide de jeter un coup doeil sur un MCD afin de repérer quels sont les champs qui lient une table à une autre plutôt que denchaîner les DESC ma_table, puis repérer la clé primaire et les éventuelles clés étrangères, et rebolote sur la ou les tables de destination<br />
La prochaine série darticles sur les index MySQL va nous amener à enchaîner quelques requêtes sur une des deux bases dexemple disponibles sur le site de MySQL : world et sakila, le prétexte est donc tout trouvé pour évoquer ici la solution que jai retenu pour obtenir le MCD de ces tables : DBDesigner 4.<br />
Cet outil nest pas nouveau, son successeur officiel est même déjà connu, il sagit de MySQL Workbench. Celui-ci nétant pas encore disponible sous linux, nous utiliserons son ancêtre et plus particulièrement sa fonctionnalité de reverse engineering : une fois connecté à votre base, DBDesigner 4 va générer sous forme graphique vos tables, leurs descriptions, et si tout se passe bien, les relations entre vos tables.<ul><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/fr.png" alt="fr" witdth="18" height="12" />&nbsp;<a href="http://www.dbnewz.com/2008/06/22/dbdesigner-4-generer-son-mcd-par-reverse-engineering/" title="http://www.dbnewz.com/2008/06/22/dbdesigner-4-generer-son-mcd-par-reverse-engineering/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=DBDesigner+4+%3A+gAcnAcrer+son+MCD+par+reverse+engineering&amp;content_id=0'; return false;"  class="weblink_img">DBDesigner 4 : générer son MCD par reverse engineering</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://dev.mysql.com/doc/sakila/en/sakila.html" title="http://dev.mysql.com/doc/sakila/en/sakila.html"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=sakila&amp;content_id=0'; return false;"  class="weblink_img">sakila</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.mysql.com/products/tools/workbench/" title="http://www.mysql.com/products/tools/workbench/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=MySQL+workbench&amp;content_id=0'; return false;"  class="weblink_img">MySQL workbench</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.fabforce.net/downloads.php" title="http://www.fabforce.net/downloads.php"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=DBdesigner+4&amp;content_id=0'; return false;"  class="weblink_img">DBdesigner 4</a> (0 visite)</li></ul></div>]]></content:encoded>
    <pubDate>Mon, 23 Jun 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>pager : retraitements des résultats MySQL</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/tutorial/18491-pager_:_retraitements_des_resultats_mysql.php</guid>
    <link>http://www.nexen.net/actualites/tutorial/18491-pager_:_retraitements_des_resultats_mysql.php</link>
    <description>
					
				    
Le client en ligne de commande MySQL dispose d'un système pour appeler des scripts externes avant d'afficher les résultats. On peut donc automatiser des mises en forme personnalisées, ou simplement noter des informations tout en traitant des données. 
Le plus simple est encore le pager less, qui évite les défilements infinis de données.
&amp;nbsp;
&amp;nbsp;
pager less
&amp;nbsp;
SHOW innodb STATUS\G
&amp;nbsp;
Baron Schwartz montre aussi comment calculer la durée d'attente d'un verrou ou bien comment l'utiliser avec Maatkit pour faire un affichage en arbre. Très pratique, vraiment.&amp;nbsp;Neat tricks for the MySQL command-line pager (0 visite)&amp;nbsp;Maatkit home page (0 visite)</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/maatkit.png">
				    </div><div class="blogcontent">
Le client en ligne de commande MySQL dispose d'un système pour appeler des scripts externes avant d'afficher les résultats. On peut donc automatiser des mises en forme personnalisées, ou simplement noter des informations tout en traitant des données. <br />
Le plus simple est encore le pager less, qui évite les défilements infinis de données.<br />
<pre>&nbsp;
&nbsp;
pager less
&nbsp;
SHOW innodb STATUS\G
&nbsp;</pre><br />
Baron Schwartz montre aussi comment calculer la durée d'attente d'un verrou ou bien comment l'utiliser avec Maatkit pour faire un affichage en arbre. Très pratique, vraiment.<ul><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.mysqlperformanceblog.com/2008/06/23/neat-tricks-for-the-mysql-command-line-pager/" title="http://www.mysqlperformanceblog.com/2008/06/23/neat-tricks-for-the-mysql-command-line-pager/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Neat+tricks+for+the+MySQL+commandline+pager&amp;content_id=0'; return false;"  class="weblink_img">Neat tricks for the MySQL command-line pager</a> (0 visite)</li><li><img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.maatkit.org/" title="http://www.maatkit.org/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=Maatkit+home+page&amp;content_id=0'; return false;"  class="weblink_img">Maatkit home page</a> (0 visite)</li></ul></div>]]></content:encoded>
    <pubDate>Mon, 23 Jun 2008 21:00:00 +0000</pubDate>
    <dc:creator>Nexen.net (Damien Seguy)</dc:creator>
  </item>

  <item>
    <title>DBDesigner 4 : générer son MCD par reverse engineering</title>
    <guid isPermaLink="false">http://www.dbnewz.com/?p=46</guid>
    <link>http://www.dbnewz.com/2008/06/22/dbdesigner-4-generer-son-mcd-par-reverse-engineering/</link>
    <description>Disposer d&amp;#8217;un MCD (modèle conceptuel de données) lorsqu&amp;#8217;on travaille sur une requête SQL impliquant différentes tables représente un gain de temps.Il est en effet plus rapide de jeter un coup d&amp;#8217;oeil sur un MCD afin de repérer quels sont les champs qui lient une table à une autre plutôt que d&amp;#8217;enchaîner les &amp;#8220;DESC ma_table&amp;#8221;, puis repérer la clé primaire et les éventuelles clés étrangères, et rebolote sur la ou les tables de destination&amp;#8230;La prochaine série d&amp;#8217;articles sur les index MySQL va nous amener à enchaîner quelques requêtes sur une des deux bases d&amp;#8217;exemple disponibles sur le site de MySQL : world et sakila, le prétexte est donc tout trouvé pour évoquer ici la solution que j&amp;#8217;ai retenu pour obtenir le MCD de ces tables : DBDesigner 4.
Cet outil n&amp;#8217;est pas nouveau, son successeur officiel est même déjà connu, il s&amp;#8217;agit de MySQL Workbench. Celui-ci n&amp;#8217;étant pas encore disponible sous linux, nous utiliserons son ancêtre et plus particulièrement sa fonctionnalité de &amp;#8220;reverse engineering&amp;#8221; : une fois connecté à votre base, DBDesigner 4 va générer sous forme graphique vos tables, leurs descriptions, et si tout se passe bien, les relations entre vos tables.
Installation (fastidieuse) sous linuxL&amp;#8217;installation de DBDesigner 4 sous linux (ubuntu 8.04 pour ma part) n&amp;#8217;est pas de tout repos&amp;#8230; J&amp;#8217;ai rencontré toutes les erreurs potentielles croisées sur les différents tutoriels sur le sujet. Résultat des courses : il apparaît plus simple d&amp;#8217;installer DBDesigner 4 en passant par wine, les problèmes de librairies manquantes disparaissent et les polices sont plus travaillées.Si néanmoins vous souhaitez vous passer de wine, voici quelques pistes : http://wiki.splitbrain.org/dbdesigner et un how-to tiré des forums ubuntu. Des solutions sont proposées pour ces fameuses libraries manquantes, cela dit j&amp;#8217;avais toujours des problèmes malgré ces manipulations.Une fois wine installé (apt-get install wine), téléchargez simplement le fichier d&amp;#8217;installation de DBDesigner 4 pour windows.
L&amp;#8217;installation s&amp;#8217;effectue simplement :
root@u200:/opt# wine DBDesigner4.0.5.6_Setup.exe Si vous êtes sous MySQL 5, vous devez modifier le mot de passe de l&amp;#8217;utilisateur à partir duquel vous vous connectez à DBDesigner de la façon suivante :mysql&amp;gt; SET PASSWORD FOR 'dbdesign'@'localhost' = OLD_PASSWORD('dbdesign');
Depuis sa version 5, MySQL utilise en effet un mécanisme d&amp;#8217;authentification qui est incompatible avec les versions précédentes (&amp;lt; 4.1). Afin d&amp;#8217;assurer une rétro compatibilité, il est néanmoins possible avec MySQL 5 d&amp;#8217;utiliser la commande &amp;#8220;OLD_PASSWORD&amp;#8220;, le format utilisé pour le mot de passe sera alors compatible avec MySQL 4 (short hash contre long hash pour MySQL 5).Lancement de l&amp;#8217;application:
root@u200:~/.wine/drive_c/Program Files/fabFORCE# wine DBDesigner4.exe
Obtenir le schéma de sa base
Pour générer votre MCD, et selon votre langue d&amp;#8217;installation :
- Choisissez le menu &amp;#8220;Database&amp;#8221;, puis &amp;#8220;Reverse Engineering&amp;#8221;.
- Selectionnez une connexion à la base de données ou créez la vôtre : &amp;#8220;Localhost 127.0.0.1&amp;#8243; par exemple, puis renseignez vos login/pwd et validez, n&amp;#8217;oubliez pas la commande &amp;#8220;OLD_PASSWORD&amp;#8221; si besoin.
- La fenêtre &amp;#8220;Reverse Engineering&amp;#8221; affiche alors la liste des tables de la base, par défaut elles sont toutes cochées. Remarquez un peu plus bas l&amp;#8217;option &amp;#8220;Build Relations&amp;#8220;, cochez-là puis indiquez &amp;#8220;Build Relations based on primary keys&amp;#8221;. C&amp;#8217;est grâce à cette option que vous indiquez à DBDesigner de relier vos tables entre elles (si possible).
- Si tout s&amp;#8217;est bien passé, l&amp;#8217;étape suivante affiche vos tables, leurs champs, leurs clés&amp;#8230;
Remarques : 
- DBDesigner ne parvient pas à joindre les tables de la base &amp;#8220;world&amp;#8221; entre elles, les noms des clés primaires sont différents et les clés étrangères absentes de la définition des tables (MyISAM), vous pouvez néanmoins rajouter vos différentes relations à la main.
- En ce qui concerne la base &amp;#8220;sakila&amp;#8221; les relations entre les tables sont bien présentes :

Vous pouvez à présent d&amp;#8217;un seul coup d&amp;#8217;oeil construire vos requêtes, les jointures entre les tables sont ici évidentes.
- La console dans laquelle vous lancez DBDesigner va peut-être contenir quelques messages d&amp;#8217;erreur du type:
QPixmap::operator=: Cannot assign to pixmap during paintingQPopupMenu: (unnamed) Popup has invalid menu item
Cela n&amp;#8217;a pas bloqué le comportement de l&amp;#8217;application lors de mes tests cependant DBDesigner a la facheuse tendance à ouvrir des boites de dialogues sous les fenêtres déjà existantes, n&amp;#8217;hésitez pas notamment lors de votre connexion à la base, à déplacer vos fenêtres (la principale et celle consacrée au reverse engineering) pour faire apparaître la boîte de dialogue vous invitant à renseigner vos identifiants de connexion. A noter qu&amp;#8217;il existe là aussi des solutions pour régler ce problème de pop-up, cf les tutoriels cités en début d&amp;#8217;article.
Pour explorer les autres fonctionnalités de DBDesigner 4, ou bien encore tester (sous windows uniquement pour le moment) son successeur MySQL Workbench, rendez-vous sur fabforce.net, vous y trouverez les fichiers d&amp;#8217;installation, des captures d&amp;#8217;écran et de la documentation.
Si vous connaissez d&amp;#8217;autres outils intéressants disposant d&amp;#8217;un module de &amp;#8220;reverse engineering&amp;#8221;, partagez-les dans les commentaires, ils sont là pour ça.</description>
    <content:encoded><![CDATA[<p>Disposer d&#8217;un MCD (modèle conceptuel de données) lorsqu&#8217;on travaille sur une requête SQL impliquant différentes tables représente un <strong id="tqz_">gain de temps</strong>.<br id="d0eo" />Il est en effet plus rapide de jeter un coup d&#8217;oeil sur un MCD afin de repérer quels sont les champs qui lient une table à une autre plutôt que d&#8217;enchaîner les &#8220;DESC ma_table&#8221;, puis repérer la clé primaire et les éventuelles clés étrangères, et rebolote sur la ou les tables de destination&#8230;<br id="ixuk" /><br id="ixuk0" />La prochaine série d&#8217;articles sur les index MySQL va nous amener à enchaîner quelques requêtes sur une des deux bases d&#8217;exemple disponibles sur le site de MySQL : <a href="http://dev.mysql.com/doc/" target="_blank">world et sakila</a>, le prétexte est donc tout trouvé pour évoquer ici la solution que j&#8217;ai retenu pour obtenir le MCD de ces tables : DBDesigner 4.</p>
<p>Cet outil n&#8217;est pas nouveau, son successeur officiel est même déjà connu, il s&#8217;agit de <a href="http://dev.mysql.com/workbench/" target="_blank">MySQL Workbench</a>. Celui-ci n&#8217;étant pas encore disponible sous linux, nous utiliserons son ancêtre et plus particulièrement sa fonctionnalité de &#8220;reverse engineering&#8221; : une fois connecté à votre base, DBDesigner 4 va générer sous forme graphique vos tables, leurs descriptions, et si tout se passe bien, les relations entre vos tables.</p>
<p><span id="more-46"></span><strong>Installation (fastidieuse) sous linux</strong><br id="m-dl0" /><br id="m-dl1" />L&#8217;installation de DBDesigner 4 sous linux (ubuntu 8.04 pour ma part) n&#8217;est pas de tout repos&#8230; J&#8217;ai rencontré toutes les erreurs potentielles croisées sur les différents tutoriels sur le sujet. Résultat des courses : il apparaît plus simple d&#8217;installer DBDesigner 4 en passant par <a href="http://www.winehq.org/" target="_blank">wine</a>, les <strong>problèmes de librairies manquantes</strong> disparaissent et les polices sont plus travaillées.<br id="swio" />Si néanmoins vous souhaitez vous passer de wine, voici quelques pistes : <a href="http://wiki.splitbrain.org/dbdesigner" target="_blank">http://wiki.splitbrain.org/dbdesigner</a> et un <a href="http://ubuntuforums.org/showthread.php?t=125911" target="_blank">how-to</a> tiré des forums ubuntu. Des solutions sont proposées pour ces fameuses libraries manquantes, cela dit j&#8217;avais toujours des problèmes malgré ces manipulations.<br id="tw3i" /><br id="tw3i0" />Une fois wine installé (<code>apt-get install wine</code>), téléchargez simplement <a href="http://www.fabforce.net/downloads.php" target="_blank">le fichier d&#8217;installation de DBDesigner 4</a> pour windows.</p>
<p>L&#8217;installation s&#8217;effectue simplement :</p>
<p><code>root@u200:/opt# wine DBDesigner4.0.5.6_Setup.exe</code> <br id="lq1_" /><br id="vkpd" />Si vous êtes sous MySQL 5, vous devez <strong>modifier le mot de passe</strong> de l&#8217;utilisateur à partir duquel vous vous connectez à DBDesigner de la façon suivante :<br id="vkpd0" /><br id="lq1_0" />mysql&gt; <code>SET PASSWORD FOR 'dbdesign'@'localhost' = OLD_PASSWORD('dbdesign');</code></p>
<p>Depuis sa version 5, MySQL utilise en effet un mécanisme d&#8217;authentification qui est incompatible avec les versions précédentes (&lt; 4.1). Afin d&#8217;assurer une rétro compatibilité, il est néanmoins possible avec MySQL 5 d&#8217;utiliser la commande &#8220;<a href="http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_old-password" target="_blank">OLD_PASSWORD</a>&#8220;, le format utilisé pour le mot de passe sera alors compatible avec MySQL 4 (short hash contre long hash pour MySQL 5).<br id="fvds" /><br id="rwen" />Lancement de l&#8217;application:</p>
<p><code>root@u200:~/.wine/drive_c/Program Files/fabFORCE# wine DBDesigner4.exe</code></p>
<p><strong>Obtenir le schéma de sa base</strong></p>
<p>Pour générer votre MCD, et selon votre langue d&#8217;installation :</p>
<p>- Choisissez le menu &#8220;Database&#8221;, puis &#8220;Reverse Engineering&#8221;.</p>
<p>- Selectionnez une connexion à la base de données ou créez la vôtre : &#8220;Localhost 127.0.0.1&#8243; par exemple, puis renseignez vos login/pwd et validez, n&#8217;oubliez pas la commande &#8220;OLD_PASSWORD&#8221; si besoin.</p>
<p>- La fenêtre &#8220;Reverse Engineering&#8221; affiche alors la liste des tables de la base, par défaut elles sont toutes cochées. Remarquez un peu plus bas l&#8217;option &#8220;<a href="http://www.fabforce.net/dbdesigner4/doc/db.html#reveng" target="_blank">Build Relations</a>&#8220;, cochez-là puis indiquez &#8220;Build Relations based on primary keys&#8221;. C&#8217;est grâce à cette option que vous indiquez à DBDesigner de relier vos tables entre elles (si possible).</p>
<p>- Si tout s&#8217;est bien passé, l&#8217;étape suivante affiche vos tables, leurs champs, leurs clés&#8230;</p>
<p><strong>Remarques : </strong></p>
<p>- DBDesigner ne parvient pas à joindre les tables de la base &#8220;world&#8221; entre elles, les noms des clés primaires sont différents et les clés étrangères absentes de la définition des tables (MyISAM), vous pouvez néanmoins rajouter vos différentes relations à la main.</p>
<p>- En ce qui concerne la base &#8220;sakila&#8221; les relations entre les tables sont bien présentes :</p>
<p><a href="http://www.dbnewz.com/wp-content/uploads/2008/06/sakila_db_small.png"><img class="alignnone size-full wp-image-47" title="sakila_db_small" src="http://www.dbnewz.com/wp-content/uploads/2008/06/sakila_db_small.png" alt="Vue partielle de la base sakila après reverse engineering" width="400" height="304" /></a></p>
<p>Vous pouvez à présent d&#8217;un seul coup d&#8217;oeil construire vos requêtes, les jointures entre les tables sont ici évidentes.</p>
<p>- La console dans laquelle vous lancez DBDesigner va peut-être contenir quelques messages d&#8217;erreur du type:</p>
<p><code>QPixmap::operator=: Cannot assign to pixmap during painting<br id="yfb50" />QPopupMenu: (unnamed) Popup has invalid menu item</code></p>
<p>Cela n&#8217;a pas bloqué le comportement de l&#8217;application lors de mes tests cependant DBDesigner a la facheuse tendance à <strong>ouvrir des boites de dialogues sous les fenêtres déjà existantes</strong>, n&#8217;hésitez pas notamment lors de votre connexion à la base, à déplacer vos fenêtres (la principale et celle consacrée au reverse engineering) pour faire apparaître la boîte de dialogue vous invitant à renseigner vos identifiants de connexion. A noter qu&#8217;il existe là aussi des solutions pour régler ce problème de pop-up, cf les tutoriels cités en début d&#8217;article.</p>
<p>Pour explorer les autres fonctionnalités de DBDesigner 4, ou bien encore tester (sous windows uniquement pour le moment) son successeur MySQL Workbench, rendez-vous sur <a href="http://www.fabforce.net/dbdesigner4/" target="_blank">fabforce.net</a>, vous y trouverez les fichiers d&#8217;installation, des captures d&#8217;écran et de la documentation.</p>
<p>Si vous connaissez d&#8217;autres outils intéressants disposant d&#8217;un module de &#8220;reverse engineering&#8221;, partagez-les dans les commentaires, ils sont là pour ça.</p>]]></content:encoded>
    <pubDate>Sun, 22 Jun 2008 10:54:07 +0000</pubDate>
    <comments>http://www.dbnewz.com/2008/06/22/dbdesigner-4-generer-son-mcd-par-reverse-engineering/#comments</comments>
    <dc:creator>DBNewz</dc:creator>
    <category>4.0</category>
    <category>4.1</category>
    <category>5.0</category>
    <category>5.1</category>
    <category>MySQL</category>
    <category>outils</category>
    <category>pratique</category>
  </item>

  <item>
    <title>Alertes sécurité des applications PHP et MySQL, édition 207</title>
    <guid isPermaLink="false">http://www.nexen.net/actualites/securite/18488-alertes_securite_des_applications_php_et_mysql,_edition_207.php</guid>
    <link>http://www.nexen.net/actualites/securite/18488-alertes_securite_des_applications_php_et_mysql,_edition_207.php</link>
    <description>
					
				    

PHP et MySQL ne font l'objet d'aucune alerte de s&amp;eacute;curit&amp;eacute; dans leurs versions courantes :
PHP 5.2.6 et 4.4.8; MySQL 5.0.51 (communaut&amp;eacute;) , 5.1.24-rc et 6.0.4. 
Les mises &amp;agrave; jour sont recommand&amp;eacute;es vers ces versions.


8 alertes de s&amp;eacute;curit&amp;eacute; ont &amp;eacute;t&amp;eacute; &amp;eacute;mises cette semaine, concernant des applications suivantes : 
Cache_Lite, Drupal, Gallery, Horde, Joomla, RoundCube Webmail, ming et vBulletin


Mambo Include File Bug in Cache_Lite Class Lets Remote Users E...
&amp;nbsp;http://www.SecurityTracker.com/alerts/2008/Jun/1020295.html (0 visite)
Site : &amp;nbsp;http://pear.php.net/package/Cache_Lite (0 visite)
Drupal TrailScout Module Cross-Site Scripting and SQL Injection Vulnerabilities
&amp;nbsp;http://www.secunia.com/advisories/30764/ title=Drupal TrailScout Module CrossSite Scripting and SQL Injection Vulnerabilities (0 visite)
Site : &amp;nbsp;http://drupal.org/ (0 visite)
Gallery 2.2.4 and Prior Versions Multiple Vulnerabilities
&amp;nbsp;http://www.securityfocus.com/bid/29681 (0 visite)
Site : &amp;nbsp;http://gallery.sourceforge.net/ (0 visite)
Horde Products Data Processing Cross Site Scripting Vulnerabilities
&amp;nbsp;http://www.frsirt.com/bulletins/14755 (0 visite)
Site : &amp;nbsp;http://www.horde.org/ (0 visite)
Joomla EXP Shop Component &amp;quot;catid&amp;quot; SQL Injection
&amp;nbsp;http://www.secunia.com/advisories/30791/ (0 visite)
Site : &amp;nbsp;http://www.secunia.com/advisories/30734/q class=qq title=RoundCube Webmail Script Insertion Vulnerability (0 visite)
RoundCube Webmail Script Insertion Vulnerability
&amp;nbsp;http://www.roundcube.net/ (0 visite)
Site : &amp;nbsp;http://www.securityfocus.com/bid/29581 (0 visite)
Microsoft DirectX MJPEG Video Streaming Stack Based Buffer Overflow Vulnerability
&amp;nbsp;http://sourceforge.net/projects/ming (0 visite)
Site : &amp;nbsp;http://www.secunia.com/advisories/30733/q class=q (0 visite)
vBulletin Cross-Site Scripting Vulnerability
&amp;nbsp;http://www.vbulletin.com/ (0 visite)
Site : &amp;nbsp;frsirt (0 visite)


&amp;nbsp;phpsecure (0 visite)
&amp;nbsp;secunia (0 visite)
&amp;nbsp;securityfocus (0 visite)
&amp;nbsp;securitytracker (0 visite)
</description>
    <content:encoded><![CDATA[<div class="content_header_img">
					<img alt="Image pour le titre du contenu" src="http://www.nexen.net/images/stories/biseau/securite.png">
				    </div><div class="blogcontent">
<p><br />
PHP et MySQL ne font l'objet d'aucune alerte de s&eacute;curit&eacute; dans leurs versions courantes :<br />
PHP 5.2.6 et 4.4.8; MySQL 5.0.51 (communaut&eacute;) , 5.1.24-rc et 6.0.4. <br />
Les mises &agrave; jour sont recommand&eacute;es vers ces versions.<br />
</p><br />
<p><br />
8 alertes de s&eacute;curit&eacute; ont &eacute;t&eacute; &eacute;mises cette semaine, concernant des applications suivantes : <br />
Cache_Lite, Drupal, Gallery, Horde, Joomla, RoundCube Webmail, ming et vBulletin<br />
</p><br />
<ul><br />
<li><strong>Mambo Include File Bug in Cache_Lite Class Lets Remote Users E...</strong><br />
<img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.SecurityTracker.com/alerts/2008/Jun/1020295.html" title="http://www.SecurityTracker.com/alerts/2008/Jun/1020295.html"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fwww.SecurityTracker.com%2Falerts%2F2008%2FJun%2F1020295.html&amp;content_id=0'; return false;"  class="weblink_img">http://www.SecurityTracker.com/alerts/2008/Jun/1020295.html</a> (0 visite)<br />
<em>Site :</em> <img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://pear.php.net/package/Cache_Lite" title="http://pear.php.net/package/Cache_Lite"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fpear.php.net%2Fpackage%2FCache_Lite&amp;content_id=0'; return false;"  class="weblink_img">http://pear.php.net/package/Cache_Lite</a> (0 visite)</li><br />
<li><strong>Drupal TrailScout Module Cross-Site Scripting and SQL Injection Vulnerabilities</strong><br />
<img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.secunia.com/advisories/30764/' title='Drupal TrailScout Module Cross-Site Scripting and SQL Injection Vulnerabilities" title="http://www.secunia.com/advisories/30764/' title='Drupal TrailScout Module Cross-Site Scripting and SQL Injection Vulnerabilities"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fwww.secunia.com%2Fadvisories%2F30764%2F+title%3DDrupal+TrailScout+Module+CrossSite+Scripting+and+SQL+Injection+Vulnerabilities&amp;content_id=0'; return false;"  class="weblink_img">http://www.secunia.com/advisories/30764/ title=Drupal TrailScout Module CrossSite Scripting and SQL Injection Vulnerabilities</a> (0 visite)<br />
<em>Site :</em> <img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://drupal.org/" title="http://drupal.org/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fdrupal.org%2F&amp;content_id=0'; return false;"  class="weblink_img">http://drupal.org/</a> (0 visite)</li><br />
<li><strong>Gallery 2.2.4 and Prior Versions Multiple Vulnerabilities</strong><br />
<img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.securityfocus.com/bid/29681" title="http://www.securityfocus.com/bid/29681"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fwww.securityfocus.com%2Fbid%2F29681&amp;content_id=0'; return false;"  class="weblink_img">http://www.securityfocus.com/bid/29681</a> (0 visite)<br />
<em>Site :</em> <img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://gallery.sourceforge.net/" title="http://gallery.sourceforge.net/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fgallery.sourceforge.net%2F&amp;content_id=0'; return false;"  class="weblink_img">http://gallery.sourceforge.net/</a> (0 visite)</li><br />
<li><strong>Horde Products Data Processing Cross Site Scripting Vulnerabilities</strong><br />
<img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.frsirt.com/bulletins/14755" title="http://www.frsirt.com/bulletins/14755"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fwww.frsirt.com%2Fbulletins%2F14755&amp;content_id=0'; return false;"  class="weblink_img">http://www.frsirt.com/bulletins/14755</a> (0 visite)<br />
<em>Site :</em> <img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.horde.org/" title="http://www.horde.org/"  onclick="window.location.href='http://www.nexen.net/index.php?option=com_nx_weblink&amp;weblink=http%3A%2F%2Fwww.horde.org%2F&amp;content_id=0'; return false;"  class="weblink_img">http://www.horde.org/</a> (0 visite)</li><br />
<li><strong>Joomla EXP Shop Component &quot;catid&quot; SQL Injection</strong><br />
<img src= "http://www.nexen.net/nx_media/images/drapeaux/en.png" alt="en" witdth="18" height="12" />&nbsp;<a href="http://www.secunia.com/advisories/30791/" title="http://www.secunia.com/advisories/30791/"  onclick="window.location.href='http://www.nex