Audit MySQL – tmp_table_size & max_heap_table_size

mai 28, 2010

Je suis amené à réaliser régulièrement des audits de serveurs MySQL.Voici le premier volet d’une série d’articles où je vais essayer de vous donner quelques points clés pour mieux comprendre le fonctionnement de MySQL.

La configuration du serveur est un des points que je regarde, et l’une des erreurs les plus courantes concerne le paramétrage des options tmp_table_size et max_heap_table_size.

tmp_table_size permet de fixer la taille maximale au-delà de laquelle les tables temporaires en mémoire créées par MySQL (avec le moteur Memory) se transforment en table MyISAM en migrant les données sur le disque. max_heap_table_size permet de fixer la taille maximale des tables avec pour moteur de stockage Memory (Heap est l’ancien nom de Memory).
Extraits du livre « Audit et optimisation – MySQL 5; Bonnes pratiques pour l’administrateur »

Ce qui est important de savoir c’est que la limite des tables temporaires en mémoire créées par MySQL est la plus petite de ces deux valeurs. Ce que je vois souvent dans les fichier de configurations, c’est un tmp_table_size à 64 Mo (par exemple) et un max_heap_table_size qui lui n’y figure pas et qui par conséquent prend ça valeur par défaut, c’est à dire 16Mo. Votre table temporaire créée par le serveur (lors de votre GROUP BY par exemple) sera sur disque dès 16Mo de données et non 64 Mo comme vous le pensiez.
Alors pourquoi faut il limiter le nombre de tables temporaires créées sur le disque ? Tous simplement car sur disque, le temps d’exécution de la requête sera beaucoup, beaucoup plus long, de l’ordre de fois 10 voir fois 100 !
Lorsque vous renseignez l’option tmp_table_size, pensez également à donner la même valeur à l’option max_heap_table_size.
2

Extraits du livre Audit et optimisation – MySQL 5

mars 24, 2010
Bonnes pratiques pour l'administrateur

Audit & optimisation MySQL 5

A l’occasion de la sortie du livre « Audit et optimisation MySQL 5« , Arnaud Gadal et Pascal Borghino blogueurs sur dbnewz et Olivier Dasini vous offrent 3 extraits du livre:

Enjoy !

Le 29/03/2010

Classement parmi les ventes Amazon.fr : 1.305 en Livres

« Audit et optimisation – MySQL 5 » est très apprécié dans ces rubriques :

1 dans la rubrique Livres > Informatique et Internet > Bases de données > SQL

1 dans la rubrique Livres > Informatique et Internet > Bases de données > Logiciels > MySQL

1 dans la rubrique Livres > Informatique et Internet > Linux et logiciels libres > MySQL

http://www.amazon.fr/Audit-optimisation-Bonnes-pratiques-ladministrateur/dp/2212126344

10

Sortie du livre: Audit et optimisation – MySQL 5

mars 9, 2010

Pascal Borghino, Olivier Dasini, Arnaud Gadal et Eyrolles ont l’honneur de vous annoncer la sortie du livre Audit et optimisation MySQL 5.

Bonnes pratiques pour l'administrateur

Pour la première fois, les meilleurs experts de chez Yahoo!, Orange Business Services et Virgin mobile livrent leur expérience de terrain... en français

Editeur : EYROLLES | Langue : Français | ISBN-10: 2212126344 | ISBN-13: 978-2212126341

A l’occasion du salon Solutions Linux/Open Source qui se tiendra du 16 au 18 mars à Paris Expo-Porte de Versailles, cet ouvrage sera disponible en exclusivité et en avant-première sur le stand Eyrolles (n°C35).

L’ouvrage sera disponible en librairie le 25 mars 2010. Vous pouvez cependant déjà le commander sur les sites spécialisés (fnac, amazon.fr, eyrollesLavoisier, decitre. cine-memento.fr,… )

Au sommaire:

CHAPITRE 1
Gérer une situation d’urgence avec MySQL ………………………….. 1
CHAPITRE 2
Choisir son serveur MySQL ………………………………………………… 19
CHAPITRE 3
Les moteurs de stockage …………………………………………………… 49
CHAPITRE 4
Surveiller son serveur MySQL…………………………………………….. 81
CHAPITRE 5
Exploiter les journaux de MySQL ……………………………………… 141
CHAPITRE 6
Optimiser sa base de données : du schéma aux requêtes ………. 163
CHAPITRE 7
Optimiser son serveur mySQL ………………………………………….. 193
CHAPITRE 8
La réplication MySQL ………………………………………………………. 217
CHAPITRE 9
Où trouver de l’aide ? ……………………………………………………… 253
3

Recherche d’un expert MySQL

