<?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>Un bout de DBA &#187; Query Cache</title>
	<atom:link href="http://www.noidea.ca/tag/query-cache/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.noidea.ca</link>
	<description>MySQL, En long et en large</description>
	<lastBuildDate>Tue, 09 Feb 2010 13:54:47 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MySQL Query Cache</title>
		<link>http://www.noidea.ca/2009/10/10/mysql-query-cache/</link>
		<comments>http://www.noidea.ca/2009/10/10/mysql-query-cache/#comments</comments>
		<pubDate>Sat, 10 Oct 2009 13:32:47 +0000</pubDate>
		<dc:creator>PaT</dc:creator>
				<category><![CDATA[Consultation]]></category>
		<category><![CDATA[Optimisation]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Query Cache]]></category>

		<guid isPermaLink="false">http://www.noidea.ca/?p=323</guid>
		<description><![CDATA[La query cache de MySQL joue un rôle important dans la performance de plusieurs sites Web.  Elle a pour avantage d&#8217;être  transparente, c&#8217;est-à-dire que la ou les applications qui s&#8217;en servent n&#8217;ont pas besoin d&#8217;être modifiées.
J&#8217;ai recu la semaine passée la question suivante (je résume):
Je souhaite utiliser une cache pour le menu de mon site [...]]]></description>
			<content:encoded><![CDATA[<p>La query cache de MySQL joue un rôle important dans la performance de plusieurs sites Web.  Elle a pour avantage d&#8217;être  transparente, c&#8217;est-à-dire que la ou les applications qui s&#8217;en servent n&#8217;ont pas besoin d&#8217;être modifiées.</p>
<p>J&#8217;ai recu la semaine passée la question suivante (je résume):</p>
<blockquote><p>Je souhaite utiliser une cache pour le menu de mon site afin de le rendre plus performant. Puisque le contenu du menu ne change pratiquement jamais, est-il plus avantageux d&#8217;utiliser APC Cache que la Query Cache de MySQL puisque la communication s&#8217;effectue selon un schéma comme:</p>
<p>php -&gt; cache_apc (ram)<br />
php -&gt; mysql -&gt; query_cache (ram)</p>
<p>Je souhaite réduire au minimum les requêtes SQL exécutées.</p></blockquote>
<p>Personnellement, j&#8217;utiliserais la cache de MySQL. Tout d&#8217;abord, il faut savoir qu&#8217;il y a une énorme différence entre les 2 caches.</p>
<p>MySQL Query Cache est centralisée sur le serveur MySQL, c&#8217;est-à-dire qu&#8217;elle utilise la RAM de la machine du serveur MySQL. Elle possède un mécanisme d&#8217;invalidation basique, mais efficace. L&#8217;invalidation se produit lorsque des valeurs d&#8217;une table sont en cache, et que ces valeurs sont mise à jour par une application ou manuellement par un utilisateur.</p>
<p>APC Cache est centralisée sur le serveur Web, c&#8217;est-à-dire qu&#8217;elle utilise la RAM disponible sur le serveur qui roule Apache et PHP (en supposant que vous utilisez Apache). Vous serez responsable d&#8217;invalider la cache lorsque nécessaire. Si quelqu&#8217;un modifie la valeur directement dans MySQL, la cache possèdera la vieille valeur jusqu&#8217;à ce qu&#8217;un processus l&#8217;invalide.</p>
<p>Puisque les données ne changent pratiquement jamais, je ne me casserais pas la tête à réinventer la roue. MySQL fait déjà pour vous ce que APC ferait, sans le moindre effort. De plus, il est plus ou moins vrai de dire que d&#8217;appeler la cache correspond à une requête. Oui, la string SQL est nécessairement envoyé à MySQL, mais lorsque celui-ci la reçoit et valide que cette requête est cachée, il retourne immédiatement le résultat sans rien &#8220;processer&#8221;. C&#8217;est comme ça que fonctionne APC aussi, il lui faut un identifiant unique pour associer le résultat, tout comme fait MySQL avec le HASH de la requête.</p>
<p>Les caches (peu importe laquelle) sont tout aussi efficaces avec une petite requête qui consomme peu de ressource qu&#8217;avec une grosse qui en demande beaucoup. Il est donc plus avantageux de cacher les processus lourds que les légers.</p>
<p>Ce qu&#8217;il faut surtout se soucier lorsqu&#8217;on utilise une cache, c&#8217;est comment et à quelle fréquence il faut l&#8217;invalider. Lorsque la Query Cache de MySQL est activée, le processus de cacher les résultats et de les invalider s&#8217;effectue tout seul de manière invisible. Ainsi, d&#8217;autres requêtes que vous ne soupçonnez même pas bénéficient de la cache. À l&#8217;inverse, il faut modifier le code pour chaque requête que vous souhaitez cacher avec APC.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.noidea.ca/2009/10/10/mysql-query-cache/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Mesurer l&#8217;efficacité de la Query Cache</title>
		<link>http://www.noidea.ca/2008/06/04/mesurer-lefficacite-de-la-query-cache/</link>
		<comments>http://www.noidea.ca/2008/06/04/mesurer-lefficacite-de-la-query-cache/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 01:07:01 +0000</pubDate>
		<dc:creator>PaT</dc:creator>
				<category><![CDATA[Optimisation]]></category>
		<category><![CDATA[Query Cache]]></category>

		<guid isPermaLink="false">http://www.noidea.ca/?p=21</guid>
		<description><![CDATA[Il y a plusieurs moyens d&#8217;évaluer l&#8217;efficacité de la Query Cache. On peut se satisfaire de connaitre le nombre de hit à la cache versus le nombre de SELECT. La commande SHOW STATUS nous donne tout ce qu&#8217;on a besoin de savoir: Qcache_hits/(Com_select+Qcache_hits) ( notez que nous devons additionner Com_Select et Qcache_Hits car Com_Select n&#8217;est [...]]]></description>
			<content:encoded><![CDATA[<p>Il y a plusieurs moyens d&#8217;évaluer l&#8217;efficacité de la Query Cache. On peut se satisfaire de connaitre le nombre de hit à la cache versus le nombre de SELECT. La commande SHOW STATUS nous donne tout ce qu&#8217;on a besoin de savoir: <em>Qcache_hits/(Com_select+Qcache_hits)</em> ( notez que nous devons additionner Com_Select et Qcache_Hits car Com_Select n&#8217;est pas incrémenté lorsque le résultat est retourné par la cache).</p>
<p>Il y a certaines questions à se demander si vous obtenez un bas pourcentage. Quel genre de requêtes sont stockées en cache ? Est-ce que la cache crée une charge supplémentaire qui en vaut la peine ? On ne peut malheureusement pas savoir quelles requêtes sont dans la cache, mais on peut connaitre une partie de la surchage créé en calculant le taux d&#8217;invalidation des requêtes: <em>(Com_insert+Com_delete+Com_update+Com_replace)/Qcache_hits</em></p>
<p>La variable <em>Qcache_lowmem_prunes</em> indique le nombre de requêtes qui ont été supprimées de la cache pour pouvoir en placer d&#8217;autres. Si le nombre est élevé, c&#8217;est un indice que la grosseur de la cache n&#8217;est pas suffisamment grande. Mais attention, si <em>Qcache_free_memory</em> indique qu&#8217;il y a de l&#8217;espace libre dans la cache, il n&#8217;est pas absolument nécessaire d&#8217;augmenter la taille de la cache.</p>
<p>Si le nombre d&#8217;insertions dans la cache est grand et que le nombre de hits est petit, c&#8217;est un autre indice que la cache n&#8217;est pas utilisée à son plein potentiel. Si le nombre de hits est réellement très bas, il serait peut-être mieux de ne pas utiliser la Query Cache du tout.</p>
<p>Il faut savoir faire un lien avec toutes les variables fournies par le serveur. Voici un exemple d&#8217;une serveur avec une relativement bonne utilisation de la Query Cache:</p>
<table style="width:400px;" border="0">
<tbody>
<tr>
<td width="50%">Qcache_free_blocks</td>
<td width="50%">29600</td>
</tr>
<tr>
<td>Qcache_free_memory</td>
<td>184098712</td>
</tr>
<tr>
<td>Qcache_hits</td>
<td>695816213</td>
</tr>
<tr>
<td>Qcache_inserts</td>
<td>254401651</td>
</tr>
<tr>
<td>Qcache_lowmem_prunes</td>
<td>1610387</td>
</tr>
<tr>
<td>Qcache_not_cached</td>
<td>31206222</td>
</tr>
<tr>
<td>Qcache_queries_in_cache</td>
<td>58357</td>
</tr>
<tr>
<td>Qcache_total_blocks</td>
<td>146413</td>
</tr>
</tbody>
</table>
<table border="0" width="400">
<tbody>
<tr>
<td width="50%">Com_select</td>
<td width="50%">285585646</td>
</tr>
<tr>
<td>Com_insert</td>
<td>8810565</td>
</tr>
<tr>
<td>Com_delete</td>
<td>2633180</td>
</tr>
<tr>
<td>Com_update</td>
<td>593228</td>
</tr>
</tbody>
</table>
<p>Qcache_hits/(Com_select+Qcache_hits) = 0.709<br />
Plus la valeur est près de 1, mieux c&#8217;est.</p>
<p>(Com_insert+Com_delete+Com_update+Com_replace)/Qcache_hits = 0.4354<br />
Plus la valeur est près de 0, mieux c&#8217;est.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.noidea.ca/2008/06/04/mesurer-lefficacite-de-la-query-cache/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
