<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>dbnewz</title>
	<atom:link href="http://www.dbnewz.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dbnewz.com</link>
	<description>le blog français sur les SGBD - MySQL, Oracle et plus...</description>
	<pubDate>Sat, 05 Jul 2008 09:41:04 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Vous avez une question? Nous y répondons!</title>
		<link>http://www.dbnewz.com/2008/07/05/vous-avez-une-question-nous-y-repondons/</link>
		<comments>http://www.dbnewz.com/2008/07/05/vous-avez-une-question-nous-y-repondons/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 22:29:11 +0000</pubDate>
		<dc:creator>pébé</dc:creator>
		
		<category><![CDATA[DBNewz]]></category>

		<category><![CDATA[IBMDB2]]></category>

		<category><![CDATA[MSSQL]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[RAC]]></category>

		<category><![CDATA[actu]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/2008/07/05/vous-avez-une-question-nous-y-repondons/</guid>
		<description><![CDATA[Un peu dans l&#8217;idée de asktom.oracle.com, le très célèbre site de Tom Kyte, grand gourou Oracle, nous lançons une sorte de Yahoo! Question - Réponse sauce DBNewz. Suite à l&#8217;idée d&#8217;Arnaud et sa série dont vous êtes le héros, nous vous invitons à poser une question par émail à question@( vous connaissez le domaine )  [...]]]></description>
			<content:encoded><![CDATA[<p>Un peu dans l&#8217;idée de asktom.oracle.com, le très célèbre site de Tom Kyte, grand gourou Oracle, nous lançons une sorte de Yahoo! Question - Réponse sauce DBNewz. Suite à l&#8217;idée d&#8217;Arnaud et <a href="http://www.dbnewz.com/2008/06/05/les-index-mysql-la-serie-dont-vous-etes-le-heros/">sa série dont vous êtes le héros</a>, nous vous invitons à poser une question par émail à question@( vous connaissez le domaine )  et nous y répondrons.</p>
<p>Quelle est la différence avec un forum? Nous retenons les meilleures questions et nous écrivons un article avec la dite question et sa réponse. Si vous ne voyez pas votre question, c&#8217;est que nous n&#8217;avons pas encore eu le temp d&#8217;y répondre&#8230;</p>
<p>A très bientôt!</p>
<p>PS: Cette adresse peut aussi être utilisée si vous constatez un problème sur le site&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/07/05/vous-avez-une-question-nous-y-repondons/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Problème de Feed&#8230;</title>
		<link>http://www.dbnewz.com/2008/07/04/probleme-de-feed/</link>
		<comments>http://www.dbnewz.com/2008/07/04/probleme-de-feed/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 21:49:41 +0000</pubDate>
		<dc:creator>pébé</dc:creator>
		
		<category><![CDATA[DBNewz]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/2008/07/04/probleme-de-feed/</guid>
		<description><![CDATA[Un petit post pour vous signaler que les problèmes de feed ont été résolus. Ce fut un léger problème de .htaccess et de nom de fichier&#8230;rien de très grave. Donc pardon à nos abonnés feedburner&#8230;
]]></description>
			<content:encoded><![CDATA[<p>Un petit post pour vous signaler que les problèmes de feed ont été résolus. Ce fut un léger problème de .htaccess et de nom de fichier&#8230;rien de très grave. Donc pardon à nos abonnés feedburner&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/07/04/probleme-de-feed/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Les index MySQL : types, placements, efficacité</title>
		<link>http://www.dbnewz.com/2008/06/27/les-index-mysql-types-placements-efficacite/</link>
		<comments>http://www.dbnewz.com/2008/06/27/les-index-mysql-types-placements-efficacite/#comments</comments>
		<pubDate>Fri, 27 Jun 2008 06:52:44 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
		
		<category><![CDATA[4.0]]></category>

		<category><![CDATA[4.1]]></category>

		<category><![CDATA[5.0]]></category>

		<category><![CDATA[5.1]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[index]]></category>

		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=48</guid>
		<description><![CDATA[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 devenir un héros rien qu&#8217;en lisant dbnewz ! Les véritables héros sont d&#8217;ailleurs abonnés au tout nouveau flux feedburner  )
Trois semaines d&#8217;attente, cela mérite un billet digne de ce nom, c&#8217;est parti.
Indexer, pourquoi ?L&#8217;indexation [...]]]></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  Duplicates: 0  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;  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> |   <strong>1</strong> |  <strong>Name</strong> </code></p>
<p><strong>|</strong><code><strong>name_cc_dis_pop</strong> |   <strong>2</strong> | <strong>CountryCode</strong> </code></p>
<p><code><strong>|</strong><strong>name_cc_dis_pop</strong> |   <strong>3</strong> | <strong>District</strong> </code></p>
<p><code> <strong>|name_cc_dis_pop</strong> |   <strong>4</strong> | <strong>Population</strong> |  <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  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>
			<wfw:commentRss>http://www.dbnewz.com/2008/06/27/les-index-mysql-types-placements-efficacite/feed/</wfw:commentRss>
		</item>
		<item>
		<title>DBDesigner 4 : générer son MCD par reverse engineering</title>
		<link>http://www.dbnewz.com/2008/06/22/dbdesigner-4-generer-son-mcd-par-reverse-engineering/</link>
		<comments>http://www.dbnewz.com/2008/06/22/dbdesigner-4-generer-son-mcd-par-reverse-engineering/#comments</comments>
		<pubDate>Sun, 22 Jun 2008 10:54:07 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
		
		<category><![CDATA[4.0]]></category>

		<category><![CDATA[4.1]]></category>

		<category><![CDATA[5.0]]></category>

		<category><![CDATA[5.1]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[outils]]></category>

		<category><![CDATA[pratique]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=46</guid>
		<description><![CDATA[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 gain de temps.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 [...]]]></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>
			<wfw:commentRss>http://www.dbnewz.com/2008/06/22/dbdesigner-4-generer-son-mcd-par-reverse-engineering/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Les certifications MySQL 5 : retour d&#8217;expérience</title>
		<link>http://www.dbnewz.com/2008/06/13/les-certifications-mysql-5-retour-dexperience/</link>
		<comments>http://www.dbnewz.com/2008/06/13/les-certifications-mysql-5-retour-dexperience/#comments</comments>
		<pubDate>Fri, 13 Jun 2008 06:23:15 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
		
		<category><![CDATA[5.0]]></category>

		<category><![CDATA[5.1]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[actu]]></category>

		<category><![CDATA[livres]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=44</guid>
		<description><![CDATA[Une certification MySQL, et pourquoi pas ? Peut-être y pensez-vous&#8230;
Présentation
Si vous vous demandez à quoi elles peuvent bien servir, MySQL a dressé une liste pour vous :
Une certification est censée&#8230;
- Valider votre savoir-faire
- Diminuer les risques liés à la manipulation de MySQL
- Permettre d&#8217;offrir à son entreprise une plus grande qualité de service
- Augmenter la [...]]]></description>
			<content:encoded><![CDATA[<p>Une certification MySQL, et pourquoi pas ? Peut-être y pensez-vous&#8230;</p>
<p><strong>Présentation</strong></p>
<p>Si vous vous demandez à quoi elles peuvent bien servir, MySQL <a href="http://www.mysql.com/certification/index.html" target="_blank">a dressé une liste</a> pour vous :</p>
<p>Une certification est censée&#8230;<br />
- Valider votre savoir-faire<br />
- Diminuer les risques liés à la manipulation de MySQL<br />
- Permettre d&#8217;offrir à son entreprise une plus grande qualité de service<br />
- Augmenter la productivité<br />
- Réduire les coûts de maintenance<br />
- Offrir à son détenteur une augmentation de salaire <img src='http://www.dbnewz.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Au-delà de cette version légèrement idéaliste/marketing et en évitant par ailleurs l&#8217;aspect souvent &#8220;polémique&#8221; concernant les certifications (les &#8220;pour&#8221;, les &#8220;contre&#8221;), ne cédons pas à la tentation du troll et voyons ce que MySQL nous propose.</p>
<p><span id="more-44"></span></p>
<p>Il existe aujourd&#8217;hui 4 certifications : &#8220;Associate&#8221; (CMA), &#8220;Developer&#8221; (CMDEV), &#8220;DBA&#8221; (CMDBA) et &#8220;Cluster&#8221; (CMCDBA).<br />
Chacune d&#8217;elles vise un public souvent différent et nécessite l&#8217;obtention de un ou deux examens composés de 70 questions (sauf la &#8220;Associate&#8221; qui en compte 50).<br />
Chaque examen est un QCM de 90 minutes (excepté la &#8220;Associate&#8221; : 60 min) dont les questions appellent de 1 à 5 réponses en général. Le &#8220;<a href="http://www.mysql.com/certification/certfaq.html" target="_blank">passing score</a>&#8221; se situe autour de 43-45 / 70 environ.</p>
<p>Pour réserver un examen, MySQL renvoie vers les centres de passage <a href="http://www.vue.com/mysql" target="_blank">Pearson Vue</a>, leur site internet vous permet de repérer les centres de passage près de chez vous. Attention, tous ne sont pas listés sur le site, il se peut qu&#8217;un centre proche de vous propose en fait la certification mais ne soit pas visible&#8230; Si vous ne trouvez pas votre bonheur, à vous de contacter les centres de formation locaux, ce sont souvent ces types d&#8217;organisme qui font passer les certifications.</p>
<p>Une fois certifié (champagne !), et si vous le souhaitez, votre nom peut apparaître dans la <a href="http://www.mysql.com/certification/candidates.php" target="_blank">liste des certifiés</a> par pays, procédé similaire aux &#8220;<a href="http://www.zend.com/fr/services/certification/" target="_blank">pages jaunes</a>&#8221; de Zend que certains d&#8217;entre vous connaissent peut-être.</p>
<p>Contrairement aux certifications Php (en tout cas à ce jour), avec MySQL vous repartez du centre d&#8217;examen avec le score détaillé de votre examen. Vos pourcentages de réussite sont affichés par chapitre. Ce type de statistiques permet de repérer ses faiblesses et évite de se demander pourquoi on a réussi ou pas l&#8217;examen&#8230; Quelque soit votre résultat vous visualiserez où sont vos forces et éventuelles faiblesses, c&#8217;est très appréciable.</p>
<p>Le tableau étant dressé, voyons dans le détail à quoi ressemblent ces certifications.</p>
<p><strong>Dans le détail</strong></p>
<p>- <a href="http://www.mysql.com/certification/candguide.html#t21" target="_blank">La certification &#8220;Associate&#8221;</a><br />
<strong> Première étape</strong> vers une &#8220;reconnaissance&#8221; liée à MySQL, la certification &#8220;Associate&#8221; a pour mission de tester les candidats sur MySQL dans ses grandes lignes.<br />
Les candidats devront prouver qu&#8217;ils connaissent les commandes de base SQL qui permettent de décrire une table, la supprimer, la vider&#8230;<br />
Ils seront également interrogés sur les types de caractères disponibles, les jointures : consultez <a href="http://www.mysql.com/certification/candguide.html#t24" target="_blank">la liste détaillée</a> sur le site de MySQL.<br />
Retenez que la certification &#8220;Associate&#8221; est un sous-ensemble de la certification &#8220;Developer&#8221;.<br />
La certification &#8220;Associate&#8221; requiert <strong>un seul examen</strong>, se déroule sur 60 minutes, comporte 50 questions et le score minimal à obtenir est d&#8217;environ 37 points.<br />
Je n&#8217;ai personnellement pas passé celle-ci mais si c&#8217;est votre cas n&#8217;hésitez pas à nous en faire part dans les commentaires pour partager votre expérience.</p>
<p>- <a href="http://www.mysql.com/certification/candguide.html#t26" target="_blank">La certification &#8220;Developer&#8221;</a><br />
Destinée aux développeurs ayant un minimum d&#8217;expérience avec MySQL, cette certification comporte <strong>deux  examens</strong> de 70 questions. Vous aurez 90 minutes maximum pour venir à bout d&#8217;un examen. Obtenez au moins 43 bonnes réponses si vous voulez éviter les problèmes&#8230;<br />
Voici une sélection de quelques thèmes parmi les plus représentés lors de l&#8217;examen :</p>
<p><a href="http://www.mysql.com/certification/candguide.html#t29" target="_blank"> Examen I</a></p>
<p>Le &#8220;client&#8221; mysql (à ne pas confondre avec le serveur &#8220;mysqld&#8221;), les types de données (un thème pas forcément sexy au premier abord mais nécessaire : gain de place, rapidité&#8230;), les tables et les index, les requêtes SQL : expressions SQL, requêtes de mises à jour, GROUP BY, UNION, etc.</p>
<p><a href="http://www.mysql.com/certification/candguide.html#t30" target="_blank">Examen II</a></p>
<p>Les jointures, les sous-requêtes, les vues, les procédures stockées, les metadatas (INFORMATION_SCHEMA) et un soupçon d&#8217;optimisation.</p>
<p>Comme son nom l&#8217;indique, cette certification est particulièrement destiné aux développeurs qui manipulent MySQL régulièrement. Vous ne réussirez pas l&#8217;examen sans le préparer si vous faites &#8220;simplement&#8221; une petite requête de temps en temps au sein de vos scripts php par exemple. Je la conseille à tous ceux qui apprécient les diverses fonctionnalités de MySQL et qui ont envie d&#8217;aller plus loin. Préparer ces deux examens renforcera vos connaissances et vous apprendra forcément quelque chose, vous en sortirez plus <strong>polyvalents</strong>, pas forcément expert en procédure stockées mais au moins vous aurez appris à en manipuler quelques-unes et si besoin, le jour J, vous serez capables de les mettre en place rapidement.</p>
<p>Pour ceux qui comme moi viennent du monde du développement web, la partie I sera la plus simple, la partie II nécessite davantage de travail. On peut en effet être développeur internet depuis plusieurs années sans avoir codé la moindre procédure stockée&#8230; La gestion du temps sera également plus importante pour cette seconde partie, les questions étant plus longues et nécessitant davantage de réflexions que lors de la partie I. Je ne peux pas trop vous en dire vu que chaque candidat s&#8217;engage à ne pas communiquer sur le contenu des questions, mais vous avez l&#8217;idée générale.<br />
Mes conseils pour se préparer aux certifications se trouvent en fin de ce billet.</p>
<p><a href="http://www.mysql.com/certification/candguide.html#t31" target="_blank">- La certification &#8220;DBA&#8221;</a></p>
<p>Bienvenue aux <strong>administrateurs</strong>, et pour les autres : au boulot !<br />
A l&#8217;instar de la certification &#8220;Developer&#8221;, la &#8220;DBA&#8221; est du même type : <strong>deux examens</strong> de 90 min chacun, 70 questions, et un passing score d&#8217;environ 45/70.</p>
<p>Parmi les thèmes les plus représentés, on retrouve :<br />
<a href="http://www.mysql.com/certification/candguide.html#t34" target="_blank"> Examen I</a><br />
Architecture de MySQL, configuration, démarrage et arrêt du serveur, la notion de verrouillage, les moteurs de stockage (une des parties les plus importantes, spécificités de MyISAM, InnoDB, Memory&#8230;), la maintenance des tables, les sauvegardes / restaurations.</p>
<p><a href="http://www.mysql.com/certification/candguide.html#t35" target="_blank">Examen II</a><br />
Gestion des utilisateurs (création, droits, etc), sécurité, optimisation de requêtes, optimisation de vos bases (selon vos moteurs de stockage), optimisation du serveur, montée en charge (étude de la réplication notamment&#8230;)</p>
<p>Comme vous le voyez les problématiques basculent pour la plupart dans un autre monde : celui de l&#8217;administrateur de bases de données. Cela dit, et ce fut une de mes motivations, il est également très intéressant lorsqu&#8217;on développe de connaître justement les différences entre les moteurs de stockage, comment jouer avec leurs forces et éviter leurs faiblesses dans un contexte donné par exemple.<br />
On peut également considérer que l&#8217;optimisation des requêtes relève là encore du monde du développement mais c&#8217;est bien sûr un sujet qu&#8217;un DBA se doit de maîtriser.</p>
<p>Mon point de vue sur cette certification &#8220;DBA&#8221; : elle nécessite davantage de travail lorsqu&#8217;on vient du monde du développement, l&#8217;examen I notamment nécessite de se familiariser avec les (nombreux) outils existant sous MySQL pour effectuer des tâches de maintenance par exemple. Ces outils possèdent un bon nombre d&#8217;options, parfois spécifiques à un moteur de stockage et pour corser le tout plusieurs outils sont capables d&#8217;effectuer les mêmes traitements&#8230;</p>
<p>L&#8217;examen II est à mon sens beaucoup plus ludique, vous y trouverez moins d&#8217;outils à retenir mais quelques variables serveur notamment (tuning) sont à mémoriser. Ce second examen est vraiment tourné vers l&#8217;<strong>optimisation</strong>, je ne saurais trop vous conseiller de vous entraîner à manipuler un serveur MySQL en testant différentes configurations et d&#8217;observer par vous-même ce qui se trouve par exemple dans la documentation.</p>
<p><a href="http://www.mysql.com/certification/candguide.html#t39" target="_blank">La certification Cluster</a></p>
<p>Au programme de celle-ci, <strong>un seul examen</strong>, 70 questions, 90 minutes et un passing score de 43/70 environ.<br />
Complètement tournée vers le MySQL Cluster, cet examen ne sera validé que si vous êtes <strong>déjà </strong>certifié DBA. C&#8217;est logique après tout : difficile de se plonger au coeur du MySQL Cluster si l&#8217;on n&#8217;a pas une bonne connaissance du serveur MySQL &#8220;classique&#8221;.<br />
MySQL conseille comme d&#8217;habitude d&#8217;avoir accumulé au moins un peu d&#8217;expérience en manipulant le cluster avant de se présenter à l&#8217;examen, (cf le paragraphe &#8220;Ma méthode&#8221;).</p>
<p><a href="http://www.mysql.com/certification/candguide.html#t42" target="_blank">Parmi les principaux thèmes</a> :<br />
Architecture et organisation du cluster (vraiment spécifique par rapport à un serveur MySQL standard), le moteur de stockage NDB, les fichiers de configuration du cluster (config.ini, my.cnf, les options disponibles&#8230;), démarrage / arrêt / gestion du cluster, les sauvegardes / restauration, tuning, résolutions de problèmes.</p>
<p>Au vu des spécificités d&#8217;une installation cluster par rapport à une installation MySQL classique, il n&#8217;est pas possible de se reposer uniquement sur les connaissances MySQL évoquées lors des certifications précédentes pour s&#8217;en sortir lors de cet examen. Lire la documentation tout en testant systématiquement soi-même tout ce que vous lisez participera bien sûr à votre futur succès.</p>
<p><strong>Comment se former ?<br />
</strong></p>
<p>Il y&#8217;a différentes façons de faire, tout dépend de votre volonté, du temps dont vous disposez mais également de vos finances&#8230;</p>
<p><a href="http://www.mysql.com/certification/studyguides/index.html" target="_blank">Les livres</a> :</p>
<p>- Le &#8220;<strong>MySQL Certification Study Guide</strong>&#8221; couvre les certifications Associate, Developer et DBA, c&#8217;est celui que j&#8217;ai utilisé. Il comporte en fait deux grandes parties : &#8220;Developer&#8221; et &#8220;DBA&#8221;, rappelons que la &#8220;Associate&#8221; est un sous-ensemble de la &#8220;Developer&#8221;.<br />
Moins aride que la documentation, tout est organisé pour vous faciliter la vie pour la certification, c&#8217;est un excellent ouvrage qui vous renseignera au-delà des examens, c&#8217;est une très bonne source d&#8217;informations concernant MySQL 5.<br />
Un de ces grands avantages : <strong>les exercices</strong> disponibles. Chaque chapitre dispose de son lot d&#8217;exercices (avec corrigés). Vraiment bien étudiés pour la certification, ces derniers sont un peu plus difficiles que lors de l&#8217;examen (ce qui est une bonne chose). A noter que le livre contient un CD contenant les pdf des différents chapitres et exercices.<br />
Pour 40 euros environ c&#8217;est un ouvrage que vous devez vous procurer si vous envisagez une de ces trois certifications. Il contient de plus un bon de réduction de 20% sur le prix de votre premier examen (à vérifier, il existe une date de validité, <a href="http://www.mysql.com/certification/studyguides/typo.html" target="_blank">renseignez-vous</a>).<br />
Seul point qui peut s&#8217;avérer négatif pour certains : <strong>le livre est en anglais</strong>&#8230; Cela dit, à aujourd&#8217;hui les certifications MySQL sont disponibles en deux langues : anglais et japonais, le choix est vite fait <img src='http://www.dbnewz.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>- Pour les amateurs de cluster le &#8220;<strong>MySQL 5.1 Cluster Certification Study Guide</strong>&#8221; est là encore une aide très précieuse, c&#8217;est celui-ci que j&#8217;ai utilisé.<br />
En anglais lui aussi, il se lit plus facilement que la documentation, comporte des exercices mais cette fois ni CD ni pdf, dommage mais pas dramatique. C&#8217;est un ouvrage que j&#8217;ai parcouru plusieurs fois avant l&#8217;examen et qui encore aujourd&#8217;hui me sert très souvent, son utilité dépasse le cadre de la certification : vous pouvez l&#8217;acheter tout simplement en tant que source d&#8217;informations sur le MySQL Cluster.</p>
<p><strong>- Les formations :</strong></p>
<p>Délivrées par <strong>différents organismes de formation</strong> (MySQL dispose également de cursus dédiés), ces formations se déroulent souvent sur plusieurs jours (2 à 5). Comptez jusqu&#8217;à 2000 euros environ pour une semaine de formation&#8230; Vu le tarif pratiqué ce sont des formations accessibles via son entreprise notamment, et pourquoi pas dans le cadre d&#8217;un DIF (<a href="http://vosdroits.service-public.fr/F10705.xhtml" target="_blank">Droit Individuel à la Formation</a>), renseignez-vous auprès de votre entreprise.<br />
Attention tout de même, si vous partez d&#8217;un niveau disons &#8220;standard&#8221; en MySQL le lundi matin 8h, et même après 5 jours de formation intensives, il n&#8217;est pas garanti que vous réussissiez le vendredi à 17h les deux examens requis pour une &#8220;Developer&#8221; ou une &#8220;DBA&#8221;, il faut en effet du temps et de la pratique pour assimiler toutes les connaissances requises&#8230; Vous aurez évidemment gagné du temps dans cet apprentissage, sans aucun doute, mais le contenu est dense. Il est préférable de prendre son temps pour intégrer des connaissances plutôt que de se bourrer le crâne la veille de l&#8217;examen et en avoir oublié la moitié 48h après le jour J quelque soit le résultat.</p>
<p>N&#8217;ayant pas testé moi-même ces formations je ne peux vous en conseiller une en particulier, en revanche je vous encourage à partager vos impressions dans les commentaires si vous avez testé cette formule.</p>
<p><strong>Ma méthode / Quelques chiffres</strong></p>
<p>- Armé uniquement des livres cités ci-dessus (MySQL certification guide et Cluster certification guide), j&#8217;ai procédé par ordre. Je me suis tout naturellement intéressé d&#8217;abord à la &#8220;Developer&#8221; avant d&#8217;attaquer la &#8220;DBA&#8221; qui m&#8217;intéressait aussi (raisons citées plus haut) et enfin tout cela m&#8217;a donné envie de découvrir le cluster,  que j&#8217;ai appris à connaître tout en préparant la certification.<br />
- En ce qui concerne les examens &#8220;Dev&#8221; et &#8220;DBA&#8221; j&#8217;ai décidé de faire des <strong>fiches</strong>&#8230; Chaque partie fait en effet 300 pages, du coup j&#8217;ai pensé que résumer tout cela sur des fiches me permettrait de parcourir l&#8217;essentiel plus rapidement qu&#8217;avec un bloc 600 pages. C&#8217;est sans doute vrai mais la rédaction prend du temps, je dirais 50% du temps d&#8217;apprentissage d&#8217;un examen pour ma part.<br />
- J&#8217;ai passé deux mois sur chaque examen de la &#8220;Dev&#8221;. Difficile de se faire une idée de ce que représentent vraiment deux mois, nous avons tous des plannings différents, des week-ends différents, mais cela donne un ordre d&#8217;idées, je n&#8217;avais pas de planning à tenir pour la &#8220;Dev&#8221; et la &#8220;DBA&#8221;, j&#8217;ai donc fait ça pendant mon temps libre, sans me fixer une date.<br />
- L&#8217;entraînement aidant, j&#8217;ai réduit la durée de préparation à un mois pour DBA I et 6 semaines pour DBA II.<br />
- Concernant la &#8220;Dev&#8221; et la &#8220;DBA&#8221;, j&#8217;ai d&#8217;abord étudié l&#8217;examen I, passé l&#8217;examen I, puis étudié l&#8217;examen II et passé l&#8217;examen II.<br />
- Je n&#8217;ai pas fait de fiche pour la cluster, j&#8217;y ai consacré environ 2 mois.<br />
- J&#8217;ai payé ma certification cluster 20$ au lieu de 200 euros lors de la conférence MySQL 2008 <img src='http://www.dbnewz.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> Les rabais sont importants lors de ce type d&#8217;évènements. Les certifications se déroulent alors sur papier, le score final n&#8217;est pas fourni, seul le résultat vous sera communiqué.<br />
- Si vous avez choisi les livres cités plus haut : <strong>effectuez tous les exercices proposés</strong>, au moins une fois ou deux, ils vous préparent efficacement aux questions des examens.<br />
- <strong>Testez, testez, testez !</strong> Installez-vous un serveur MySQL, un cluster MySQL si besoin et testez par vous-même tout ce que l&#8217;on vous présente dans la documentation, vous ne devez pas tout connaître par coeur mais le minimum est de tout comprendre. Si vous êtes sous Windows passez pourquoi pas par <a href="http://www.vmware.com" target="_blank">Vmware </a>pour vous installer des machines virtuelles hébergeant vos serveurs. Une fois la solution de Vmware installée, vous pouvez charger une <a href="http://www.vmware.com/appliances/directory/550" target="_blank">Debian Etch</a> par exemple et commencer vos installations / tests. Il est tout à fait possible à partir d&#8217;un seul pc de simuler plusieurs machines&#8230;</p>
<p><strong>Impressions finales</strong></p>
<p><strong></strong>- J&#8217;ai trouvé les examens Dev I et DBA II les plus simples, mon meilleur score fut d&#8217;ailleurs obtenu sur DBA II, le moins bon sur DBA I.<br />
- Pour moi DBA I fut peut-être le moins drôle, pas mal d&#8217;outils/d&#8217;options à retenir, pour ceux qui ne sont pas déjà DBA MySQL il y&#8217;a du travail ici.<br />
- Attention à la <strong>gestion du temps</strong> sur Dev II (cf le conseil de Giuseppe Maxia sur le jeu d&#8217;échecs dans les liens ci-dessous).<br />
- J&#8217;ai adoré la partie DBA II (optimisations), c&#8217;est ludique, concret et sympa à apprendre, vous pouvez très rapidement appliquer ce que vous apprenez dans votre job.</p>
<p>Pour résumer mes impressions concernant ces certifications, elles m&#8217;ont beaucoup appris, elles vous &#8220;forcent&#8221; à parcourir de façon précise des domaines auxquels vous n&#8217;auriez peut-être pas été confronté pendant encore longtemps. Lorsque vous visez une certification, vous avez un <strong>objectif</strong>, on parcourt donc les documentations d&#8217;un autre oeil dans ces cas là&#8230;<br />
Fort de ces nouvelles connaissances, vous aurez davantage de solutions à proposer face aux problèmes que vous rencontrerez.<br />
Les certifications ne feront pas de vous des dieux vivants en MySQL mais des professionnels avertis, au fait des outils existant et capables de monter plus rapidement en compétence sur des sujets dont vous n&#8217;étiez pas forcément spécialistes.<br />
Enfin, et c&#8217;est sans doute le plus important à mes yeux : <strong>les certifications aiguisent votre</strong> <strong>curiosité !</strong> Lorsque j&#8217;ai démarré la certification &#8220;Developer&#8221;, je ne pensais pas forcément passer la DBA, et encore moins la Cluster lors d&#8217;une <a href="http://www.dbnewz.com/2008/05/04/la-mysql-uc-2008-comme-si-vous-y-etiez/" target="_blank">conférence MySQL à Santa Clara</a> <img src='http://www.dbnewz.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>J&#8217;espère que ce retour d&#8217;expérience vous sera utile, si vous aussi vous avez passé une de ces certifications, laissez vos impressions dans les commentaires et faites en profiter la communauté !</p>
<p>Bien sûr, n&#8217;hésitez pas à poser ici vos questions concernant les certifications, j&#8217;y répondrai avec plaisir.</p>
<p><strong>Quelques liens pour aller plus loin :</strong></p>
<p><strong></strong>- <a href="http://www.mysql.com/certification/selftest/core/index.php" target="_blank">Testez-vous !</a> MySQL vous propose 10 questions pour chacune des certifications dont nous venons de parler, les questions m&#8217;ont l&#8217;air un peu plus simples que celles des examens mais elles valent le coup néanmoins.<br />
- Lisez aussi les conseils de <a href="http://datacharmer.blogspot.com/2006/10/take-mysql-certification-in-five-steps.html" target="_blank">Giuseppe Maxia</a> pour la certification, ainsi que ceux de <span><a href="http://marksitblog.blogspot.com/2007/06/preparing-for-mysql-5x-certification.html" target="_blank">Mark Schoonover</a> qui valent le détour également. Enfin le </span>blog de <a href="http://dave-stokes.blogspot.com/" target="_blank">Dave Stokes</a>, il travaille chez MySQL dans l&#8217;équipe de certification.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/06/13/les-certifications-mysql-5-retour-dexperience/feed/</wfw:commentRss>
		</item>
		<item>
		<title>&#8220;Les index MySQL&#8221; : la série dont vous êtes le héros</title>
		<link>http://www.dbnewz.com/2008/06/05/les-index-mysql-la-serie-dont-vous-etes-le-heros/</link>
		<comments>http://www.dbnewz.com/2008/06/05/les-index-mysql-la-serie-dont-vous-etes-le-heros/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 20:51:32 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
		
		<category><![CDATA[4.0]]></category>

		<category><![CDATA[4.1]]></category>

		<category><![CDATA[5.0]]></category>

		<category><![CDATA[5.1]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[index]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/2008/06/05/les-index-mysql-la-serie-dont-vous-etes-le-heros/</guid>
		<description><![CDATA[Un titre sans doute bien étrange pour certains et qui rappelera des souvenirs à d&#8217;autres, surtout à ceux qui ont déjà parcouru un de ces livres &#8220;dont vous êtes le héros&#8220;&#8230;
Afin que les choses soient claires pour tout le monde, je vous propose en fait de participer à la conception du sommaire de la future [...]]]></description>
			<content:encoded><![CDATA[<p>Un titre sans doute bien étrange pour certains et qui rappelera des souvenirs à d&#8217;autres, surtout à ceux qui ont déjà parcouru un de ces livres &#8220;<a href="http://fr.wikipedia.org/wiki/Livre-jeu" target="_blank">dont vous êtes le héros</a>&#8220;&#8230;</p>
<p>Afin que les choses soient claires pour tout le monde, je vous propose en fait de participer à la conception du sommaire de la future série d&#8217;articles sur les index qui sera publiée prochainement sur dbnewz.</p>
<p>L&#8217;indexation est en effet un thème auquel il faut <strong>absolument</strong> s&#8217;intéresser, tout d&#8217;abord pour éviter des catastrophes et bien sûr pour optimiser les performances !</p>
<p><span id="more-43"></span></p>
<p>Les index sont une arme redoutable, à double tranchant : oubliez-les et ils se rappeleront violemment à votre bon souvenir &#8220;ça ne fait pas 5 min que nous sommes en production et la base ne répond plus, la sonde cpu est à 100%, on ne peut même plus se connecter à la base (too many connections), qu&#8217;est ce qui se passe ?!&#8221; Dans le même genre d&#8217;extrêmes, invitez-les partout et vous compliquerez la tâche de l&#8217;optimiseur MySQL (chargé de concevoir le meilleur plan d&#8217;exécution possible pour vos requêtes), ralentirez vos mises à jour et augmenterez la taille de vos bases de données, générant d&#8217;autres problèmes&#8230;<br />
En revanche, une bonne stratégie d&#8217;indexation permet parfois d&#8217;obtenir des gains en performance très importants, parmi les plus importants qu&#8217;on puisse obtenir en agissant sur les réglages d&#8217;une configuration MySQL &#8220;classique&#8221;.</p>
<p>Ce que je vous propose donc, c&#8217;est non pas de m&#8217;envoyer des copies de vos plans d&#8217;exécution ou les schémas de vos tables, mais plutôt de poster ici vos attentes, les zones d&#8217;ombre que vous souhaiteriez éclaircir concernant les index.<br />
Exemples :<br />
&#8220;Pourquoi un index disponible n&#8217;est pas pris en compte ?&#8221;<br />
&#8220;En quoi indexer peut améliorer les performances ?&#8221;<br />
&#8220;Quels sont les champs à indexer ?&#8221;, etc, etc.</p>
<p>Profitez de l&#8217;occasion qui vous est donnée pour poster dans les commentaires de ce billet vos problématiques, vos souhaits, j&#8217;en tiendrai compte lors de la conception des différents chapitres que comportera cette série qui deviendra du &#8220;cousu main&#8221; pour tous les participants, intéressant non ?</p>
<p>A vos claviers <img src='http://www.dbnewz.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/06/05/les-index-mysql-la-serie-dont-vous-etes-le-heros/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL Cluster fait bande à part</title>
		<link>http://www.dbnewz.com/2008/05/28/mysql-cluster-fait-bande-a-part/</link>
		<comments>http://www.dbnewz.com/2008/05/28/mysql-cluster-fait-bande-a-part/#comments</comments>
		<pubDate>Wed, 28 May 2008 06:35:45 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
		
		<category><![CDATA[5.1]]></category>

		<category><![CDATA[actu]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/2008/05/28/mysql-cluster-fait-bande-a-part/</guid>
		<description><![CDATA[Kaj Arno annonce qu&#8217;à partir de la version 5.1.25 de MySQL Server, les binaires de MySQL Cluster ne feront plus parti du package. Pas de panique, c&#8217;est en fait une nouvelle branche qui est créee, le MySQL Cluster fera donc l&#8217;objet d&#8217;un package séparé (les versions sont pour l&#8217;instant identiques mais l&#8217;espace dédié est déjà [...]]]></description>
			<content:encoded><![CDATA[<p>Kaj Arno <a href="http://blogs.mysql.com/kaj/2008/05/23/mysql-clusters-improved-release-model/" target="_blank">annonce qu&#8217;à partir de la version 5.1.25 de MySQL Server</a>, les binaires de MySQL Cluster ne feront plus parti du package. Pas de panique, c&#8217;est en fait une nouvelle branche qui est créee, le MySQL Cluster fera donc l&#8217;objet d&#8217;un <a href="http://dev.mysql.com/downloads/#mysql-cluster" target="_blank">package séparé</a> (les versions sont pour l&#8217;instant identiques mais l&#8217;espace dédié est déjà crée).</p>
<p>A l&#8217;origine de cette division, des rythmes de développement différents entre MySQL Server et MySQL Cluster, mais aussi des retours de la part des utilisateurs du cluster indiquant que ces derniers sont davantage concernés par les derniers développements du MySQL Cluster plutôt que par ceux du MySQL Server. Cette séparation devrait donc permettre aux nouvelles versions de MySQL Cluster d&#8217;être publiées plus rapidement.</p>
<p><a href="http://jcole.us/blog/archives/2008/05/23/mysql-cluster-splits-from-mysql-not-pluggable/" target="_blank">Jeremy Cole</a> apporte son grain de sel à cette annonce et souligne que cette séparation dans les packages peut également être percue comme un &#8220;aveu&#8221; que le système actuel permettant à MySQL d&#8217;accueillir des moteurs &#8220;plugable&#8221; ne tient peut-être pas toutes ses promesses&#8230; Ce que reconnaît à demi-mot Stewart Smith (MySQL software engineer sur le cluster) dans les commentaires : l&#8217;opération n&#8217;est apparemment pas simple, les moteurs de stockage (NDB compris) effectuant selon lui plus de tâches qu&#8217;ils ne devraient.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/05/28/mysql-cluster-fait-bande-a-part/feed/</wfw:commentRss>
		</item>
		<item>
		<title>High Performance MySQL 2nd edition, pour bientôt&#8230; ou pas.</title>
		<link>http://www.dbnewz.com/2008/05/22/high-performance-mysql-2nd-edition-pour-bientot-ou-pas/</link>
		<comments>http://www.dbnewz.com/2008/05/22/high-performance-mysql-2nd-edition-pour-bientot-ou-pas/#comments</comments>
		<pubDate>Wed, 21 May 2008 22:34:13 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[actu]]></category>

		<category><![CDATA[livres]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/2008/05/22/high-performance-mysql-2nd-edition-pour-bientot-ou-pas/</guid>
		<description><![CDATA[Deux mauvaises nouvelles de la part de O&#8217;reilly ce mois-ci :
- J&#8217;attendais mon édition de High Performance MySQL 2nd edition pour la semaine prochaine, le 1er juin d&#8217;après le mail récapitulatif de précommande reçu fin avril, mais c&#8217;est la date du 1er juillet qui apparaît désormais sur la fiche d&#8217;Amazon France&#8230; Le .com indique en [...]]]></description>
			<content:encoded><![CDATA[<p>Deux mauvaises nouvelles de la part de O&#8217;reilly ce mois-ci :</p>
<p>- J&#8217;attendais mon édition de <a href="http://www.amazon.fr/High-Performance-MySQL-Optimization-Load-balancing/dp/0596101716/ref=sr_1_1?ie=UTF8&amp;s=english-books&amp;qid=1211402408&amp;sr=8-1" target="_blank">High Performance MySQL 2nd edition</a> pour la semaine prochaine, le 1er juin d&#8217;après le mail récapitulatif de précommande reçu fin avril, mais c&#8217;est la date du 1er juillet qui apparaît désormais sur la fiche d&#8217;Amazon France&#8230; Le .com indique en revanche la date du 19 juin, un peu flou tout ça.<br />
Ceux qui comme moi sont impatients de découvrir cette seconde édition (l&#8217;ancienne datait de 2004 et était déjà excellente) devront donc patienter encore un peu.<br />
D&#8217;ici là libre à vous de la précommander ou d&#8217;attendre mon verdict&#8230; qui ne pèsera sans doute pas grand chose face à la qualité des auteurs présents : les experts du fameux &#8220;<a href="http://www.mysqlperformanceblog.com" target="_blank">mysqlperformance blog</a>&#8221; (Baron Schwartz, Peter Zaitsev, Vadim Tkachenko), mais aussi <a href="http://jeremy.zawodny.com/blog/" target="_blank">Jeremy Zawodny</a> (de la précédente édition), <a href="http://arjen-lentz.livejournal.com/" target="_blank">Arjen Lentz</a>&#8230; Du beau linge !</p>
<p>- La véritable mauvaise nouvelle est ailleurs, il s&#8217;agit bien sûr de <a href="http://www.oreilly.fr/" target="_blank">la fermeture</a> de la filiale française d&#8217;O'Reilly survenue au début du mois, un évènement pas si hors-sujet sur un blog comme celui-ci : qui n&#8217;a jamais eu entre les mains un de leurs ouvrages ?<br />
En dépit de la qualité reconnue de ces derniers, la maison mère a fini par couper les subventions : les faits sont relatés sur <a href="http://www.immateriel.fr" target="_blank">immateriel.fr</a> (billet du 9 mai), un blog tenu par l&#8217;ancienne équipe semble-t-il. Souhaitons leur tout le succès qu&#8217;ils méritent dans leurs prochaines aventures.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/05/22/high-performance-mysql-2nd-edition-pour-bientot-ou-pas/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Choisir l&#8217;implémentation de ses index : &#8220;B-TREE&#8221; ou &#8220;HASH&#8221;, quelles différences ?</title>
		<link>http://www.dbnewz.com/2008/05/19/choisir-limplementation-de-ses-index-b-tree-ou-hash-quelles-differences/</link>
		<comments>http://www.dbnewz.com/2008/05/19/choisir-limplementation-de-ses-index-b-tree-ou-hash-quelles-differences/#comments</comments>
		<pubDate>Sun, 18 May 2008 23:12:15 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
		
		<category><![CDATA[4.1]]></category>

		<category><![CDATA[5.0]]></category>

		<category><![CDATA[5.1]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[index]]></category>

		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/2008/05/19/choisir-limplementation-de-ses-index-b-tree-ou-hash-quelles-differences/</guid>
		<description><![CDATA[Préambule technique à une série de futurs articles, je ne vous en dis pas plus, l&#8217;épisode du jour a pour point de départ un moteur de stockage MySQL avec à la clé la possibilité, ou pas, de définir l&#8217;implémentation de ses index : B-TREE ou HASH.
Ce choix n&#8217;est en effet pas toujours disponible, c&#8217;est même [...]]]></description>
			<content:encoded><![CDATA[<p>Préambule technique à une série de futurs articles, je ne vous en dis pas plus, l&#8217;épisode du jour a pour point de départ un moteur de stockage MySQL avec à la clé la possibilité, ou pas, de définir l&#8217;implémentation de ses index : B-TREE ou HASH.</p>
<p>Ce choix n&#8217;est en effet pas toujours disponible, c&#8217;est même plutôt rare puisque seul le moteur de stockage MEMORY vous permet depuis la version 4.1 de MySQL, d&#8217;effectuer ce choix. Nous ne parlerons pas ici du MySQL Cluster et de son moteur NDB qui sera abordé spécifiquement dans un autre épisode.</p>
<p>Pourquoi alors se soucier de ce type d&#8217;implémentation si seul le moteur MEMORY offre la possibilité de choisir ?<br />
- MyISAM et InnoDB pourraient à l&#8217;avenir proposer ce choix.<br />
- Afin de comprendre plus finement comment fonctionnent les index que vous utilisez tous les jours, se pencher sur la façon dont ils sont implémentés permet de mieux appréhender certains résultats.</p>
<p><span id="more-39"></span></p>
<p><strong>L&#8217;index B-TREE</strong></p>
<p>Star incontestée de l&#8217;implémentation de nos index sous MySQL, l&#8217;index B-TREE est partout. Et pour cause : c&#8217;est la seule implémentation disponible sous MyISAM et InnoDB, vos index sont donc systématiquement stockés sous forme de B-TREE si vos tables sont issues d&#8217;un de ces moteurs de stockage.</p>
<p>&#8220;Soient L et U deux entiers naturels non nuls tels que L ≤ U. On définit alors un L-U arbre B [...]&#8220;, &#8230; C&#8217;est exact, il y&#8217;a plusieurs façons d&#8217;expliquer le fonctionnement d&#8217;un index B-TREE, les formules mathématiques en sont une et <a href="http://fr.wikipedia.org/wiki/Arbre_B" target="_blank">wikipédia </a>s&#8217;en chargeant très bien, je ne vais donc pas recopier les formules mathématiques ici mais vous proposer plutôt un schéma :</p>
<p><img src="http://upload.wikimedia.org/wikipedia/en/5/5f/B-tree.png" alt="B-tree" width="303" height="88" /></p>
<p>Ce schéma est en fait issu <a href="http://slady.net/java/bt/" target="_blank">d&#8217;une animation</a> (essayez-là), cette applet java permet d&#8217;appréhender de façon presque ludique le fonctionnement du B-TREE. Amusez-vous à insérer des données et à prédire leur destination finale. Une fois que vous vous sentez à l&#8217;aise en insertion, testez le mode suppression et dites bonjour à la récursivité&#8230;</p>
<p>En deux mots, un B-TREE est un <strong>arbre équilibré</strong> (cette notion se perçoit bien visuellement), dont les données sont <strong>triées</strong>. A la base se trouve une racine de laquelle partent des noeuds qui se divisent ou fusionnent selon les données insérées. Chaque noeud a plusieurs clés ou valeurs, ce qui permet de diminuer la complexité de l&#8217;arbre et réduit la nécessité d&#8217;équilibrage (répartition des données).</p>
<p>Si les index B-TREE sont choisis par défaut pour les deux moteurs les plus utilisés, MyISAM et InnoDB, ça n&#8217;est pas par hasard. Polyvalents, les index B-TREE permettent d&#8217;effectuer un vaste choix de comparaisons.  Tous les opérateurs suivants sont autorisés : =, &gt;, &gt;=, &lt;, &lt;=, la commande SQL &#8220;BETWEEN&#8221; se rajoutant à cette liste.</p>
<p>Les valeurs extrèmes des noeuds peuvent être considérées comme des bornes qui déterminent l&#8217;emplacement potentiel d&#8217;une clé recherchée ou à insérer.</p>
<p><strong>Le HASH index</strong></p>
<p>Contrairement aux moteurs MyISAM et InnoDB, le moteur MEMORY utilise par défaut une implémentation de type HASH. Cela ne veut pas dire que vous ne pouvez pas créer de B-TREE pour autant pour une colonne en particulier :</p>
<p>mysql&gt; create table essai (id1 int, id2 int, unique using hash (id1), unique using btree (id2)) engine = memory;<br />
Query OK, 0 rows affected (0.05 sec)</p>
<p><code>mysql&gt; show create table essai;<br />
----------------------------------+<br />
| Table | Create Table<br />
----------------------------------+<br />
| essai | CREATE TABLE `essai` (<br />
`id1` int(11) default NULL,<br />
`id2` int(11) default NULL,<br />
UNIQUE KEY `id1` <strong>USING HASH</strong> (`id1`),<br />
UNIQUE KEY `id2` <strong>USING BTREE</strong> (`id2`)<br />
) ENGINE=MEMORY DEFAULT CHARSET=latin1</code></p>
<p>Quel est le principe de fonctionnement d&#8217;un index de type HASH ? Encore une fois, un schéma permet de se fixer les idées :</p>
<p><img src="http://www.dbnewz.com/wp-content/uploads/2008/05/20080519_hash_index.png" alt="hash index" width="362" height="195" /></p>
<p>Issu de l&#8217;article consacré aux <a href="http://fr.wikipedia.org/wiki/Table_de_hachage" target="_blank">tables de hachage</a> sur wikipedia, il permet de bien comprendre ce qui se passe.</p>
<p>On observe sur ce schéma que lors d&#8217;une recherche une fonction de hachage est appliquée sur la clé, ici &#8220;John Smith&#8221;. Une fois hachée, cette chaîne de caractères devient un index qui pointe vers la donnée recherchée (le numéro de téléphone).<br />
A noter : les données ne sont pas <strong>ordonnées</strong>.</p>
<p>Conséquence de ce mécanisme, les index HASH permettent uniquement les comparaisons d&#8217;égalité effectuées via les opérateurs &#8220;=&#8221; ou &#8220;&lt;=&gt;&#8221;. Rappelons que &#8220;&lt;=&gt;&#8221; permet de considérer la valeur NULL comme une valeur &#8220;normale&#8221;, exemple :</p>
<p><code>mysql&gt; select NULL = NULL;<br />
+-------------+<br />
| NULL = NULL |<br />
+-------------+<br />
|        NULL        |<br />
+-------------+<br />
1 row in set (0.00 sec)</code></p>
<p><code>mysql&gt; select NULL &lt;=&gt; NULL;<br />
+---------------+<br />
| NULL &lt;=&gt; NULL |<br />
+---------------+<br />
|             1             |<br />
+---------------+</code></p>
<p>Bref, les index HASH ne permettent pas de répondre à tous les types de requête.</p>
<p>Démonstration en utilisant la base bien connue &#8220;world&#8221; <a href="http://dev.mysql.com/doc/" target="_blank">disponible au téléchargement</a> sur le site de MySQL.<br />
Issue de cette base, la table &#8220;country&#8221; contient 239 pays dont la clé primaire est un code de trois caractères, &#8216;FRA&#8217; pour la France par exemple. On cherche à déterminer quels sont les pays dont le code abrégé est supérieur à la chaîne de caractère &#8216;TOTO&#8217; .</p>
<p>Par défaut cette table est en MyISAM. Nous sommes donc en présence d&#8217;une implémentation B-TREE pour l&#8217;index. On effectue un EXPLAIN sur une requête très simple :</p>
<p>mysql&gt; explain select * from country where code &gt; &#8216;TOTO&#8217;\G<br />
*************************** 1. row ******</p>
<p>id: 1<br />
select_type: SIMPLE<br />
table: country<br />
type: range<br />
possible_keys: PRIMARY<br />
key: PRIMARY<br />
key_len: 3<br />
ref: NULL<br />
rows: 27<br />
Extra: Using where<br />
1 row in set (0.00 sec)</p>
<p>(A noter : le &#8220;\G&#8221; permet un affichage vertical à partir du client mysql.)</p>
<p>On voit ici que la clé primaire est bien utilisée pour répondre à cette requête (key : PRIMARY).</p>
<p>Modifions le moteur de stockage pour du MEMORY et réappliquons la même requête :</p>
<p>mysql&gt; alter table country engine = MEMORY;<br />
Query OK, 239 rows affected (0.06 sec)<br />
Records: 239  Duplicates: 0  Warnings: 0</p>
<p>mysql&gt; explain select * from country where code &gt; &#8216;TOTO&#8217;\G<br />
*************************** 1. row ************</p>
<p>id: 1<br />
select_type: SIMPLE<br />
table: country<br />
type: ALL<br />
possible_keys: PRIMARY<br />
key: NULL<br />
key_len: NULL<br />
ref: NULL<br />
rows: 239<br />
Extra: Using where<br />
1 row in set (0.00 sec)</p>
<p>On voit ici que la recherche n&#8217;a pas pu s&#8217;effectuer via la clé primaire implémentée en HASH. La clé primaire est bien détectée comme candidate potentielle (possible_keys : PRIMARY) mais elle n&#8217;est finalement pas retenue (key : NULL) et c&#8217;est finalement un parcours total de la table qui sera effectué (type : ALL).</p>
<p>Les données n&#8217;étant pas ordonnées, l&#8217;indexation du champ &#8220;Code&#8221; n&#8217;a malgré tout pas permis de déterminer qu&#8217;elles étaient les valeurs des codes suivants ou précédents.</p>
<p>Bien évidemment sur un tel exemple à la volumétrie aussi faible, l&#8217;impact sur les performances est insignifiant. Néanmoins ceci permet de comprendre que la transformation d&#8217;une table MyISAM à une table MEMORY par un simple ALTER TABLE ne permet pas forcément d&#8217;obtenir le même plan d&#8217;exécution sur les deux moteurs et ceci pour une définition de table identique.<br />
Il faut donc surveiller le plan d&#8217;exécution avant et après la transformation, ainsi que mesurer les performances obtenues (benchmarks) afin de mesurer l&#8217;impact du passage d&#8217;un moteur à l&#8217;autre. Accéder à des données en mémoire est bien sûr plus rapide qu&#8217;aller les chercher sur disque mais peut-être avez-vous réellement besoin qu&#8217;un index particulier soit pris en compte, à vous de le vérifier.</p>
<p>A noter enfin qu&#8217;il est possible avec le moteur MEMORY de définir pour une colonne donnée un HASH index non unique, c&#8217;est une implémentation des HASH index un peu particulière choisie par MySQL. <a href="http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html" target="_blank">La documentation</a> conseille d&#8217;ailleurs à ce sujet d&#8217;utiliser l&#8217;implémentation B-TREE pour les champs dont les données sont trop redondantes. En effet, des ralentissements proportionnels à cette redondance sont à prévoir lors des UPDATE et DELETE. Un billet de <a href="http://www.mysqlperformanceblog.com/2008/02/01/performance-gotcha-of-mysql-memory-tables" target="_blank">Peter Zaitsev</a> relate parfaitement ce phénomène.</p>
<p><strong>InnoDB et l&#8217;ADAPTIVE </strong><strong>HASH INDEX</strong></p>
<p>Particularité d&#8217;InnoDB, ce moteur est capable de &#8220;transformer&#8221; les index B-TREE en équivalent HASH si l&#8217;optimiseur détecte qu&#8217;un gain est possible, d&#8217;où le nom de cette technique : <a href="http://dev.mysql.com/doc/refman/5.0/en/innodb-adaptive-hash.html" target="_blank">ADAPTIVE HASH INDEX</a>, (attention la traduction française utilise &#8220;base en mémoire&#8221;, il s&#8217;agit d&#8217;une &#8220;table&#8221;).<br />
Dans un tel cas, les index restent implémentés en B-TREE, cependant InnoDB peut créer à la volée des versions HASH de ces derniers. La commande SHOW INNODB STATUS est alors toute indiquée pour observer <a href="http://mysqldba.blogspot.com/2006/07/show-innodb-status-adaptive-hash-index.html" target="_blank">les performances relatives aux deux implémentations</a>.</p>
<p><strong>A retenir :</strong></p>
<p>- Parmi MyISAM, InnoDB et MEMORY, seul le moteur de stockage MEMORY vous permet de choisir l&#8217;implémentation (B-TREE ou HASH) de vos index.<br />
- Ce choix a une incidence sur le plan d&#8217;exécution de vos requêtes.<br />
- Les index de type HASH sont très performants mais restreints aux  opérateurs &#8220;=&#8221; et &#8220;&lt;=&gt;&#8221;.<br />
- Les index de type B-TREE sont les plus utilisés et plus polyvalents (&#8221;=&#8221;, &#8220;&gt;&#8221;, &#8220;&gt;=&#8221;, &#8220;&lt;&#8221;, &#8220;&lt;=&#8221;).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/05/19/choisir-limplementation-de-ses-index-b-tree-ou-hash-quelles-differences/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Les SSD (Solid-State Drive) : une technologie d&#8217;avenir pour nos SGBD ?</title>
		<link>http://www.dbnewz.com/2008/05/13/les-ssd-solid-state-drive-une-technologie-davenir-pour-nos-sgbd/</link>
		<comments>http://www.dbnewz.com/2008/05/13/les-ssd-solid-state-drive-une-technologie-davenir-pour-nos-sgbd/#comments</comments>
		<pubDate>Tue, 13 May 2008 06:12:34 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
		
		<category><![CDATA[IBMDB2]]></category>

		<category><![CDATA[MSSQL]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[Oracle]]></category>

		<category><![CDATA[benchmarks]]></category>

		<category><![CDATA[hardware]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/2008/05/13/les-ssd-solid-state-drive-une-technologie-davenir-pour-nos-sgbd/</guid>
		<description><![CDATA[Modifier une petite ligne dans le fichier de configuration de son SGBD et obtenir les performances souhaitées, c&#8217;est possible&#8230; si vous êtes chanceux. La performance globale d&#8217;un SGBD repose en effet sur un ensemble de briques, logicielles ou matérielles, qui une fois empilées correctement forment un ensemble cohérent (et performant) : la seule étape du [...]]]></description>
			<content:encoded><![CDATA[<p>Modifier une petite ligne dans le fichier de configuration de son SGBD et obtenir les performances souhaitées, c&#8217;est possible&#8230; si vous êtes chanceux. La performance globale d&#8217;un SGBD repose en effet sur un ensemble de briques, logicielles ou matérielles, qui une fois empilées correctement forment un ensemble cohérent (et performant) : la seule étape du fichier de configuration ne suffit pas.</p>
<p>Dans un de ses <a href="http://www.bigdbahead.com/?p=49" target="_blank">récents billets</a>, Matt Yonkovit a déclenché une série de <a href="http://www.mysqlperformanceblog.com/2008/04/25/is-disk-everything-for-mysql-performance/" target="_blank">réflexions intéressantes</a> à propos de l&#8217;impact des performances des disques durs sur l&#8217;ensemble du SGBD.</p>
<p>Selon lui, les problèmes de performance au sein d&#8217;un SGBD sont la plupart du temps relatifs aux disques durs et notamment au nombre d&#8217;I/O (Entrées/Sorties) qu&#8217;ils sont capables de traiter par seconde (IOPS).</p>
<p>Comparés aux processeurs actuels capables de prendre plusieurs milliards de décisions par seconde (Ghz) et aux mémoires vives dont les temps d&#8217;accès se mesurent en nanosecondes, le temps d&#8217;accès d&#8217;un disque dur se compte encore en millisecondes&#8230; Difficile de lutter contre des éléments purement électroniques quand on est constitué d&#8217;éléments mécaniques en mouvement (têtes de lecture, plateaux&#8230;).</p>
<p><span id="more-37"></span></p>
<p>Afin d&#8217;avoir recours le moins possible aux disques, l&#8217;utilisation des index est une première étape qu&#8217;on complètera par différents mécanismes de caching afin de limiter encore davantage les accès à ce support et éviter ainsi que le disque ne constitue un goulet d&#8217;étranglement (&#8221;I/O bound&#8221;).</p>
<p>Outre ces mécanismes, la technologie SSD pourrait bien à l&#8217;avenir changer la donne.</p>
<p>Les SSD, littéralement <a title="Open HDD and SSD" href="http://en.wikipedia.org/wiki/Image:Open_HDD_and_SSD.JPG" target="_blank">Solid-State Drives</a> (ou Disk par abus de langage), ne sont pas des  disques mais des unités de stockage constituées de mémoire flash (persistante).</p>
<p>Au vu des benchmarks les concernant, il y&#8217;a fort à parier que les SSD seront de plus en plus d&#8217;actualité dans les mois qui viennent.<br />
Ces <a href="http://www.bigdbahead.com/?p=44" target="_blank">benchmarks </a>sont unanimes sur un point : les SSD obtiennent d&#8217;excellentes performances lors des random read, laissant loin derrière les disques &#8220;classiques&#8221;. Grosse ombre au tableau néanmoins : les tests effectués sur des random write ne sont pas aussi concluants. Pourquoi ?</p>
<p>Sur un disque classique un &#8220;random read&#8221; entraîne (du plus couteux au moins couteux) :<br />
- le déplacement de la tête de lecture/écriture sur la bonne piste (&#8221;seek time&#8221;)<br />
- une fois la tête sur la bonne piste, il faut encore repérer sur celle-ci le bloc secteur demandé (&#8221;rotational latency&#8221;)<br />
- la lecture et la transmission de la donnée vers le système.</p>
<p>Avec un SSD, le même &#8220;random read&#8221; est beaucoup plus rapide : pas de tête de lecture à déplacer ni d&#8217;attente liée à la rotation d&#8217;un plateau. Conclusion, comptez environ 5 ms de temps d&#8217;accès à un secteur particulier pour un disque performant et environ 0.15 ms pour un SSD.</p>
<p>En revanche, lors d&#8217;une écriture, le SSD est par conception beaucoup plus lent qu&#8217;en lecture : la &#8220;préparation&#8221; obligatoire de l&#8217;importante zone dédiée à l&#8217;écriture (&#8221;erase block&#8221;) et un <a href="http://managedflash.com/technology/problem.htm" target="_blank">ensemble d&#8217;écritures spécifique</a> à cette technologie pénalisent les performances.</p>
<p>Face à ce problème connu, des parades logicielles voient le jour et la plupart des constructeurs de SSD proposeront sûrement leur propre solution dans les mois à venir. Actuellement <a href="http://managedflash.com/what/index.htm" target="_blank">la technologie MFT</a> (Managed Flash Technology) offre déjà de grandes améliorations (cf lien &#8220;benchmarks&#8221; ci-dessus, 3ème graphique). Les performances obtenues sont sensiblement égales lors des random read par rapport aux SSD classiques mais les résultats sont 30x supérieurs en random write par rapport aux SSD et 15x supérieurs aux disque durs.</p>
<p>Enfin, un autre signe que le SSD est très certainement une technologie d&#8217;avenir : un des plus récents moteurs pour MySQL, <a href="http://www.primebase.org/" target="_blank">PBXT</a>, est <a href="http://assets.en.oreilly.com/1/event/2/Inside%20the%20PBXT%20Storage%20Engine%20Presentation.pdf" target="_blank">conçu pour fonctionner avec les SSD</a> (pdf).</p>
<p>Pour résumer, concernant les SSD :</p>
<p>Avantages :<br />
- Très rapide en random read<br />
- Peu sensible à la fragmentation des fichiers : performances constantes.<br />
- Fiabilité supérieure au HD (pas d&#8217;éléments mécaniques en mouvement)</p>
<p>Inconvénients des SSD :<br />
- Prix<br />
- Capacités en deça des disques actuels<br />
- Durée de vie plus courte qu&#8217;un disque (nombres de cycles d&#8217;écriture limités)</p>
<p>Améliorations attendues (et en cours) :<br />
- Chute des prix<br />
- Augmentation des performances en écriture<br />
- Augmentation de la capacité<br />
- Meilleure répartition des écritures sur le support (augmentation du nombre de cycles écritures / durée de vie)</p>
<p>Si cette rapide présentation des SSD a aiguisé votre curiosité, voici quelques pistes pour aller plus loin  :<br />
- <a href="http://feedblog.org/category/ssd/" target="_blank">Le blog</a> de Kevin Burton.<br />
- <a href="http://en.wikipedia.org/wiki/Solid-state_drive" target="_blank">La rubrique SSD</a> sur Wikipédia (notamment les références en bas de page).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/05/13/les-ssd-solid-state-drive-une-technologie-davenir-pour-nos-sgbd/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