février 11, 2010
  • Profil : Expert MySQL
  • Expériences nécessaire :  forte expérience sur la configuration et le tuning de MySQL dans un contexte de forte utilisation
  • Compétences pré requises : MySQL – Compétences  qui seraient un plus : EzPublish ou autre CMS
  • Environnement technique : Linux Debian, Apache, MySQL
  • Connaissances des Outils : outils de mesures de charge MySQL
  • Contexte particulier du projet : sites à grande audience
  • Autres : Il s’agit d’une mission très ponctuelle dans un contexte technique lourd et il faut vraiment une personne très expérimentée.
  • Contact: Patrick Babonneau  +33 6 99 32 84 99
Commentaires fermés sur Recherche d’un expert MySQL

Résolutions pour l’année 2010

janvier 8, 2010

Une année 2009 très riche pour moi où j’ai découvert la Croatie, la Turquie (que je vous recommande d’ailleurs) et redécouvert la Hongrie (ses thermes… que du bonheur !), mais qui m’a surtout permis d’évoluer professionnellement. En effet après 5 années de bons et loyaux services j’ai quitté Anaska (Alter Way formation) où j’avais les casquettes de consultant MySQL et de formateur MySQL / PHP ( et Talend pendant une année ) pour rejoindre Orange Business Services en tant qu’expert base de données.

Une année riche vous disais-je, où un projet qui me tenait à cœur à pu voir le jour: l’écriture d’un livre, en français destiné aux utilisateurs avancés de MySQL. Ce projet à pu aboutir grâce à mes deux co-auteurs et amis de dbnewz : Arnaud Gadal DBA MySQL à Virgin Mobile, Pascal Borghino architecte base de données à Yahoo!

Titre de notre livre: Audit et optimisation MySQL 5,édité par Eyrolles, il devrait être disponible à la vente au plus tôt fin janvier 2010. Vous pouvez toujours le commander sur votre e-librairie préfére, comme la FNAC, Amazon, Lavoisier, Renaud-Bray… Nous vous donnerons plus d’informations dès que possible.

En 2009, j’ai également commencé l’écriture d’un deuxième ouvrage qui devrait être disponible mi-2010. Je n’en dirai pas plus pour l’instant… 🙂

Effets de bords de toutes ces activités dévoreuses de temps, moins d’articles sur ce blog 🙁

La tendance n’est pas encore prête de s’inverser, cependant, rassurez vous, il y a encore plein d’informations et d’expériences à partager !

Au chapitre actualité (brulante) de MySQL, Monty vs Oracle… Au-delà de toutes considérations partisanes, mon vœux le plus cher est qu’une décision soit prise le plus rapidement. Car l’indécision est mauvaise pour tout le monde !

Le bon coté de cette histoire c’est MariaDB, un des forks (Drizzle, Ourdelta…) de MySQL. Nous en reparlerons sur dasini.net en 2010, soyez en certain.

Bonne année 2010 !

Olivier DASINI

7

Audit et optimisation MySQL 5

novembre 9, 2009

Arnaud Gadal DBA MySQL à Virgin Mobile, Pascal Borghino architecte base de données à Yahoo! (mes potos de dbnewz) et moi, venons juste de terminer l’écriture d’un livre consacré à l’audit et à l’optimisation d’un serveur MySQL.
A travers cet ouvrage, nous avons essayé de synthétiser nos différentes expériences pour vous aider à tirer le meilleur de votre base de données. Dans le livre nous abordons des sujets comme les architectures de réplication, le tuning du serveur, les moteurs de stockage, les logs…
Audit & optimisation MySQL 5 est édité par eyrolles et devrait être disponible d’ici 4 à 6 semaines

à suivre…

5

Un dauphin qui obéit au doigt et à l’oeil ?

novembre 4, 2009

En cherchant des images pour ma prochaine conférence MySQL, pour le forum PHP/MySQL 2009, je suis tombé, tout à fait par harsard (je tiens à le préciser 😉 ) sur ceci:

Dolphin Finger

Dolphin Finger

Finalement, c’est peu être un bon moyen d’augmenter la popularité de MySQL chez la gente féminine, cependant je n’arrive pas bien à voir où placer cette image dans ma présentation…

Rappel: Offre LeMug / forum PHP: http://dasini.net/blog/2009/10/20/conferences-mysql-au-forum-php/

2

Conférences MySQL au Forum PHP

octobre 20, 2009

Le MySQL User Group Francophone est partenaire avec l’AFUP du Forum PHP, qui se tient les 12 et 13 novembre 2009, à la Cité des Sciences et de l’Industrie.


Au programme des conférences dédiées à MySQL et MariaDB :

  • mysqlnd / « MySQL native driver for PHP » : Les améliorations de la stack avec Serge Frezefond
  • Au secours, ma base de données fait ramer mon application ! avec Stéphane Combaudon
  • MariaDB, the future of MySQL avec Michael Widenius aka Monty
  • Retour d’expérience sur l’utilisation de MySQL Chez Orange Business Services avec Olivier DASINI
  • Réplication MySQL : retours d’expérience avec Jean-François Bustarret

