<?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>dasini.net - Journal d'un expert MySQL &#187; mysqlslap</title>
	<atom:link href="http://dasini.net/blog/tag/mysqlslap/feed/" rel="self" type="application/rss+xml" />
	<link>http://dasini.net/blog</link>
	<description>Repousser les frontières de la connaissance</description>
	<lastBuildDate>Thu, 02 Feb 2012 09:06:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Présentation: Vue d&#8217;ensemble de MySQL 5.1</title>
		<link>http://dasini.net/blog/2009/03/02/presentation-vue-densemble-de-mysql-51/</link>
		<comments>http://dasini.net/blog/2009/03/02/presentation-vue-densemble-de-mysql-51/#comments</comments>
		<pubDate>Mon, 02 Mar 2009 13:41:00 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[Présentation]]></category>
		<category><![CDATA[csv]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[MySQL 5.1]]></category>
		<category><![CDATA[MySQL Cluster]]></category>
		<category><![CDATA[mysqlslap]]></category>
		<category><![CDATA[partitionnement]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xpath]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=474</guid>
		<description><![CDATA[Numéro un pour les applications en ligne, MySQL se positionne maintenant sur le secteur des applications d’entrepôts de données et d’informatique décisionnelle…

http://dasini.net/blog/presentations/?#presentation_mysql51]]></description>
			<content:encoded><![CDATA[<p>Numéro un pour les applications en ligne, MySQL se positionne maintenant sur le secteur des applications d’entrepôts de données et d’informatique décisionnelle…</p>
<p><a title="Présentaion de MySQL 5.1" href="http://dasini.net/blog/presentations/?#presentation_mysql51" target="_self">http://dasini.net/blog/presentations/?#presentation_mysql51</a></p>
<p><a title="Présentaion de MySQL 5.1" href="http://dasini.net/blog/wp-includes/pdf/olivier_dasini_overview_mysql_5.1.pdf" target="_blank">PDF à télécharger</a></p>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/03/02/presentation-vue-densemble-de-mysql-51/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Influencer l&#8217;optimiseur de MySQL</title>
		<link>http://dasini.net/blog/2009/01/29/influencer-loptimiseur-de-mysql/</link>
		<comments>http://dasini.net/blog/2009/01/29/influencer-loptimiseur-de-mysql/#comments</comments>
		<pubDate>Thu, 29 Jan 2009 21:14:08 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[Last_query_cost]]></category>
		<category><![CDATA[mysqlslap]]></category>
		<category><![CDATA[optimiser]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=430</guid>
		<description><![CDATA[Il est possible d'influencer l'optimiseur pour qu'il choisisse d'utiliser ou de ne pas utiliser un index particulier. Les clauses à placer dans votre requête SELECT sont les suivantes:

USE INDEX : utilise l'index passé en argument (MySQL ne l'utilisera pas si l'index est plus couteux qu'un full table scan)

FORCE INDEX : utilise l'index passé en argument (MySQL ne l'utilisera pas ...s'il ne peut pas l'utiliser :) )

IGNORE INDEX : n'utilise pas l'index passé en argument]]></description>
			<content:encoded><![CDATA[<p>Il est possible d&#8217;influencer l&#8217;optimiseur pour qu&#8217;il choisisse d&#8217;utiliser ou de ne pas utiliser un index particulier. Les clauses à placer dans votre requête <strong>SELECT </strong>sont les suivantes:</p>
<p><strong>USE INDEX</strong> : utilise l&#8217;index passé en argument (MySQL ne l&#8217;utilisera pas si l&#8217;index est plus couteux qu&#8217;un <em>full table scan</em>)</p>
<p><strong>FORCE INDEX</strong> : utilise l&#8217;index passé en argument (MySQL ne l&#8217;utilisera pas &#8230;s&#8217;il ne peut pas l&#8217;utiliser <img src='http://dasini.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  <em></em>)</p>
<p><strong>IGNORE INDEX</strong> : n&#8217;utilise pas l&#8217;index passé en argument</p>
<p>La plus part du temps, il se débrouille trés bien sans indications, mais parfois&#8230;</p>
<p>Dans cet exemple, j&#8217;utilise une table <em>rental_daz</em> inspirée de la table <em>rental </em>de la base de donnée <em><a title="sakila database" href="http://dev.mysql.com/doc/" target="_blank">sakila</a></em>, voici sa structure:</p>
<pre>12:14 daz$sakila&gt; SHOW CREATE TABLE rental_daz\G
*************************** 1. row ***************************
       Table: rental_daz
Create Table: CREATE TABLE `rental_daz` (
  `rental_id` int(11) NOT NULL AUTO_INCREMENT,
<strong>  `rental_date` datetime NOT NULL,</strong>
  `inventory_id` mediumint(8) unsigned NOT NULL,
  `customer_id` smallint(5) unsigned NOT NULL,
  `return_date` datetime DEFAULT NULL,
  `staff_id` tinyint(3) unsigned NOT NULL,
  `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
       ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`rental_id`),
<strong>  UNIQUE KEY `rental_date` (`rental_date`,`inventory_id`,`customer_id`),</strong>
  KEY `idx_fk_inventory_id` (`inventory_id`),
  KEY `idx_fk_customer_id` (`customer_id`),
  KEY `idx_fk_staff_id` (`staff_id`)
) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf8</pre>
<p>Voici ma requête:</p>
<p><span style="color: #ff0000;"><strong>SELECT * FROM rental_daz WHERE  rental_date &gt; SUBDATE(now(), INTERVAL  3 YEAR);</strong></span></p>
<p>La commande <strong>EXPLAIN </strong>me permet de connaitre son plan d&#8217;exécution:</p>
<pre>12:14 daz$sakila&gt; EXPLAIN SELECT * FROM rental_daz
WHERE  rental_date &gt; SUBDATE(now(), INTERVAL  3 YEAR)\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: rental_daz
         type: range
possible_keys: rental_date
<span style="color: #ff0000;">          <strong>key: rental_date</strong></span>
      key_len: 8
          ref: NULL
         rows: 2744
        Extra: Using where</pre>
<p>L&#8217;optimiseur voit l&#8217;index composite <em>rental_date</em> et l&#8217;utilise. Ça à l&#8217;air pas mal&#8230;</p>
<p>Voyons le coût de cette requête,grâce à au paramètre <strong>LAST_QUERY_COST</strong> :</p>
<pre>12:19 daz$sakila&gt; SHOW STATUS LIKE 'Last_query_cost';
+-----------------+-------------+
| Variable_name   | Value       |
+-----------------+-------------+
| Last_query_cost | <strong>3842.609000</strong> |
+-----------------+-------------+</pre>
<p><span style="text-decoration: underline;">Empêchons </span>l&#8217;optimiseur d&#8217;utiliser l&#8217;index <em>rental_date</em>:</p>
<pre>12:20 daz$sakila&gt; EXPLAIN SELECT * FROM rental_daz <strong>IGNORE INDEX(rental_date)</strong>
WHERE  rental_date &gt; SUBDATE(now(), INTERVAL 3 YEAR)\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: rental_daz
         type: ALL
possible_keys: NULL
          <span style="color: #ff0000;"><strong>key: NULL</strong></span>
      key_len: NULL
          ref: NULL
         rows: 16298
        Extra: Using where</pre>
<p>L&#8217;optimiseur n&#8217;utilise donc pas l&#8217;index (il ne le voit même pas). Un <em>full table scan</em> est donc effectué. C&#8217;est à priori plus coûteux que d&#8217;utiliser l&#8217;index. Regardons le coût de cette requêtes.</p>
<pre>16:18 daz$sakila&gt; SHOW STATUS LIKE 'Last_query_cost';
+-----------------+-------------+
| Variable_name   | Value       |
+-----------------+-------------+
| Last_query_cost | <strong>3356.599000</strong> |
+-----------------+-------------+</pre>
<p>Malgré le <em>full table scan</em>, cette requête est moins coûteuse que celle qui utilise l&#8217;index !!!</p>
<p>Essayons de vérifier cela en durée. Le client <strong>mysqlslap </strong>est tout indiqué :</p>
<p>mysqlslap -uroot -proot  &#8211;create-schema=sakila -i50<br />
-q&nbsp;&raquo;<strong>SELECT * FROM rental_daz WHERE  rental_date &gt; SUBDATE(now(), INTERVAL  3 YEAR);</strong>&nbsp;&raquo;</p>
<pre>Benchmark</pre>
<pre>        Average number of seconds to run all queries: <span style="color: #ff0000;"><strong>0.287</strong></span> seconds</pre>
<pre>        Minimum number of seconds to run all queries: 0.140 seconds</pre>
<pre>        Maximum number of seconds to run all queries: 1.172 seconds</pre>
<pre>        Number of clients running queries: 1</pre>
<pre>        Average number of queries per client: 1</pre>
<p>mysqlslap -uroot -proot  &#8211;create-schema=sakila -i50<br />
-q&nbsp;&raquo;<strong>SELECT * FROM rental_daz ignore index(rental_date) WHERE  rental_date &gt; SUBDATE(now(), INTERVAL  3 YEAR);</strong>&nbsp;&raquo;</p>
<pre>Benchmark</pre>
<pre>        Average number of seconds to run all queries: <span style="color: #ff0000;"><strong>0.167</strong></span> seconds</pre>
<pre>        Minimum number of seconds to run all queries: 0.078 seconds</pre>
<pre>        Maximum number of seconds to run all queries: 1.094 seconds</pre>
<pre>        Number of clients running queries: 1</pre>
<pre>        Average number of queries per client: 1</pre>
<p>mysqlslap confirme bien que le full table scan est, dans ce cas précis, plus performant que la recherche indexée par intervalle. On se trouve bien dans un cas où l&#8217;optimiseur se trompe.</p>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/01/29/influencer-loptimiseur-de-mysql/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Les nouveautés de MySQL 5.1 &#8212; (part 5/5)</title>
		<link>http://dasini.net/blog/2009/01/04/les-nouveautes-de-mysql-51-part-55/</link>
		<comments>http://dasini.net/blog/2009/01/04/les-nouveautes-de-mysql-51-part-55/#comments</comments>
		<pubDate>Sat, 03 Jan 2009 23:04:44 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[bench]]></category>
		<category><![CDATA[MySQL 5.1]]></category>
		<category><![CDATA[mysqlslap]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=362</guid>
		<description><![CDATA[mysqlslap : un utilitaire de test de charge et de performance

Disponible depuis MySQL 5.1.4, mysqlslap permet d'effectuer des tests de stress et de charge sur votre serveur MySQL. Vous pourrez alors tester les performances de votre SGBDR préféré, après, par exemple, une nouvelle installation, un changement d'architecture ou après avoir modifié des paramètres de configuration.]]></description>
			<content:encoded><![CDATA[<p><!-- 	 	 --><br />
<em>(<a title="Les nouveautés de MySQL 5.1 -- (part 4/5)" href="http://dasini.net/blog/2008/12/13/les-nouveautes-de-mysql-51-part-45/">&lt;- précédent</a>)</em><br />
<!-- 	 	 --></p>
<h2>mysqlslap : un utilitaire de test de charge et de performance</h2>
<p>Disponible depuis MySQL 5.1.4, <em>mysqlslap</em> permet d&#8217;effectuer des tests de stress et de charge sur votre serveur MySQL. Vous pourrez alors tester les performances de votre SGBDR préféré, après, par exemple, une nouvelle installation, un changement d&#8217;architecture ou après avoir modifié des paramètres de configuration.</p>
<p>Créé pour devenir le meilleur ami des administrateurs de bases de données et des développeurs, le client <em>mysqlslap</em> envoie des requêtes au serveur MySQL en créant plusieurs connexions simultanées. A la fin de la simulation, un rapport de diagnostic est crée sur la sortie standard. Vous avez aussi la possibilité de l&#8217;écrire dans un fichier au format CSV utilisable directement avec Calc d&#8217;OpenOffice ou Excel de Microsoft.</p>
<p>Exemple d&#8217;utilisation de <em>mysqlslap</em> avec les options suivantes :</p>
<ul>
<li><strong>user</strong>, <strong>password</strong>, <strong>socket </strong>: autentification classique d&#8217;un client MySQL,</li>
<li><strong>concurrency </strong>: nombre de 	clients effectuant simultanément une requête SELECT,</li>
<li><strong>iterations </strong>: nombre 	d&#8217;itérations du test à faire,</li>
<li><strong>number-of-queries</strong> : 	nombre total de requêtes effectuées lors du test,</li>
<li><strong>engine </strong>: moteur(s) à 	utiliser,</li>
<li><strong>auto-generate-sql</strong> : 	<em>mysqlslap</em> génère automatiquement un jeu de tests,</li>
<li><strong>number-int-cols</strong> : nombre 	de colonnes de type INT à créer,</li>
<li><strong>number-char-cols</strong> : 	nombre de colonnes de type CHAR à créer,</li>
<li><strong>auto-generate-sql-load-type</strong> : permet de spécifier le type de requêtes (lecture, insertion, 	lecture sur la clé primaire, mise à jour ou mixte)</li>
</ul>
<p><!-- 	 	 --></p>
<p>Tests de performances avec des tables MyISAM et innoDB:</p>
<pre>shell&gt; mysqlslap --user=daz --password --socket=/tmp/mysql51.sock
--concurrency=1,100   --iterations=10  --number-of-queries=1000
--engine=myisam,innodb   --auto-generate-sql  --number-int-cols=2
--number-char-cols=3   --auto-generate-sql-load-type=mixed

<!-- 	 	 -->
Benchmark
   Running for engine myisam
   Average number of seconds to run all queries: 1.576 seconds
   Minimum number of seconds to run all queries: 1.539 seconds
   Maximum number of seconds to run all queries: 1.631 seconds
   Number of clients running queries: 1
   Average number of queries per client: 1000
Benchmark
   Running for engine myisam
   Average number of seconds to run all queries: 1.792 seconds
   Minimum number of seconds to run all queries: 1.543 seconds
   Maximum number of seconds to run all queries: 2.107 seconds
   Number of clients running queries: 100
   Average number of queries per client: 10
Benchmark
   Running for engine innodb
   Average number of seconds to run all queries: 2.477 seconds
   Minimum number of seconds to run all queries: 2.430 seconds
   Maximum number of seconds to run all queries: 2.663 seconds
   Number of clients running queries: 1
   Average number of queries per client: 1000
Benchmark
   Running for engine innodb
   Average number of seconds to run all queries: 2.704 seconds
   Minimum number of seconds to run all queries: 0.725 seconds
   Maximum number of seconds to run all queries: 5.272 seconds
   Number of clients running queries: 100
   Average number of queries per client: 10</pre>
<p><em></em><br />
<!-- 	 	 --></p>
<p><!-- 	 	 --></p>
<h2>Conclusion</h2>
<p>Toujours aussi performant, fiable et robuste, certes un peu moins simple à administrer mais tellement plus riche, cette nouvelle version de MySQL devrait faire le bonheur des administrateurs de bases de données et des développeurs. Nous espérons que cet article vous a mis l&#8217;eau à la bouche et vous donnons d&#8217;ors et déjà rendez-vous au prochain numéro pour explorer plus en détail le partitionnement de MySQL.</p>
<p><!-- 	 	 --></p>
<p><em><a title="Les nouveautés de MySQL 5.1 -- (part 1/5)" href="http://dasini.net/blog/2008/11/28/les-nouveautes-de-mysql-51-part-15/">Les nouveautés de MySQL 5.1 &#8212; (part 1/5)</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/01/04/les-nouveautes-de-mysql-51-part-55/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

