
{"id":1196,"date":"2012-02-28T14:35:17","date_gmt":"2012-02-28T13:35:17","guid":{"rendered":"http:\/\/dasini.net\/blog\/?p=1196"},"modified":"2017-03-07T17:38:39","modified_gmt":"2017-03-07T16:38:39","slug":"attention-au-query-cache","status":"publish","type":"post","link":"https:\/\/dasini.net\/blog\/2012\/02\/28\/attention-au-query-cache\/","title":{"rendered":"Attention au query cache"},"content":{"rendered":"<p>Selon le livre \u00ab<a title=\"Audit et optimisation de MySQL 5 \" href=\"http:\/\/dasini.net\/blog\/bibliotheque\/#audit_optimisation_mysql5\" target=\"_blank\">Audit &amp; optimisation, MySQL 5\u00a0&#8211; \u00e9ditions Eyrolles<\/a>\u00bb, le <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.5\/en\/query-cache.html\">cache de requ\u00eates ou <\/a><a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.5\/en\/query-cache.html\"><em>query cache<\/em><\/a> est un syst\u00e8me de cache m\u00e9moire interne \u00e0 MySQL, transparent pour l&rsquo;application, qui ne stocke que les requ\u00eates SELECT et leurs r\u00e9sultats.<\/p>\n<p>L&rsquo;apport de ce cache est particuli\u00e8rement d\u00e9pendant de votre application. Il est coutume de dire qu&rsquo;il est (tr\u00e8s) p\u00e9nalisant dans des environnements o\u00f9 les requ\u00eates d&rsquo;\u00e9critures sont nombreuses, notamment \u00e0 cause de son m\u00e9canisme d&rsquo;invalidation (et de probl\u00e8mes de contentions de fa\u00e7on g\u00e9n\u00e9rale).<\/p>\n<p>A l&rsquo;oppos\u00e9, il peut \u00eatre int\u00e9ressant de l&rsquo;activer, dans des environnements \u00e0 forte charges de lectures, si les m\u00eames requ\u00eates reviennent tr\u00e8s fr\u00e9quemment, plus particuli\u00e8rement lors de l&rsquo;utilisation de tables MyISAM.<\/p>\n<p>&nbsp;<\/p>\n<p>Cependant, un environnement \u00e0 forte charge en lecture n&rsquo;est pas une condition suffisante pour s&rsquo;assurer de bonne performances avec le query cache, c&rsquo;est ce que nous allons voir dans cet article.<\/p>\n<p>&nbsp;<\/p>\n<h2>Le contexte<\/h2>\n<p>L&rsquo;id\u00e9e principale de cet article, n&rsquo;est pas de voir ce que MySQL \u00ab\u00a0\u00e0 dans le ventre\u00a0\u00bb, mais de conna\u00eetre le co\u00fbt du cache de requ\u00eates, avec un hit ratio faible, dans une configuration \u00abrelativement proche\u00bb de ce que nous avons en production chez <a href=\"http:\/\/www.viadeo.com\/\" target=\"_blank\">Viadeo<\/a>.<\/p>\n<p>J&rsquo;ai utilis\u00e9 <a href=\"http:\/\/sysbench.sourceforge.net\/\" target=\"_blank\">sysbench<\/a> pour g\u00e9n\u00e9rer 100 connexions simultan\u00e9es, qui ex\u00e9cutent des SELECT sur une table InnoDB de 10 millions d&rsquo;enregistrements\u00a0:<\/p>\n<p><em>sysbench &#8211;num-threads=100 &#8211;max-time=900 &#8211;max-requests=20000000 &#8211;test=oltp &#8211;oltp-table-size=20000000 &#8211;mysql-table-engine=innodb &#8211;oltp-test-mode=complex &#8211;oltp-read-only run<\/em><\/p>\n<p>&nbsp;<\/p>\n<p>Les d\u00e9tails du bench sont dans le paragraphe <em>divers<\/em>, au bas de l&rsquo;article.<\/p>\n<p>&nbsp;<\/p>\n<h2>R\u00e9sum\u00e9<\/h2>\n<p>Avec un query cache hit <strong>tr\u00e8s bas<\/strong>, m\u00eame dans un contexte 100% SELECT, l&rsquo;impact du cache de requ\u00eates est d\u00e9sastreux sur les performances, que ce soit en TPS (graph 1) ou en 95\u00e8me <a href=\"http:\/\/fr.wikipedia.org\/wiki\/Centile\" target=\"_blank\">centile<\/a> (graph 2).<\/p>\n<p>&nbsp;<\/p>\n<div><a href=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-includes\/images\/query_cache_on_VS_query_cache_off_im_large.png\" target=\"_blank\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" class=\"\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-includes\/images\/query_cache_on_VS_query_cache_off_im_tiny.png?resize=429%2C607\" alt=\"dasini.net - MySQL query cache\" width=\"429\" height=\"607\" \/><\/a><\/div>\n<p>&nbsp;<\/p>\n<h2>Les chiffres<\/h2>\n<h3>&#8212; Query cache \u00e0 128 Mo<\/h3>\n<pre class=\"\">SHOW GLOBAL VARIABLES LIKE 'query_cache%';\r\n+------------------------------+-----------+\r\n| Variable_name | Value |\r\n+------------------------------+-----------+\r\n| query_cache_limit | 2097152 |\r\n| query_cache_min_res_unit | 4096 |\r\n| query_cache_size | 134217728 |\r\n| query_cache_strip_comments | OFF |\r\n| query_cache_type | ON |\r\n| query_cache_wlock_invalidate | OFF |\r\n+------------------------------+-----------+\r\n\r\nOLTP test statistics:\r\nqueries performed:\r\nread: 2728040\r\nwrite: 0\r\nother: 389720\r\ntotal: 3117760\r\ntransactions: 194860 (216.45 per sec.)\r\ndeadlocks: 0 (0.00 per sec.)\r\nread\/write requests: 2728040 (3030.30 per sec.)\r\nother operations: 389720 (432.90 per sec.)\r\n\r\nTest execution summary:\r\ntotal time: 900.2544s\r\ntotal number of events: 194860\r\ntotal time taken by event execution: 90014.3415\r\nper-request statistics:\r\nmin: 40.23ms\r\navg: 461.94ms\r\nmax: 1276.36ms\r\napprox. 95 percentile: 666.36ms\r\n\r\nThreads fairness:\r\nevents (avg\/stddev): 1948.6000\/10.21\r\nexecution time (avg\/stddev): 900.1434\/0.08<\/pre>\n<p><span style=\"color: #ff0000;\"><span style=\"text-decoration: underline;\"><strong>Chiffres cl\u00e9s<\/strong><\/span><strong>\u00a0:<\/strong><\/span><\/p>\n<ul>\n<li><span style=\"color: #ff0000;\">QC size\u00a0: <strong>128 Mo<\/strong><\/span><\/li>\n<li><span style=\"color: #ff0000;\">TPS : <strong>216,45<\/strong><\/span><\/li>\n<li><span style=\"color: #ff0000;\">95%tile : <strong>666,36 ms<\/strong><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3>&#8212; Query cache \u00e0 256 Mo<\/h3>\n<pre class=\"\">SET GLOBAL query_cache_type=1; \r\nSET GLOBAL query_cache_size=268435456; \r\nSHOW GLOBAL VARIABLES LIKE 'query_cache%';\r\n+------------------------------+-----------+\r\n| Variable_name | Value |\r\n+------------------------------+-----------+\r\n| query_cache_limit | 2097152 |\r\n| query_cache_min_res_unit | 4096 |\r\n| query_cache_size | 268435456 |\r\n| query_cache_type | ON |\r\n| query_cache_wlock_invalidate | OFF |\r\n+------------------------------+-----------+\r\n\r\nOLTP test statistics:\r\nqueries performed:\r\nread: 5601204\r\nwrite: 0\r\nother: 800172\r\ntotal: 6401376\r\ntransactions: 400086 (444.47 per sec.)\r\ndeadlocks: 0 (0.00 per sec.)\r\nread\/write requests: 5601204 (6222.60 per sec.)\r\nother operations: 800172 (888.94 per sec.)\r\n\r\nTest execution summary:\r\ntotal time: 900.1385s\r\ntotal number of events: 400086\r\ntotal time taken by event execution: 90006.3589\r\nper-request statistics:\r\nmin: 33.56ms\r\navg: 224.97ms\r\nmax: 601.63ms\r\napprox. 95 percentile: 320.52ms\r\n\r\nThreads fairness:\r\nevents (avg\/stddev): 4000.8600\/11.78\r\nexecution time (avg\/stddev): 900.0636\/0.04<\/pre>\n<p><span style=\"color: #ff0000;\"><span style=\"text-decoration: underline;\"><strong>Chiffres cl\u00e9s<\/strong><\/span><strong>\u00a0:<\/strong><\/span><\/p>\n<ul>\n<li><span style=\"color: #ff0000;\">QC size\u00a0: <strong>256 Mo<\/strong><\/span><\/li>\n<li><span style=\"color: #ff0000;\">TPS : <strong>444,47<\/strong><\/span><\/li>\n<li><span style=\"color: #ff0000;\">95%tile : <strong>320,52 ms<\/strong><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3>&#8212; Query cache \u00e0 64 Mo<\/h3>\n<pre class=\"\">SET GLOBAL query_cache_type=1; \r\nSET GLOBAL query_cache_size=67108864; \r\nSHOW GLOBAL VARIABLES LIKE 'query_cache%';\r\n+------------------------------+----------+\r\n| Variable_name | Value |\r\n+------------------------------+----------+\r\n| query_cache_limit | 2097152 |\r\n| query_cache_min_res_unit | 4096 |\r\n| query_cache_size | 67108864 |\r\n| query_cache_type | ON |\r\n| query_cache_wlock_invalidate | OFF |\r\n+------------------------------+----------+<\/pre>\n<pre class=\"\">OLTP test statistics:\r\nqueries performed:\r\nread: 7319270\r\nwrite: 0\r\nother: 1045610\r\ntotal: 8364880\r\ntransactions: 522805 (580.84 per sec.)\r\ndeadlocks: 0 (0.00 per sec.)\r\nread\/write requests: 7319270 (8131.73 per sec.)\r\nother operations: 1045610 (1161.68 per sec.)<\/pre>\n<pre class=\"\">Test execution summary:\r\ntotal time: 900.0881s\r\ntotal number of events: 522805\r\ntotal time taken by event execution: 90002.3195\r\nper-request statistics:\r\nmin: 35.97ms\r\navg: 172.15ms\r\nmax: 380.79ms\r\napprox. 95 percentile: 214.74ms<\/pre>\n<pre class=\"\">Threads fairness:\r\nevents (avg\/stddev): 5228.0500\/16.33\r\nexecution time (avg\/stddev): 900.0232\/0.02<\/pre>\n<p><span style=\"color: #ff0000;\"><span style=\"text-decoration: underline;\"><strong>Chiffres cl\u00e9s<\/strong><\/span><strong>\u00a0:<\/strong><\/span><\/p>\n<ul>\n<li><span style=\"color: #ff0000;\">QC size\u00a0: <strong>64 Mo<\/strong><\/span><\/li>\n<li><span style=\"color: #ff0000;\">TPS : <strong>580,84<\/strong><\/span><\/li>\n<li><span style=\"color: #ff0000;\">95%tile : 214,74 ms<\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3>&#8212; Query cache OFF \u00e0 0 Mo<\/h3>\n<pre class=\"\">mysql&gt; SET GLOBAL query_cache_type=0; \r\nSET GLOBAL query_cache_size=0; \r\nSHOW GLOBAL VARIABLES LIKE 'query_cache%';\r\n+------------------------------+---------+\r\n| Variable_name | Value |\r\n+------------------------------+---------+\r\n| query_cache_limit | 2097152 |\r\n| query_cache_min_res_unit | 4096 |\r\n| query_cache_size | 0 |\r\n| query_cache_strip_comments | OFF |\r\n| query_cache_type | OFF |\r\n| query_cache_wlock_invalidate | OFF |\r\n+------------------------------+---------+\r\n\r\nOLTP test statistics:\r\nqueries performed:\r\nread: 60504052\r\nwrite: 0\r\nother: 8643436\r\ntotal: 69147488\r\ntransactions: 4321718 (4801.84 per sec.)\r\ndeadlocks: 0 (0.00 per sec.)\r\nread\/write requests: 60504052 (67225.74 per sec.)\r\nother operations: 8643436 (9603.68 per sec.)<\/pre>\n<pre class=\"\">Test execution summary:\r\ntotal time: 900.0132s\r\ntotal number of events: 4321718\r\ntotal time taken by event execution: 89974.6206\r\nper-request statistics:\r\nmin: 1.14ms\r\navg: 20.82ms\r\nmax: 466.96ms\r\napprox. 95 percentile: 71.97ms<\/pre>\n<pre class=\"\">Threads fairness:\r\nevents (avg\/stddev): 43217.1800\/158.09\r\nexecution time (avg\/stddev): 899.7462\/0.01<\/pre>\n<p>&nbsp;<\/p>\n<p><span style=\"color: #ff0000;\"><strong><span style=\"text-decoration: underline;\">Chiffres cl\u00e9s<\/span>\u00a0:<\/strong><\/span><\/p>\n<ul>\n<li><span style=\"color: #ff0000;\">QC size\u00a0: <strong>0 Mo<\/strong><\/span><\/li>\n<li><span style=\"color: #ff0000;\">TPS : <strong>4801,84<\/strong><\/span><\/li>\n<li><span style=\"color: #ff0000;\">95%tile : <strong>71,97 ms<\/strong><\/span><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2>Conclusion<\/h2>\n<p>&nbsp;<\/p>\n<p>Les requ\u00eates cr\u00e9\u00e9es par sysbench lors de ce test, g\u00e9n\u00e8rent un query cache hit ratio particuli\u00e8rement faible &lt; 10%<\/p>\n<p>Ce dernier se calcul de la fa\u00e7on suivante\u00a0: <strong>Qcache_hits \/ (Qcache_hits +Com_select)<\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>Avec un QC hit ratio si bas, activer le QC \u00e0 un impact d\u00e9sastreux sur les performances, <span style=\"text-decoration: underline;\">m\u00eame en lecture seule<\/span>, est ce quelque soit sa taille (64 \/ 128 \/ 256 Mo ).<\/p>\n<p>Lui mettre une taille beaucoup plus grande n&rsquo;est pas une bonne id\u00e9e (cf\u00a0: \u00ab\u00a0<a title=\"Audit et optimisation de MySQL 5\" href=\"http:\/\/dasini.net\/blog\/bibliotheque\/#audit_optimisation_mysql5\" target=\"_blank\">Audit &amp; optimisation, MySQL 5\u00a0&#8211; \u00e9ditions Eyrolles<\/a>\u00bb).<\/p>\n<p>&nbsp;<\/p>\n<p>Il est cependant possible de le param\u00e9trer pour minimiser les pertes de performances (si il doit imp\u00e9rativement \u00eatre activ\u00e9). Dans le contexte de ce bench, la diminution du <strong>query_cache_min_res_unit, <\/strong>512 au lieu de 4096 (car les r\u00e9sultat renvoy\u00e9s sont tr\u00e8s petit) associ\u00e9 \u00e0 un query_cache_size de 256Mo \u00e0 permit d&rsquo;atteindre pr\u00e8s de 2000 TPS (mieux que les 580 TPS obtenus avec 64Mo mais bien loin des 4800 TPS avec le QC d\u00e9sactiv\u00e9).<\/p>\n<p>&nbsp;<\/p>\n<p>A noter \u00e9galement qu&rsquo;une diminution du nombre de connexions concurrentes n&rsquo;inverse pas la tendance, m\u00eame si l&rsquo;\u00e9cart diminue un peu (en d&rsquo;autres termes plus il y a de connexions concurrentes, plus il y a de contentions (plut\u00f4t logique)\u00a0!)<\/p>\n<p>&nbsp;<\/p>\n<p>Une question que n&rsquo;adresse pas ce test: <strong>A partir de quel pourcentage de hit ratio il est (serait) b\u00e9n\u00e9fique d&rsquo;activer le QC\u00a0?<\/strong><\/p>\n<p>J\u00a0&lsquo;essaierai d&rsquo;y r\u00e9pondre dans un prochain article<\/p>\n<p>&nbsp;<\/p>\n<p>Et vous, votre cache de requ\u00eates vous veut il du bien\u00a0?<\/p>\n<p>&nbsp;<\/p>\n<p>P.S. Les r\u00e9sultats sont (\u00e9videmment) les m\u00eames avec MariaDB 5.3.3 &amp; Percona Server 5.5.19<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2>Divers<\/h2>\n<p><span style=\"text-decoration: underline;\">Protocole<\/span><\/p>\n<ul>\n<li>Start du serveur.<\/li>\n<li>2 run de 900 secondes<\/li>\n<li>Je prend le meilleur des 2<\/li>\n<li>Buffer pool suffisamment grand pour contenir toutes les donn\u00e9es.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"text-decoration: underline;\">Serveur<\/span><\/p>\n<ul>\n<li>Intel(R) Xeon(R) CPU X7542 @ 2.67GHz (x16)<\/li>\n<li>RAM: 64 Go<\/li>\n<li>OS: Ubuntu server<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"text-decoration: underline;\">MySQL server version<\/span>: 5.5.19 Percona Server with XtraDB (GPL), Release rel24.0, Revision 204<\/p>\n<p>&nbsp;<\/p>\n<p>InnoDB <span style=\"text-decoration: underline;\">configuration:<\/span><\/p>\n<p># InnoDB<\/p>\n<ul>\n<li>innodb_file_per_table<\/li>\n<li>innodb_buffer_pool_size = 8G<\/li>\n<li>innodb_buffer_pool_instances = 2<\/li>\n<li>innodb_log_file_size = 152428800<\/li>\n<li>innodb_flush_log_at_trx_commit = 2<\/li>\n<li>innodb_log_buffer_size = 8388608<\/li>\n<li>innodb_support_xa = 1<\/li>\n<li>innodb_thread_concurrency = 0<\/li>\n<li>innodb_io_capacity = 200<\/li>\n<li>innodb_doublewrite = 1<\/li>\n<li>innodb_max_dirty_pages_pct = 75<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"text-decoration: underline;\">Table information<\/span><\/p>\n<pre class=\"lang:mysql decode:true\">CREATE TABLE `sbtest` (\r\n`id` int(10) unsigned NOT NULL AUTO_INCREMENT,\r\n`k` int(10) unsigned NOT NULL DEFAULT '0',\r\n`c` char(120) COLLATE utf8_swedish_ci NOT NULL DEFAULT '',\r\n`pad` char(60) COLLATE utf8_swedish_ci NOT NULL DEFAULT '',\r\nPRIMARY KEY (`id`),\r\nKEY `k` (`k`)\r\n) ENGINE=InnoDB AUTO_INCREMENT=10000001 DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"lang:sh decode:true\">Name: sbtest\r\nEngine: InnoDB\r\nVersion: 10\r\nRow_format: Compact\r\nRows: 10000060\r\nAvg_row_length: 224\r\nData_length: 2247098368\r\nMax_data_length: 0\r\nIndex_length: 137019392\r\nData_free: 4194304\r\nAuto_increment: 10000001\r\nCreate_time: 2012-02-10 13:15:11\r\nUpdate_time: NULL\r\nCheck_time: NULL\r\nCollation: utf8_swedish_ci\r\nChecksum: NULL<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"text-decoration: underline;\">Type de requ\u00eates<\/span>:<\/p>\n<ul>\n<li>SELECT c from sbtest where id=9992481<\/li>\n<li>SELECT DISTINCT c from sbtest where id between 9997686 and 9997786 order by c<\/li>\n<li>SELECT c from sbtest where id=10068344<\/li>\n<li>SELECT SUM(K) from sbtest where id between 10073907 and 10074006<\/li>\n<li>SELECT c from sbtest where id between 9330963 and 9331062<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p><span style=\"text-decoration: underline;\">Calcul du query cache hit ratio<\/span>:<\/p>\n<p><strong>Qcache_hits \/ (Qcache_hits +Com_select) &lt; 1%<\/strong><\/p>\n<pre class=\"\">show global status like 'qcache%';\r\n+-------------------------+----------+\r\n| Variable_name | Value |\r\n+-------------------------+----------+\r\n| Qcache_free_blocks | 21304 |\r\n| Qcache_free_memory | 76320360 |\r\n| Qcache_hits | 407451 |\r\n| Qcache_inserts | 4745672 |\r\n| Qcache_lowmem_prunes | 4691295 |\r\n| Qcache_not_cached | 543 |\r\n| Qcache_queries_in_cache | 54377 |\r\n| Qcache_total_blocks | 130059 |\r\n+-------------------------+----------+<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"\">mysql&gt; show global status like 'com_sel%';\r\n+---------------+---------+\r\n| Variable_name | Value |\r\n+---------------+---------+\r\n| Com_select | 4746219 |\r\n+---------------+---------+<\/pre>\n<p>&nbsp;<\/p>\n<pre class=\"\">select 407451\/(407451+4746219);\r\n+-------------------------+\r\n| 407451\/(407451+4746219) |\r\n+-------------------------+\r\n|\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 0.0791 |\r\n+-------------------------+\r\n\r\n=&gt; Taux de r\u00e9ussite du cache de requ\u00eate est d'environ 8%<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Selon le livre \u00abAudit &#038; optimisation, MySQL 5 &#8211; \u00e9ditions Eyrolles\u00bb, le cache de requ\u00eates ou query cache est un syst\u00e8me de cache m\u00e9moire interne \u00e0 MySQL, transparent pour l&rsquo;application, qui ne stocke que les requ\u00eates SELECT et leurs r\u00e9sultats.<\/p>\n<p>L&rsquo;apport de ce cache est particuli\u00e8rement d\u00e9pendant de votre application. Il est coutume de dire qu&rsquo;il est (tr\u00e8s) p\u00e9nalisant dans des environnements o\u00f9 les requ\u00eates d&rsquo;\u00e9critures sont nombreuses, notamment \u00e0 cause de son m\u00e9canisme d&rsquo;invalidation (et de probl\u00e8mes de contentions de fa\u00e7on g\u00e9n\u00e9rale).<\/p>\n<p>A l&rsquo;oppos\u00e9, il peut \u00eatre int\u00e9ressant de l&rsquo;activer, dans des environnements \u00e0 forte charges de lectures, si les m\u00eames requ\u00eates reviennent tr\u00e8s fr\u00e9quemment, plus particuli\u00e8rement lors de l&rsquo;utilisation de tables MyISAM.<\/p>\n<p>Cependant, un environnement \u00e0 forte charge en lecture n&rsquo;est pas une condition suffisante pour s&rsquo;assurer de bonne performances avec le query cache, c&rsquo;est ce que nous allons voir dans cet article.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"categories":[81,167,8,181],"tags":[251,253,255,169,153],"class_list":["post-1196","post","type-post","status-publish","format-standard","hentry","category-bench","category-mariadb","category-mysql","category-percona-server-2","tag-bench-fr","tag-mariadb-fr","tag-mysql-fr","tag-percona","tag-query-cache"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9LfWW-ji","jetpack-related-posts":[{"id":788,"url":"https:\/\/dasini.net\/blog\/2009\/10\/12\/mysql-query-cache\/","url_meta":{"origin":1196,"position":0},"title":"MySQL Query cache","author":"Olivier DASINI","date":"12 octobre 2009","format":false,"excerpt":"Le cache est toujours \u00e0 jour car en cas de modification d'une table, toutes les requ\u00eates en relations avec cette table sont invalid\u00e9es. Le cache de requ\u00eates est en g\u00e9n\u00e9ral utile lorsque: Les modifications sur les tables ne sont pas tr\u00e8s fr\u00e9quentes Beaucoup de requ\u00eates de lectures identiques Utilisation de\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1227,"url":"https:\/\/dasini.net\/blog\/2012\/03\/30\/mysql-5-6-rocks\/","url_meta":{"origin":1196,"position":1},"title":"MySQL 5.6 rock !","author":"Olivier DASINI","date":"30 mars 2012","format":false,"excerpt":"Comme d'habitude, mon but n'est pas de conna\u00eetre les possibilit\u00e9s maximales du serveur (d'autres le font mieux que moi), mais plut\u00f4t d'avoir une id\u00e9e assez pr\u00e9cise de leurs comportements respectifs dans un environnement le plus proche possible de ma prod. pour ce test, les candidats sont, Percona 5.5, MariaDB 5.3\u2026","rel":"","context":"Dans &quot;bench&quot;","block_context":{"text":"bench","link":"https:\/\/dasini.net\/blog\/category\/bench\/"},"img":{"alt_text":"dasini.net - 95 centile","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-includes\/images\/percentil.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":1245,"url":"https:\/\/dasini.net\/blog\/2012\/04\/05\/mysql-5-6-rock-suite\/","url_meta":{"origin":1196,"position":2},"title":"MySQL 5.6 rock suite","author":"Olivier DASINI","date":"5 avril 2012","format":false,"excerpt":"Voici la suite du post MySQL 5.6 rock, dans lequel je test MySQL 5.5 & 5.6, MariaDB 5.3 & 5.5 et Percona server 5.5. Pour cet article, toujours un bench. Le contexte est assez proche, \u00e0 la diff\u00e9rence pr\u00e8s que cette fois les serveurs sont test\u00e9s en lecture (65%) et\u2026","rel":"","context":"Dans &quot;bench&quot;","block_context":{"text":"bench","link":"https:\/\/dasini.net\/blog\/category\/bench\/"},"img":{"alt_text":"dasini.net - 95 centile for R\/W i\/o bounds","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-includes\/images\/dasini.net_bench_mysql_95percentil.png?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":1425,"url":"https:\/\/dasini.net\/blog\/2013\/05\/27\/utiliser-une-sous-requete-cest-mal-suite-part-1-3\/","url_meta":{"origin":1196,"position":3},"title":"Utiliser une sous requ\u00eate c\u2019est mal ? (suite) part 1-3","author":"Olivier DASINI","date":"27 mai 2013","format":false,"excerpt":"Comme promit, voici la suite de l\u2019article Utiliser une sous-requ\u00eate c\u2019est mal ? L\u2019id\u00e9e ici est de r\u00e9pondre aux interrogations de svar et d\u2019en profiter pour explorer les nouvelles possibilit\u00e9s de la variante stable de MySQL qui poss\u00e8de l\u2019optimiseur le plus avanc\u00e9, c\u2019est \u00e0 dire MariaDB 5.5. Pr\u00e9ambule En pr\u00e9-requis,\u2026","rel":"","context":"Dans &quot;MariaDB&quot;","block_context":{"text":"MariaDB","link":"https:\/\/dasini.net\/blog\/category\/mariadb\/"},"img":{"alt_text":"","src":"https:\/\/lh3.googleusercontent.com\/8zkRFWHP6EnBzoQbslcH8lk9Cq1TJ1NFMT7tjTsN8fgdk-UBh0vaRJqzEd3SbRjCCFV-jdUOoH1U_WUdKcI1nT1G_gz9HHpefwKCxWIMh_S55Gl2iumBn_gNRA","width":350,"height":200,"srcset":"https:\/\/lh3.googleusercontent.com\/8zkRFWHP6EnBzoQbslcH8lk9Cq1TJ1NFMT7tjTsN8fgdk-UBh0vaRJqzEd3SbRjCCFV-jdUOoH1U_WUdKcI1nT1G_gz9HHpefwKCxWIMh_S55Gl2iumBn_gNRA 1x, https:\/\/lh3.googleusercontent.com\/8zkRFWHP6EnBzoQbslcH8lk9Cq1TJ1NFMT7tjTsN8fgdk-UBh0vaRJqzEd3SbRjCCFV-jdUOoH1U_WUdKcI1nT1G_gz9HHpefwKCxWIMh_S55Gl2iumBn_gNRA 1.5x"},"classes":[]},{"id":1593,"url":"https:\/\/dasini.net\/blog\/2016\/03\/02\/30-mins-avec-mysql-query-rewriter\/","url_meta":{"origin":1196,"position":4},"title":"30 mins avec MySQL Query Rewriter","author":"Olivier DASINI","date":"2 mars 2016","format":false,"excerpt":"Parfois des requ\u00eates probl\u00e9matiques tournent sur le serveur, mais il n'est pas possible de r\u00e9gler le probl\u00e8me \u00e0 la source (Requ\u00eates venant d'un ORM par example) MySQL 5.7 fournit une API pre et post parse query rewrite. Les utilisateurs peuvent \u00e9crire leurs propre plugins ce qui permet d'\u00e9liminer le besoin\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":192,"url":"https:\/\/dasini.net\/blog\/2008\/11\/23\/mysql-5-les-vues-part-17\/","url_meta":{"origin":1196,"position":5},"title":"MySQL 5 : Les vues &#8212; (part 1\/7)","author":"Olivier DASINI","date":"23 novembre 2008","format":false,"excerpt":"Le langage SQL acronyme de Structured Query Language (Langage Structur\u00e9 de Requ\u00eates), a \u00e9t\u00e9 con\u00e7u pour g\u00e9rer les donn\u00e9es dans un SGBDR. A l'aide des DML (Data Manipulation Language ie les requ\u00eates SELECT, INSERT, UPDATE, DELETE) il est possible de manipuler ces donn\u00e9es qui sont stock\u00e9es dans des tables. SQL\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/1196","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/comments?post=1196"}],"version-history":[{"count":27,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/1196\/revisions"}],"predecessor-version":[{"id":1208,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/1196\/revisions\/1208"}],"wp:attachment":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/media?parent=1196"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/categories?post=1196"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/tags?post=1196"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}