<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bases de données | Magazine Jeux</title>
	<atom:link href="https://www.magazine-jeux.com/category/developpement/bases-de-donnees/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.magazine-jeux.com</link>
	<description>Le magazine des jeux en ligne</description>
	<lastBuildDate>Fri, 15 Jun 2007 05:00:00 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.8</generator>
	<item>
		<title>Optimisation : MySQL</title>
		<link>https://www.magazine-jeux.com/optimisation-mysql/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Fri, 15 Jun 2007 05:00:00 +0000</pubDate>
				<category><![CDATA[Bases de données]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/optimisation-mysql/</guid>

					<description><![CDATA[Le but ici est de comparer les types de tables MyISAM et InnoDB. Pour cela, nous avons pris une base de test que nous avons remplie au fur à et mesure avec du texte aléatoire, jusqu&#8217;à obtenir 1 000 000 d&#8217;enregistrements. C&#8217;est à partir de cette base que nous avons effectué les tests. Pour commencer, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Le but ici est de comparer les types de tables MyISAM et InnoDB. Pour cela, nous avons pris une base de test que nous avons remplie au fur à et mesure avec du texte aléatoire, jusqu&rsquo;à obtenir 1 000 000 d&rsquo;enregistrements. C&rsquo;est à partir de cette base que nous avons effectué les tests.</p>
<p>Pour commencer, voici donc le temps nécessaire pour remplir une base :</p>
<table>
<tbody>
<tr class='row_even'>
<td><strong>Table</strong></td>
<td><strong>Enregistrements</strong></td>
<td><strong>Temps</strong></td>
</tr>
<tr class='row_odd'>
<td>MyIsam</td>
<td>100 000</td>
<td>72sec</td>
</tr>
<tr class='row_even'>
<td>InnoDB</td>
<td>100 000</td>
<td>>2min</td>
</tr>
<tr class='row_odd'>
<td>MyISAM</td>
<td>20 000</td>
<td>1.43 sec</td>
</tr>
<tr class='row_even'>
<td>InnoDB</td>
<td>20 000</td>
<td>105 sec</td>
</tr>
</tbody>
</table>
<p>C&rsquo;est indiscutable, InnoDB semble plus lent pour l&rsquo;insertion des données. Et pourquoi donc ?! Il faut savoir que InnoDB est de type transactionnelle alors que MyISAM est (on s&rsquo;en doute un peu) non-transactionnelle. Bon&#8230; Et ?! Ca veux dire quoi au juste ces termes barbares ?!</p>
<p>Les tables non-transactionnelles sont plus rapide, utilisent moins d&rsquo;espace disque et moins de mémoire. Alors pourquoi choisir InnoDB ?! Car les tables transactionnelles sont plus sûr (en cas de crash de MySQL, vous pouvez tout de même récupérer vos données) et pour d&rsquo;autres petits détails qui sortent un peu de cet article.</p>
<p>Les tables contiennent 4 champs : </p>
<table>
<tbody>
<tr class='row_even'>
<td><strong>Champ</strong></td>
<td><strong>Type</strong></td>
</tr>
<tr class='row_odd'>
<td>Id</td>
<td>bigint</td>
</tr>
<tr class='row_even'>
<td>Nom</td>
<td>varchar(30), null autorisé</td>
</tr>
<tr class='row_odd'>
<td>Prenom</td>
<td>varchar(30) , null autorisé</td>
</tr>
<tr class='row_even'>
<td>Age</td>
<td>Tinyint</td>
</tr>
</tbody>
</table>
<p>Alors, nous voilà avec une table de 1 000 000 enregistrements (lignes) et nous allons pouvoir commencer les premiers tests. Juste pour info, voilà la place occupée par les différentes tables utilisées pour les tests (estimation de PhpMyAdmin, après optimisation) :</p>
<table>
<tbody>
<tr class='row_even'>
<td><strong>table</strong></td>
<td> <strong>index sur Nom</strong></td>
<td><strong>Taille pour VACHAR(30</strong></td>
<td> <strong>Taille pour CHAR(30)</strong></td>
</tr>
<tr class='row_odd'>
<td>MyISAM</td>
<td> non</td>
<td>56.4Mo</td>
<td>194.9Mo</td>
</tr>
<tr class='row_even'>
<td>InnoDB</td>
<td>non</td>
<td>60.6Mo</td>
<td>93.6Mo</td>
</tr>
<tr class='row_odd'>
<td>MyISAM</td>
<td> oui</td>
<td>61.8Mo</td>
<td>202Mo</td>
</tr>
<tr class='row_even'>
<td>InnoDB</td>
<td>oui</td>
<td>104.2Mo</td>
<td>168.4Mo</td>
</tr>
</tbody>
</table>
<p>On constate que InnoDB ne prend pas forcément plus de place que MyISAM. Mais cela tient surtout aux choix de stockage des données si vous choisissez plutôt CHAR que VARCHAR par exemple. Il faut bien garder à l&rsquo;esprit que CHAR va allouer la taille indiqué (ici 30) quelque soit la quantité d&rsquo;information stockée alors que VARCHAR va allouer la taille de l&rsquo;information stockée (plus un reliquat pour indiqué la fin).<br />
<br />CHAR peut s&rsquo;avérer plus rapide sur des tailles importantes (à partir de 100), mais n&rsquo;a pratiquement aucune incidence en dessous.</p>
<p>Dans tous les tests que nous avons fait, le terme recherché, que ce soit un chiffre ou des lettres, est changé à chaque itération afin de ne pas récupérer un résultat dans un cache. Car, en effet, si MySQL reçoit une requête déjà effectuée, cette seconde requête (et les suivantes) est nettement plus rapide. La recherche est lancée plusieurs fois et le temps affiché est une moyenne. Les tests ont été relancés plusieurs fois à différents moments pour être certain que rien ne pouvait interférer sur les résultats.</p>
<h2>Les tests</h2>
<hr />
<p><strong>SELECT * FROM MaTable WHERE Age>45</strong></p>
<table>
<tbody>
<tr class='row_even'>
<td><strong>Table</strong></td>
<td><strong>Résultat</strong></td>
</tr>
<tr class='row_odd'>
<td>MyISAM</td>
<td>1.370</td>
</tr>
<tr class='row_even'>
<td>InnoDB</td>
<td>2.376</td>
</tr>
</tbody>
</table>
<p>InnoDB est plus lent sur une requête simple.</p>
<hr />
<p><strong>SELECT * FROM MaTable WHERE Nom=&rsquo;dummy&rsquo;</strong></p>
<table>
<tbody>
<tr class='row_even'>
<td><strong>Table</strong></td>
<td><strong> Résultat </strong></td>
</tr>
<tr class='row_odd'>
<td>MyISAM</td>
<td>0.504</td>
</tr>
<tr class='row_even'>
<td>InnoDB</td>
<td>1.382</td>
</tr>
</tbody>
</table>
<hr />
<p><strong>SELECT * FROM MaTable WHERE Nom<>&lsquo;dummy&rsquo;</strong></p>
<table>
<tbody>
<tr class='row_even'>
<td><strong>Table</strong></td>
<td><strong> Résultat </strong></td>
</tr>
<tr class='row_odd'>
<td>MyISAM</td>
<td>1.996</td>
</tr>
<tr class='row_even'>
<td>InnoDB</td>
<td>3.163</td>
</tr>
</tbody>
</table>
<p>La recherche par différence est plus longue que l&rsquo;égalité.</p>
<hr />
<p><strong> SELECT * FROM MaTable WHERE Nom LIKE &lsquo;xyz%&rsquo; </strong></p>
<table>
<tbody>
<tr class='row_even'>
<td><strong>Table</strong></td>
<td><strong> Résultat </strong></td>
</tr>
<tr class='row_odd'>
<td>MyISAM</td>
<td>0.512</td>
</tr>
<tr class='row_even'>
<td>InnoDB</td>
<td>1.282</td>
</tr>
</tbody>
</table>
<p>Aussi étonnant que cela puisse sembler, ici le temps est pratiquement le même pour une égalité pour un LIKE. Notons également que le temps reste le même si les données sont du type CHAR(30) ou VARCHAR(30).</p>
<hr />
<p><strong>SELECT * FROM MaTable WHERE Nom LIKE &lsquo;xyz%&rsquo; ORDER BY Age </strong></p>
<table>
<tbody>
<tr class='row_even'>
<td><strong>Table</strong></td>
<td><strong> Résultat </strong></td>
</tr>
<tr class='row_odd'>
<td>MyISAM</td>
<td>0.484</td>
</tr>
<tr class='row_even'>
<td>InnoDB</td>
<td>1.409</td>
</tr>
</tbody>
</table>
<p>Nous rajoutons un tri à la recherche. Du coup, InnoDB augmente un peu son temps alors que MyISAM le réduit.</p>
<hr />
<p>Attention, maintenant, nous allons faire exactement la même requête, mais en ajoutant un index sur le champs Nom. Et là, vous allez voir que ce n&rsquo;est pas négligeable d&rsquo;y penser : </p>
<p><strong>SELECT * FROM MaTable WHERE Nom LIKE &lsquo;xyz%&rsquo; ORDER BY Age </strong></p>
<table>
<tbody>
<tr class='row_even'>
<td><strong>Table</strong></td>
<td><strong> Résultat </strong></td>
</tr>
<tr class='row_odd'>
<td>MyISAM</td>
<td>0.0005</td>
</tr>
<tr class='row_even'>
<td>InnoDB</td>
<td>0.002</td>
</tr>
</tbody>
</table>
<h2>Conclusion</h2>
<p>Pas simple de conclure avec ces chiffres. Disons que si vous avez des informations importantes à stocker et que vous avez beaucoup d&rsquo;utilisateurs qui vont faire des écritures simultanées dans votre base, il vaut peut-être mieux choisir InnoDB.<br />
<br />Si vous faites beaucoup de lecture de données et peu d&rsquo;écriture, le choix doit se porter sur MyISAM.</p>
<p>Mettre un index sur un champs permet d&rsquo;augmenter considérablement la vitesse lors d&rsquo;une requête, mais augmente aussi la taille de la base. Faites donc attention surtout si vous êtes sur un serveur mutualisé.</p>
<p>Un dernier mot : il existe d&rsquo;autres type de tables pour MySQL. Notamment les tables MEMORY. Mais ce type ne peut-être utilisé pour des tables de cette taille sans avoir une quantité de mémoire très importante. Nous effectuerons très certainement des tests dans un prochain article.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Lecture et écriture dans une base MySQL</title>
		<link>https://www.magazine-jeux.com/lecture-et-ecriture-dans-une-base-mysql/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Mon, 22 May 2006 05:16:00 +0000</pubDate>
				<category><![CDATA[Bases de données]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/lecture-et-ecriture-dans-une-base-mysql/</guid>

					<description><![CDATA[Nous avons vue rapidement dans un précédent article comment ouvrir une base de données et lire un enregistrement. Nous allons voir ici comment écrire un enregistrement. Nous allons prendre l&#8217;exemple d&#8217;un joueur qui s&#8217;inscrit sur un site. Il doit indiquer son pseudo et un mot de passe. Lorsqu&#8217;il reviendra sur le site, le programme enregistrera [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nous avons vue rapidement dans un <a href="article18.html">précédent article</a> comment ouvrir une base de données et lire un enregistrement. Nous allons voir ici comment écrire un enregistrement.<br />
<br />Nous allons prendre l&rsquo;exemple d&rsquo;un joueur qui s&rsquo;inscrit sur un site. Il doit indiquer son pseudo et un mot de passe.<br />
<br />Lorsqu&rsquo;il reviendra sur le site, le programme enregistrera la date courante dans sa fiche.</p>
<h2>Ouverture</h2>
<p>Reprenons le code qui permet d&rsquo;ouvrir une base : </p>
<p><code><br />
@mysql_connect($gBaseHost, $gBaseLogin, $gBasePass) or die("Impossible de se connecter à la base de données");<br />
@mysql_select_db($gBase) or die("Impossible de se connecter à la base de données");<br />
</code></p>
<p>Je vous laisse revoir <a href="article18.html">l&rsquo;article</a> expliquant ces deux lignes pour plus d&rsquo;informations.</p>
<h2>Ecriture</h2>
<p>Le formulaire a été rempli correctement par le joueur, nous avons son pseudo et son mot de passe et la base est ouverte.<br />
<br />Voici la requête SQL à effectuer pour enregistrer ces informations :</p>
<p><code><br />
$SQL = "INSERT INTO TableJoueurs (Pseudo, Password) VALUES (";<br />
$SQL .= "'".$Pseudo."', ";<br />
$SQL .= "'".$Password."');");<br />
</code></p>
<p>Attention lorsque vous faites une requête SQL à bien protéger votre base et vérifiant que les informations saisies soient correctes. Nous verrons dans un prochain articles les différentes possiblités de vérifier ces informations.</p>
<p>La syntaxe de la commande INSERT INTO est la suivante :<br />
<code><br />
INSERT INTO table [(champs1, champs2...)]<br />
VALUES (valeur1, valeur2...)<br />
</code></p>
<p>La liste des champs peut-être ommise si l&rsquo;ordre d&rsquo;insertion concerne tous les champs de la table.</p>
<p>Maintenant que la requête est prête, nous allons l&rsquo;exécuter :</p>
<p><code><br />
$result = mysql_query($SQL);<br />
</code></p>
<p>Un nouvel enregistrement devrait donc se trouvé dans la table « TableJoueurs ». Vous pouvez récupérer l&rsquo;identifiant unique de cet enregistrement avec la commande suivante : </p>
<p><code><br />
$ID = mysql_insert_id();<br />
</code></p>
<p>Et enfin, n&rsquo;oubliez pas de fermer la base : </p>
<p><code><br />
mysql_close();<br />
</code></p>
<h2>Lecture</h2>
<p>Voilà l&rsquo;enregistrement dans la base. Le joueur revient pour jouer. Il indique donc son pseudo (qui lui servira de login dans cet exemple) et son mot de passe. Nous allons vérifier que ces informations sont correctes et modifier la date de dernier passage dans sa fiche.</p>
<p>Commençons par rechercher la fiche en fonction du pseudo et du mot de passe :</p>
<p><code><br />
$SQL = "SELECT * FROM TableJoueurs WHERE ";<br />
$SQL .= "Pseudo='".$Pseudo."' AND Password='".$Password."'";</p>
<p>$result = mysql_query($SQL);<br />
</code></p>
<p>La requête est effectuée, il nous reste juste à contrôler qu&rsquo;il y a au moins un enregistrement :</p>
<p><code><br />
$nb = mysql_num_rows($result);<br />
</code></p>
<p>Cette fonction permet de retourner le nombre d&rsquo;enregistrements trouvé dans la requête SQL correspondante.<br />
<br />Dans notre cas, si ce nombre est supérieur à 0, c&rsquo;est que nous avons la bonne fiche. Nous la modifions donc en conscéquence. Dans le cas contraire, il faudra retourner un message d&rsquo;erreur à l&rsquo;utilisateur car sa fiche n&rsquo;a pas été trouvée.</p>
<p><code><br />
if($nb>0) <em>	// la fiche a été trouvée<br />
	$ID = mysql_result($result, 0,"ID");	// on récupère le numéro de la fiche</p>
<p>	$SQL = "UPDATE TableJoueurs SET ";<br />
	$SQL .= "DatePassage=".date("'Y-m-j'")." ";<br />
	$SQL .= "WHERE ID=".strval($ID);</p>
<p>	$result = mysql_query($SQL);</p>
<p></em>else<em>		// la fiche n'a pas été trouvée<br />
	// prévoir un message d'erreur pour l'utilisateur...<br />
</em><br />
</code></p>
<p>La fiche vient d&rsquo;être modifiée à l&rsquo;aide de la requête SQL « UPDATE ».</p>
<p>La syntaxe de cette commande est la suivante : </p>
<p><code><br />
UPDATE table SET champs1=valeur1, champs2=valeur2...<br />
[WHERE condition(s)]<br />
</code></p>
<p>Evidement, à chaque fois il faut contrôler les données qui sont utilisées pour effectuer les recherches, mises à jour ou insertion dans la base de données. Il ne faut <strong>jamais</strong> inserer directement dans une base de données des informations en provenance d&rsquo;un formulaire !</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Connection à une base MySQL</title>
		<link>https://www.magazine-jeux.com/connection-a-une-base-mysql/</link>
		
		<dc:creator><![CDATA[Jean-François Renauld]]></dc:creator>
		<pubDate>Wed, 26 Oct 2005 17:18:52 +0000</pubDate>
				<category><![CDATA[Bases de données]]></category>
		<guid isPermaLink="false">https://www.magazine-jeux.com/connection-a-une-base-mysql/</guid>

					<description><![CDATA[Se connecter à une base de données MySQL permet de récupérer des informations contenues dans cette base, ou de les modifier, mais aussi de les supprimer, voir de modifier la structure même de la base. Commençons par une connection simple et la lecture d&#8217;une table. @mysql_connect($gBaseHost, $gBaseLogin, $gBasePass) or die("Impossible de se connecter à la [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Se connecter à une base de données MySQL permet de récupérer des informations contenues dans cette base, ou de les modifier, mais aussi de les supprimer, voir de modifier la structure même de la base.</p>
<p>Commençons par une connection simple et la lecture d&rsquo;une table.</p>
<p><code>@mysql_connect($gBaseHost, $gBaseLogin, $gBasePass) or die("Impossible de se connecter à la base de données");</p>
<p>@mysql_select_db($gBase) or die("Impossible de se connecter à la base de données");<br />
</code></p>
<p><img decoding="async" class=" alignright size-full wp-image-28" src="https://www.magazine-jeux.com/wp-content/uploads/2005/10/220px-Mysql.jpg" alt="220px-Mysql.jpg" align="right" width="220" height="166" /> Explication de ces 2 lignes : le caractère « <strong>@</strong> » devant chaque ligne permet d&rsquo;éviter les messages d&rsquo;erreurs qui pourraient contenir des informations permettant le piratage de la base, voir du site. Le seul message qui sera visible sera celui qui est indiqué en paramètre du « <strong>die</strong>« .</p>
<p>La première ligne permet de se connecter au serveur MySQL. Il y a des paramètres qui sont ici :<br />
&#8211; <strong>$gBaseHost</strong> : l&rsquo;adresse du serveur (parfois localhost). Sur un hébergement mutualisé chez <a href="ovh.html">Ovh</a>, ce sera par exemple : « mysql4.5 »<br />
&#8211; <strong>$gBaseLogin</strong> : le login pour vous connecter au serveur MySQL.<br />
&#8211; <strong>$gBasePass</strong> : et le mot de passe (tout ceci vous est fourni par l&rsquo;hébergeur normalement)</p>
<p>Il faut donc les avoir défini avant. Le mieux étant de les placer dans un fichier de configuration qui sera inclus à chaque fois que ce sera nécessaire.</p>
<p>Dans la seconde ligne, nous avons la connexion à la base à proprement parler (un serveur MySQL peu accueuillir plusieurs bases).<br />
<br />Il faut donc indiquer le nom de la base (<strong>$gBase</strong>). C&rsquo;est bien souvent la même chose que le login sur des hébergements mutualisés.</p>
<p>Mais passons aux choses sérieuses : la récupération d&rsquo;une information. Pour cela, on va admettre qu&rsquo;une table existe, qu&rsquo;elle se nomme « contacts » et qu&rsquo;il y a des fiches dedans avec deux champs « Nom » et « Prenom ».</p>
<p><code>$SQL = "SELECT * FROM 'contacts' ORDER BY Nom";</p>
<p>$result = mysql_query($SQL);<br />
</code></p>
<p>Voilà, le langage qui va permettre de discuter avec la base est le SQL. La requête (on demande quelque chose au serveur) est une requête « <strong>SELECT</strong> » qui va donc sélectionner des enregistrements.</p>
<p>Dans le cas présent, on sélectionne tous les enregistrements et on demande qu&rsquo;ils soient rapatriés par ordre alphabêtique croissant (par défaut) du champs « Nom ».</p>
<p><em>Vous suivez ?</em></p>
<p>La seconde ligne permet de récupérer dans une variable le contenu de la base. En fait, c&rsquo;est un « pointeur », il n&rsquo;y a rien dans la variable $result.<br />
<br />Donc, demandons le contenu :</p>
<p><code>$UnNom = mysql_result($result, 0, "Nom");</p>
<p>$UnPrenom = mysql_result($result, 0, "Prenom");<br />
</code></p>
<p>Nous voilà avec la variable <strong>$UnNom</strong> contenant le champs Nom de la première ligne. Le <strong>0</strong> en second paramètre indique le numéro de la ligne en cours. La liste commence à 0 et se termine à&#8230; Voyons le code suivant pour savoir combien il y a de lignes : </p>
<p><code>$nbr = mysql_num_rows($result);<br />
</code></p>
<p>Et s&rsquo;arrête donc à <strong>$nbr-1</strong>. Oui, il y a $nbr lignes qui sont numérotées de 0 à $nbr &#8211; 1</p>
<p><code>echo "</p>
<p>Le nom : ".$UnNom."<br />";</p>
<p>echo "Le pr&eacute;nom : ".$UnPrenom."</p>
<p>";<br />
</code></p>
<p>Et voilà l&rsquo;affichage du nom et du prénom de la première ligne (ou fiche, question de vocabulaire).</p>
<p>Ne pas oublier de fermer la connection à la base sous peine de saturer le serveur !</p>
<p><code>mysql_close();<br />
</code></p>
<p>Il est préférable de fermer la connection avant même d&rsquo;afficher quoique ce soit. Dans ce cas, il serait préférable de fermer la connection avant les « echo ».</p>
<p>Voilà pour cette introduction. Si vous avez bien suivi, le reste n&rsquo;est pas plus complexe.</p>
<p><strong>Quelques liens :</strong></p>
<p>Site officiel en français de MySQL : <a href="http://www-fr.mysql.com/">www-fr.mysql.com</a></p>
<p>Documentation en français (V5.0) : <a href="http://dev.mysql.com/doc/refman/5.0/fr/index.html">dev.mysql.com/doc/refman/5.0/fr/index.html</a></p>
<p>Php France : <a href="http://www.phpfrance.com/">www.phpfrance.com</a></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