Participez à cet événement et bénéficiez d’une offre exceptionnelle :
les deux journées du Forum PHP
+
l’adhésion 2009/2010 au MySQL User Group France
pour 140 euros au lieu de 200 euros !*

Suivez ce lien pour adhérer au MUG et recevoir votre badge pour le Forum PHP

*Tarif normal de l’accès deux jours au Forum PHP 180 euros + Adhésion annuelle au MySQL User Group 20 euros.

Commentaires fermés sur Conférences MySQL au Forum PHP

MySQL Query cache

octobre 12, 2009
Tags:

En tant que boulimique de MySQL, je me promène souvent sur la toile à la recherche d’informations, de bonnes et de moins bonnes…

Je suis tombé sur un article traitant du cache de requêtes de MySQL (MySQL Query Cache) sur le blogue de Patrick Lafontaine (http://www.noidea.ca/)

Je me permet de faire quelques commentaires ici.

En préambule, quelques informations nécessaires sur le cache de requêtes:

Système de cache interne à MySQL qui ne stocke que les requêtes SELECT et leur résultat ie pas d’INSERT, UPDATE, DELETE…

Les requêtes ( SELECT donc) doivent être strictement identiques ie même casse, mêmes espaces entre les mots,…

Ex 3 requêtes différentes pour le cache :

SELECT nom, prenom FROM client WHERE client_id=123;
select nom, prenom FROM client WHERE client_id=123; /* la casse du select*/
SELECT nom, prenom FROM client        WHERE client_id=123; /*plusieurs espaces entre client et WHERE*/

Le cache est toujours à jour car en cas de modification d’une table, toutes les requêtes en relations avec cette table sont invalidées.

Le cache de requêtes est en général utile lorsque:

  • Les modifications sur les tables ne sont pas très fréquentes
  • Beaucoup de requêtes de lectures identiques
  • Utilisation de tables MyISAM. Moins intéressant pour InnoDB

Pour rebondir sur l’article de Patrick Lafontaine

« puisqu’elle est activée par défaut. »

Le cache de requêtes n’est pas activé par défaut, car la variable query_cache_size vaut 0. Si vous voulez vous en servir, il faut lui donner une taille en octet. Mettez le tout dans votre fichier de configuration. Assurez vous également que la variable query_cache_type est différente de OFF

« c’est-à-dire que la ou les applications qui s’en servent n’ont pas besoin d’être modifiées »

Pour une optimisation optimale, il est parfois nécessaire de modifier les requêtes SELECT avec SQL_CACHE ou SQL_NO_CACHE. On choisit alors quelles requêtes seront mis en cache.

« Si quelqu’un modifie la valeur directement dans MySQL, la cache possèdera la vieille valeur jusqu’à ce qu’un processus l’invalide. »

Sur une machine de production, ce type de manipulation reste quand même exceptionnel, sinon c’est qu’il y a des choses à revoir dans les process.

« 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. »

Si le contenu ne change JAMAIS, il n’a à priori rien à faire en base ! Il vaut mieux utiliser un menu statique et laisser la base faire son boulot avec du contenu dynamique. Dans le même ordre d’idée, plus le cache est éloigné du disque plus il est performant. En d’autres termes, le goulet d’étranglement est souvent (parfois) la base de données, de plus elle est souvent (parfois) plus difficilement scalable que le reste. L’utilisation d’un cache applicatif est rarement une mauvaise idée (il suffit de connaître l’identité du plus gros consommateur de memcached au monde http://www.facebook.com/note.php?note_id=39391378919)

« Il est donc plus avantageux de cacher les processus lourds que les légers. »

Malheureusement, avec le cache de requêtes ce n’est pas aussi simple. Admettons qu’une requête renvoyant un gros résultat prenne plus de temps qu’une renvoyant un plus petit. Si cette grosse requête vire toutes les autres requêtes du cache, l’apport du cache pour les autres requêtes est perdu, elle devront être misent à nouveau dans le cache ca qui implique des recherches inutiles dans le caches et de nouveaux accès disque…

« Lorsque la Query Cache de MySQL est activée, le processus de cacher les résultats et de les invalider s’effectue tout seul de manière invisible. Ainsi, d’autres requêtes que vous ne soupçonnez même pas bénéficient de la cache »

L’efficacité du cache de requêtes est vraiment lié à l’application. Il dépend du type de requêtes SELECT, de leur fréquence et de la fréquence des écritures dans les tables. Le gain n’est pas évident et est loin d’être immédiat, car pour chaque requête « cachable » MySQL devra l’analyser, devra la hacher, devra vérifier s’il elle est dans le cache ou non. Et ceci à un coût…

Vous pouvez calculer le taux d’efficacité du cache de requêtes avec la formule suivant:

Qcache_hits / (Qcache_hits + Com_select )

Pour finir, quelques paramètres et commandes

Paramètres principaux:

query_cache_size: Doit être différent de zéro pour activer le cache

query_cache_type:

  • ON: les requêtes select sont misent en cache

    • Sauf (SQL_NO_CACHE, result set trop grand, fonction non déterministe..)

  • DEMAND: SELECT SQL_CACHE

  • OFF

Commandes principales:

FLUSH QUERY CACHE

  • Défragmente le cache de requêtes

  • Ne vide pas le cache

Vider le cache de requêtes:

  • RESET QUERY CACHE

  • FLUSH TABLES

  • Redémarrer le serveur

Variables d’état: SHOW STATUS LIKE ‘Qcache%’ ;

Qcache_free_blocks : nombre de blocs libres

Qcache_free_memory : mémoire libre

Qcache_hits : nombre de fois qu’il a servi

Qcache_inserts : nombre de requêtes insérées

Qcache_lowmem_prunes : nombre de requêtes supprimées car plus de place

Qcache_not_cached : nombre de requêtes non « cachables »

Qcache_queries_in_cache : nombre de requêtes dans le cache

Qcache_total_blocks : nombre de blocs de mémoire

16

Utiliser XML avec MySQL 5.1 (part 5/5)

octobre 1, 2009

(<- précédent)

Jusqu’ici, la récupération des informations ne s’est opérée qu’en lisant un flux XML stocké dans une variable. Cependant, il est également possible de récupérer des informations XML stockées dans la base : il suffit pour cela de remplacer la variable par le nom du champs dans lequel est enregistré ce flux.

Comment trouver le type et les URL des flux RSS qui contiennent le mot France ?

Extraire les données d’un flux XML stocké en base

SELECT type, extractValue( flux_rss, « /rss/channel/item/link[ ../title[contains(.,’France’)]] ») AS url FROM rss GROUP BY url HAVING url NOT LIKE  »\G
*************************** 1. row ***************************
type: international
url: http://www.lemonde.fr/asie-pacifique/article/2008/08/21/en-france-le-debat-s-intensifie-sur-le-renfort-des-troupes-en-afghanistan-decide-par-m-sarkozy_1086214_3216.html?xtor=RSS-3210
*************************** 2. row ***************************
type: technologie
url: http://www.lemonde.fr/aujourd-hui/article/2008/08/07/en-france-des-adversaires-des-jo-s-expriment-en-video-sur-la-toile_1081170_3238.html?xtor=RSS-651865

MySQL 5 implémente une autre commande pour pouvoir traiter des flux XML, la fonction updateXML(). Elle permet de modifier la sortie d’un document XML, sans modifier ce dernier.

Une remarque, cette fonction ne modifie que le premier nœud trouvé qui correspond à l’expression, ce qui limite son intérêt. De plus, la chaîne de remplacement est figée, il n’est donc pas possible de faire une transformation:

Remplacement de données XML avec updatexml

SELECT updatexml(load_file( ‘c:/formateur.xml’), ‘/opensource/formateur[2]/prenom’, ‘<prenom>aka XML fan</prenom>’) AS result \G
*************************** 1. row ***************************
result:
<opensource>
Les formateurs de l’équipe sont :
<formateur domaines= »MySQL PHP »>
<nom>Dasini</nom>
<prenom>Olivier</prenom>
</formateur>
<formateur domaines= »PHP XML »>
<nom>Allard</nom>
<prenom>Aka XML fan</prenom>
</formateur>
<formateur domaines= »Linux MySQL »>
<nom>Dumont</nom>
<prenom>Pierre</prenom>
</formateur>
et sont passionnés par l’open source.
</opensource>
/*Le fichier XML original n’est pas modifié*/

Conclusion

Voilà un petit panorama de l’utilisation des fonctionnalités XML de MySQL. Comme nous l’avons vu, générer le résultat d’une requête au format XML reste très simple avec le client texte mysql, idem pour la génération d’une sauvegarde (mysqldump). De plus, bien que n’étant pas un base de données XML, ont peut aisément y stocker des flux XML, et les parcourir ou les modifier grâce aux fonctions extractValue et updatexml, et une bonne dose d’XPath. Le support de ce dernier, par MySQL, reste encore assez basique, mais ce manque sera comblé progressivement dans les prochaines versions.

Article co-écrit avec Fabien Allard qui est formateur et développeur certifié PHP, Ajax et Linux chez Anaska Alter Way Group. Fabien est également spécialiste des technologies XML.

(Début de l’article)

Commentaires fermés sur Utiliser XML avec MySQL 5.1 (part 5/5)