Académique Documents
Professionnel Documents
Culture Documents
p. 2
p. 3
p. 4
p. 5
p. 6
MySQL cest. . .
une base de donne relationnelle cre en 1995 modle client-serveur une application lgre dans le monde des SGBD dveloppe par une socit sudoise (ABSoft) Rachete par Sun Microsytems dbut 2008. Le plus rpandu des SGBDR libres Particulirement utilis pour le web (LAMP) diuse sous double licence
libre (GPL) pour un usage interne ou libre propritaire payant pour un usage propritaire
SGBDR libres
MySQL PostgreSQL SQLite (embarqu et non client-serveur) Firebird (fork de Borland InterBase)
Principales versions : 4.1 stable depuis octobre 2004 5.0 stable depuis octobre 2005 5.1 stable depuis novembre 2008
p. 7
p. 8
Caractristiques de MySQL
Avantages
Multi plates-formes : Linux, Windows, OSX, etc. Gratuit pour un usage libre ou non commercial Bonne documentation de rfrence (HTML, PDF) http://dev.mysql.com/doc/refman/5.0/en/ SGBD performant Plusieurs moteurs internes suivant les besoins Interface avec la plupart des langages de programmation
Installation
Inconvnients
Partiellement conforme au standard SQL:2003 Quelques fonctionnalits absentes ou trs faibles :
analyse la vole (OLAP) traitement du XML donnes gographiques (GIS) triggers (dclencheurs) et curseurs ...
p. 9
p. 10
Installation Windows - 1
Composants
MySQL Windows
Serveur MySQL (mysqld) Clients console : shell (mysql) Clients console : utilitaires (mysqladmin, mysqldump...) Instance Manager (obsolte)
Installation Windows - 2
Structure des rpertoires
C:\Program Files\mySQL\MySQL Server 5.0 bin : les excutables binaires data : les chiers bases de donnes docs examples include : en-ttes pour la programmation C lib : les bibliothques dynamiques conguration "my.ini" dans C:\windows (chier nomm "my.cnf" sous Linux)
p. 11
p. 12
Installation WAMPServer
Un pack de logiciels libres congurs ensemble
Apache : serveur Web MySQL : serveur de base de donnes PHP : langage de programmation web PHPMyAdmin : interface web de gestion de MySQL, crite en PHP SQLiteManager
Larchitecture client-serveur
Rseau : utilisation du protocole IP
une adresse IP, ex. 192.168.1.100 un nom de machine, ex. pc101-01.cuefa.inpg.fr un port (=protocole) ; 3306 par dfaut pour MySQL
ralis par Anaska (st franaise), sous licence GPL v2.0 concurrents : EasyPHP, xAMP...
Parcourir larborescence installe : trouver les chiers de conguration de Apache, MySQL, phpMyAdmin
p. 13
p. 14
La documentation
Le manuel de rfrence
http://dev.mysql.com/doc/ multiples versions, multiples langues mises jour rgulires attention la synchro des versions Formats : En PDF : imprimable... En format CHM (aide Windows) en ligne de commande (terminal) : HELP ... ; En ligne : HTML
Commentaires utilisateurs
Linterface web
PhpMyAdmin : interface unie
p. 15
DPT - id_DPT smallint [PK] - titre varchar(255) - titreCourt varchar(20) - introduction text - conclusion text - logo_url varchar(255) - date_creation timestamp DPT_utilisateur - id_DPT smallint [FK] - id_utilisateur tinyint [FK]
p. 16
id_DPT
DPT_groupt - id_DPT smallint [FK,U] - groupt enum [U] - periode varchar(50) - commentaire text id_DPT
notice id_DPT - id_notice mediumint [PK] - auteur varchar(100) - titre varchar(255) - commentaire varchar(255) - id_journal tinyint [FK] - id_supplement tinyint [FK] - ident varchar(50) - chrono date - chronofin date - page varchar(10) - url varchar(255) - chemin varchar(255) - date_maj timestamp - date_saisie datetime - saisie_id_utilisateur tinyint - maj_id_utilisateur tinyint - erreur varchar(255) - dpt tinyint id_notice id_fnsp fnsp - id_fnsp smallint [PK] - cote varchar(100) - intitule varchar(255) - aintitule varchar(255) - pere_id_fnsp smallint - ancien tinyint - type varchar(20) - date_maj timestamp notice_fnsp id_fnsp per_id_fnsp - id_lnfnsp int [PK] - id_notice mediumint [FK] - id_fnsp smallint [FK] id_supplement journal - id_journal tinyint [PK] - intitule varchar(100) - intart varchar(10) - id_revue_fripes mediumint - id_utilisateur tinyint [FK] - local enum - dpt tinyint id_utilisateur id_utilisateur
DPT_notice
utilisateur saisie_id_utilisateur -> id_utilisateur - id_utilisateur tinyint [PK] - login varchar(20) [U] - password varchar(40) - id_institut tinyint [FK]
StatsArbre - id mediumint [PK] - id_fnsp mediumint [FK] - id_parent mediumint - prof tinyint - nb_fils smallint - nb_not_direct mediumint - nb_not_cumul mediumint - nb_not_direct_public mediumint - nb_not_cumul_public mediumint - chemin varchar(250) - ancetre_niv1 mediumint - ancetre_niv2 mediumint - geo tinyint
- id_DPT smallint [FK,U] - id_notice mediumint [FK,U] - requete text - date_insert timestamp
id_notice
id_institut id_journal id_utilisateur institut - id_institut tinyint [PK] - nom varchar(20) [U]
id_utilisateur
statsConsult - id_statsConsult int [PK] - ip varchar(16) - temps datetime - notices tinyint - formulaire tinyint - journal varchar(50) - supplement varchar(50) - auteur varchar(100) - titre varchar(100) - date varchar(25) - fnsp varchar(50) - dpt mediumint - images tinyint - rssFNSP mediumint id_fnsp id_journal
id_journal
indexFNSP - id_index mediumint [PK] - expression varchar(255) - commentaire text - id_fnsp mediumint [FK]
supplement - id_supplement tinyint [PK] - intitule varchar(200) - id_journal tinyint [FK] - local enum - dpt tinyint
IEP DP
p. 17
p. 18
Les tables
Une base de donnes (par ex. discotheque) est faite de tables. Table Disques Titre Compositeur Cantates Bach J.S. Sonates Beethoven Concerto Dvoak
Chaque ligne est un enregistrement (ou tuple, ou n-uplet). Le nom dune colonne est dit champ (ou attribut).
Application lexemple
Comment organiser ces donnes ? Disques titre compositeurs label date de sortie Disques titre compositeur1 compositeur2 label date de sortie
p. 19
p. 20
Rgles de normalisation
Une table pour chaque groupe de donnes associes, Pas de colonnes au contenu similaire, Chaque enregistrement doit avoir une cl primaire (identiant unique).
Application lexemple
Disques Compositeurs id_disque id_compositeur titre id_disque [FK] label nom date de sortie Doublons dans la table Compositeurs = Normalisation rate !
Application lexemple
id 1 2 3 titre Partita Partita Concerto compositeur Bach Busoni Dvoak label Harmonia Harmonia Sony date 1986 1986 1980
p. 21
p. 22
Il faut crer une table de relation entre les tables Disques et Compositeurs. Disques Rel_Disq_Comp Compositeurs id_disque id_disque id_compositeur titre label id_compositeur nom date de sortie Un compositeur nest dni quune seule fois, mais peut tre mis en relation avec plusieurs disques.
Application lexemple
La colonne Disques.label contredit la rgle. Disques Labels id_disque id_label titre nom id_label date de sortie
p. 23
p. 24
Le modle relationnel
On peut lier les tables par des relations, classes en 3 types. Chaque cl trangre induit une relation entre 2 tables. Un Diagramme Entit-Relation (ERD) est une aide prcieuse.
Relations (1)
Relation 1:1
Chaque lment de la premire table est li au plus un lment de la seconde, et rciproquement. Cette relation est rare, elle scinde une table sans normalisation.
Relation 1:N
Chaque lment de Disques est li au plus un lment de Labels. Et un lment de Labels peut correspondre plusieurs disques. = Disques a une cl trangre sur la cl primaire de Labels. Disques Labels id_disque id_label titre date nom id_label
p. 25
p. 26
Relations (2)
Relation N:M
Chaque lment de Disques est li plusieurs lments de Compositeurs, et rciproquement. Cette relation a besoin dune table de relation avec 2 cls trangres. Disques Disq_Comp Compositeurs id_disque id_disque id_compositeur titre id_compositeur nom date
TP - Disques
Adapter le modle de la base de donnes pour stocker des disques, chacun dcrit avec les informations : titre date de sortie commentaire du diuseur label interprtes compositeurs genres Tracer un ERD de la base.
p. 27
p. 28
Bonnes pratiques
id_disque
Normaliser est une recommandation gnrale. Parfois, il y a des exceptions (par ex. pour la performance). Prendre le temps de bien concevoir son modle. Les changements structurels sur une base en production peuvent tre calamiteux. viter en gnral les noms de type objet1, objet2. Utiliser une table ddie.
id_artiste id_disque
Artistes Genres id_genre - id_genre mediumint [PK] - intitule varchar(100) Disques_Genres - id_disque mediumint [FK] - id_genre mediumint [FK] - id_artiste mediumint [PK] - nom varchar(50) - prenom varchar(50)
Tester sa base avec un jeu de donnes. Surtout si la performance est importante. Utiliser un schema de la base (ERD).
p. 29
p. 30
Conventions de nommage
Pas de convention universelle. Il faut sen xer une et sy tenir. Noms en ASCII On vite ainsi les problmes dencodage ("" en latin1/utf-8/. . .) Fixer une rgle sur le singulier et le pluriel Table user ou users ? Composition des mots dans les noms Champ camelCase ou with_underscores ? Attention aux majuscules ! Sous Windows, le systme de chiers est indirent la casse = Les noms des bases et des tables sont concerns.
Cl primaire
Dclare dans la table avec le mot rserv PRIMARY KEY Chaque table devrait en avoir une (recommand) Au plus 1 PK par table (obligation) Les valeurs sont forcment uniques PK le plus compacte possible pour tre performante = presque toujours numrique (INT) Attribut AUTO_INCREMENT pour que MySQL numrote automatiquement les nouveaux enregistrements
SELECT LAST_INSERT_ID() renvoie la valeur utilise pour la PK
p. 31
p. 32
Cl trangre et contraintes
Cl trangre
Champ qui rfrence une cl primaire dune autre table Pas forcment explicite dans la structure MyISAM Pas de dclaration des cls trangres InnoDB FOREIGN KEY (parent_id) REFERENCES parent(id)
Modliser la situation suivante : on veut reprsenter lorganisation dun ensemble dimmeubles en appartements et dcrire les informations sur les propritaires et les occupants. une personne occupe un seul appartement un appartement peut tre occup par plusieurs personnes (couples, colocataires) une personne peut possder plusieurs appartements un appartement peut appartenir plusieurs personnes (chacun avec quote-part) Crer une base InnoDB adapte et tracer son schema.
Contraintes
Avec InnoDB, les cls trangres sont dclares. Les modications des donnes doivent conserver la cohrence. En cas dinsertion dune cl trangre sans cl primaire associe : Cannot add or update a child row : a foreign key constraint fails
p. 33
p. 34
Approche objet
p. 37
p. 38
Syntaxe simplie
SELECT expression FROM matable WHERE condition ; Une expression (et une condition) est compose de constantes : 3.14, chaine attributs : date, nom fonctions : CONCAT(nom, ,prenom) Exemples : SELECT * FROM commandes ; SELECT numcommande FROM commandes WHERE date>2006-01-01 ;
Quelques fonctions
oprateurs : = < > != * / + etc. la comparaison de texte est sans casse et sans accents (interclassement par dfaut) LIKE : chanes contenant un motif donn SELECT nom FROM clients WHERE prenom LIKE A%
p. 40
p. 39
Exercices
Sur la base facsys : 1. Trouver les articles de plus de 50 euros. 2. Lister les noms des articles, tris par prix. Les trier par catgorie, puis par stock pour une mme catgorie. 3. Quelle dirence entre SELECT nom, idcategorie, description FROM categories et SELECT * FROM categories ? 4. Acher toutes les commandes de 2004. Les 3 commandes les plus rcentes. 5. Que donne SELECT COUNT(*) FROM articles ? Quelle dirence avec SELECT COUNT(articles.codearticle) FROM articles ? 6. Combien darticles de squash a-t-on ?
Jointures
Le but : interroger plusieurs tables la fois Exemple :
SELECT articles.nom FROM articles JOIN categories ON articles.idcategorie = categories.idcategorie WHERE categories.nom = squash
Variantes SELECT a.nom FROM articles AS a JOIN categories AS c ON a.idcategorie=c.idcategorie WHERE c.nom LIKE squash SELECT a.nom FROM articles a JOIN categories c USING (idcategorie) WHERE c.nom = squash implicite : SELECT a.nom FROM articles a, categories c WHERE a.idcategorie = c.idcategorie AND c.nom = squash
p. 41
p. 42
Jointures : exemple
SELECT * nom Federer Nadal Ferrer FROM Joueurs id_pays 1 2 2 SELECT * FROM Pays id_pays 1 2 3 pays Suisse Espagne France
Exercices
1. Quels articles ont t commands par Pierre Durand ? 2. Combien darticles ont t expdis Paris ? 3. Lister les clients ayant command au moins deux fois. Ceux ayant command au moins trois articles dirents. 4. Acher tous les clients avec leurs articles associs. Avec seulement leur article le plus cher.
SELECT * FROM Pays JOIN Joueurs USING (id_pays) id_pays pays nom 1 Suisse Federer 2 Espagne Nadal 2 Espagne Ferrer
p. 43
p. 44
Impact
sur COUNT(col), mais pas sur COUNT(*)
p. 45
p. 46
GROUP BY : complments
Filtrage
WHERE avant le partitionnement HAVING dans chaque groupe cr par le GROUP BY
Si GROUP BY ... WITH ROLLUP, une ligne de total est ajoute Ex. : SELECT idcategorie, COUNT(*) AS nbarticles
FROM articles GROUP BY idcategorie WITH ROLLUP ;
p. 47
GROUP BY : TP
1. Acher les noms des catgories avec leur nombre de types darticles. 2. Ajouter au tableau prcdent le prix moyen des articles dune catgorie. 3. Insrer une nouvelle catgorie. Comment la faire apparatre avec son nombre darticles de 0 ? 4. Donner le prix de chacune des commandes passes. 5. Acher pour chaque client le prix de chacune de ses commandes et la dpense totale. 6. Lister dans lordre dcroissant les montants des commandes de plus de 100 euros. Quelle est la commande la moins chre ? 7. Acher pour chaque commande la liste des types darticle quelle contient (une ligne par commande).
INSERT
Insrer une ligne dans une table 2 syntaxes directes : INSERT INTO clients (idclient,nom,prenom) VALUES (SOR01,Sorel,Julien), ... Permet dinsrer plusieurs enregistrements ecacement INSERT INTO clients SET nom=Sorel, prenom=Julien Syntaxe commune avec UPDATE Si un champ na pas de valeur : sil est en AUTO_INCREMENT, il vaudra 1 de plus que le dernier (compteur interne) sinon, il prend la valeur par dfaut (souvent NULL ou )
p. 49
p. 50
INSERT. . . SELECT
But
Alimenter une table partir dune (ou plusieurs) autres INSERT INTO table [(col1, ...)] SELECT ...
Exemple
Cest Nol : cadeau promotionnel pour tous les clients qui ont pass une commande en 2008, sous la forme dune commande ctive gratuite, avec un cadeau unique rfrenc CAD08. 1. INSERT INTO commandes(idclient, date) SELECT DISTINCT idclient, 2008-12-25 FROM commandes WHERE date>=2008 2. INSERT INTO details(numcommande, numordre, codearticle, quantite, prix) SELECT c.numcommande, 1, CAD08, 1, 0.00 FROM commandes c WHERE c.date=2008-12-25
p. 51
p. 52
Suppression denregistrements
TRUNCATE
Supprime tout le contenu dune table Exemple : TRUNCATE TABLE matable ;
DELETE Exemples :
UPDATE clients SET codepostal=38000, ville=Grenoble WHERE (nom,prenom)=(Sorel,Julien) Ajouter 2 units aux articles dont le stock est moins de 5 UPDATE articles SET stock=stock+2 WHERE stock<5 Supprime des enregistrements (doc 12.2.2) DELETE FROM clients WHERE nom=Sorel LIMIT 1 ;
DELETE multi-tables
En cas de jointure dans le FROM, on insre entre DELETE et FROM la liste des tables cibles DELETE t1, t2 FROM t1 JOIN t2 JOIN t3 WHERE ...
Remarque :
Il existe une syntaxe de mise jour multi-tables (doc 12.2.11)
Exercice
Eacer de la table clients tous ceux qui nont jamais command
p. 53
p. 54
Les auto-jointures
possible de rfrencer plusieurs fois la mme table dans une requte SQL utilisation indispensable des alias (ex. : matable AS mt)
Les sous-requtes
http://dev.mysql.com/doc/refman/5.0/en/subqueries.html
Exemples
Acher tous les articles classs dans la mme catgorie que le tuba SELECT a1.codearticle, a1.nom, a1.prix FROM articles a1 JOIN articles a2 USING (idcategorie) WHERE a2.nom = "tuba" ; Acher tous les articles moins chers que le tuba SELECT a1.codearticle, a1.nom, a1.prix FROM articles a1 JOIN articles a2 ON (a1.prix < a2.prix) WHERE a2.nom = "tuba" ; Usages frquents : les hirarchies, graphes. . .
p. 55
3 types de rsultats dune sous-requte : rsultat scalaire : SELECT MAX(prix) FROM articles ; Quel est larticle le plus cher ? SELECT nom, codearticle, prix FROM articles WHERE prix=(SELECT MAX(prix) FROM articles) ; rsultat colonne : SELECT prix FROM articles ; Quels sont les articles jamais achets ? SELECT * FROM articles WHERE codearticle NOT IN (SELECT codearticle FROM details) ; (rem. NOT IN != ALL) rsultat table (obligatoirement dans un alias) Quel est le montant moyen des commandes ? SELECT AVG(montant) FROM (SELECT SUM(prix*quantite) AS montant FROM details GROUP BY numcommande) t1 ; Peu performant en MySQL, privilgier les jointures (doc F.3)
p. 56
Rponses
1. SELECT nom, codearticle, prix FROM articles ORDER BY prix DESC LIMIT 1 ; Inconvnient ? 2. SET @maxi=(SELECT MAX(prix) FROM articles) ; SELECT nom, codearticle, prix FROM articles WHERE prix=@maxi ; 3. SELECT nom, codearticle, prix FROM articles WHERE prix=(SELECT MAX(prix) FROM articles) ; 4. SELECT a1.codearticle, a1.nom, a1.prix FROM articles a1 LEFT JOIN articles a2 ON (a1.prix < a2.prix) WHERE a2.codearticle IS NULL ; 5. SELECT nom, codearticle, prix FROM articles WHERE prix >= ALL(SELECT prix FROM articles) ;
Exemples
(SELECT codearticle, prix FROM articles) UNION (SELECT codearticle, prix from details) ORDER BY prix ASC ;
p. 57
p. 58
Administration MySQL
p. 59
p. 60
Authentication
Des comptes ad-hoc, indpendants de lOS Un compte nest rien sans des attributions de privilges. Le login administrateur : root Pour changer le mot de passe root ( linstallation du serveur), 2 possibilits :
mysqladmin -u root password <secret> SET PASSWORD FOR root = PASSWORD(<secret>)
Puis DESCRIBE avec les tables : db, host, table-priv, column-priv En cas de modication directe dans la base mysql : FLUSH PRIVILEGES ; pour recharger les privilges.
p. 61
p. 62
TP Comptes et privilges
1. Se connecter en root, crer un compte local observateur avec permission sur SELECT mais pas de modier. Vrier avec SHOW GRANTS FOR ... (doc 13.5.3.9) 2. Se connecter en tant quobservateur. Lister ses privilges. mysql -u observateur -p 3. Dans les bases mysql et facsys, lister les tables, regarder le contenu dune table, et tenter un INSERT. 4. Ajouter toutes les permissions observateur sur la base facsys. Vrier les privilges, puis tester. 5. Utiliser PhpMyAdmin pour supprimer les droits globaux de observateur. Tester. Quen dduire ? 6. Tester GRANT ALL ON ... TO ... WITH MAX_CONNECTIONS_PER_HOUR 2 MAX_QUERIES_PER_HOUR 3 MAX_UPDATES_PER_HOUR 4 ;
Exemples
Tous les privilges sur une base : GRANT ALL ON mabase.* TO paul@%.cuefa.fr ; Cration du compte en mme temps quun privilge global : GRANT SELECT ON *.* TO nouveau@% IDENTIFIED BY secret ;
p. 63
p. 64
Le serveur MySQL
Dmarrage et arrt du serveur, selon lOS
Linux souvent via /etc/init.d/mysql Windows souvent un service, sinon via une interface ddie Parfois, manuellement : mysqld ou mysqld-nt (win)
mysqladmin
Interface dadministration en ligne de commande Exemple : (arrt dun serveur distant) mysqladmin -h machine -u root -p shutdown
p. 65
p. 66
Organisation en sections
client mysqld mysql mysqldump ... : : : : options options options options passes tous les clients passes au serveur spciques la console mysql spciques au client de dump
Syntaxe gnrale
"cl = valeur", ou parfois "cl", par exemple : key_buffer = 16M log
p. 68
p. 67
Variables gnralits
Noms alphanumriques Noms insensibles la casse (depuis 5.0) Porte
Globale Session (parfois hrite dune variable globale)
Variables systme
(5.1.5)
listes avec : SHOW VARIABLES [LIKE ...] ; de type : statique Quelques variables constantes aprs le dmarrage dynamique La plupart sont modiables avec SET de direntes portes :
globale : ex. connect_timeout locale (ou de session) : ex. autocommit ou les deux : ex. default_week_format = la variable session hrite de la variable globale
Type
Systme : @@var Utilisateur : @var
Sans prxe, MySQL suppose que la variable est du systme Dnies par la commande SET : SET @var := 1
p. 69
p. 70
log-error : les messages derreur du serveur Chaque variable indique le nom du chier o crire le log : log_slow_queries = /var/log/mysql/mysql-slow.log long_query_time = 1
p. 71
p. 72
TP Conguration et variables
1. Utiliser le paramtre language pour passer les messages derreurs du serveur en franais. 2. Quelle dirence entre les 2 paramtres du serveur : bind-address = 127.0.0.1 et skip-networking ? Exprimenter. 3. Sous Linux, utiliser les paramtres user et password pour pouvoir utiliser les clients (comme la console mysql) sans sauthentier. 4. Insrer une nouvelle catgorie dans la base facsys. Stocker le nouvel id (cl auto-incrmente) dans une variable MySQL. Utiliser cette variable pour insrer un nouvel article. 5. Activer le log sur les longues requtes. Produire plusieurs longues requtes avec la base INSEE. Par exemple, lister les 10 communes ayant connu le plus (le moins) de naissances cumules, ou le nombre de celles ayant eu 0 (1) naissance. Tester alors mysqldumpslow.
Import
LOAD DATA INFILE ...
p. 73
p. 74
Sauvegardes
Deux approches possibles : Sauvegarde binaire
copie des chiers mysqlhotcopy pour MyISAM
TP Sauvegardes
1. Utiliser mysqldump pour sauvegarder en SQL la base facsys. 2. Charger cette sauvegarde dans une base facsys_copy. 3. Essayer loption --xml pour mysqldump. 4. Essayer loption --skip-extended-insert. Pourquoi peut-elle tre utile ? 5. Faire une sauvegarde en 2 parties : schema et donnes. 6. Avec PhpMyAdmin, copier la base facsys. Passer les tables en InnoDB, puis dclarer les cls trangres (un index est ncessaire). Sauvegarder, vider et restaurer dans une nouvelle base. Trouver les bons rglages de PhpMyAdmin pour viter davoir une erreur.
+ rapide peu compatible (matriel, moteur SQL) attention aux modications en cours Sauvegarde textuelle (SQL)
mysqldump SELECT INTO OUTFILE
p. 75
p. 76
FLUSH et RESET
FLUSH HOSTS : vide le cache des htes (chgt IP) FLUSH LOGS : ferme et rouvre tous les chiers de logs FLUSH PRIVILEGES : relit les privilges dans la base mysql FLUSH QUERY CACHE : optimise le cache des requtes FLUSH STATUS : eace les variables de connexion (session) FLUSH TABLES [...] : vide le cache des tables... FLUSH TABLES WITH READ LOCK : idem + verrou en lecture FLUSH USER_RESOURCES : remet zro les quotas utilisateurs RESET QUERY CACHE : vide le cache des requtes mysqladmin flush-... : quivalent partiel en ligne de commande
p. 77
p. 78
Rplication
Principe
Synchroniser plusieurs serveurs MySQL
Fonctionnement
Modle matre/esclave : Les bases sont en lecture/criture sur le serveur-matre Les serveurs-esclaves sont des copies en lecture seule La rplication sur les esclaves se fait par les logs binaires
Pour aller plus loin. . . Vues, tables temporaires, jeux de caractres, moteurs de stockage, InnoDB
Intrt
Scurit Avec un matre en intranet et des esclaves publics Fiabilit Esclaves remplaables, et sauvegardent le matre Performance Possibilit de rpartir les requtes SQL sur plusieurs esclaves
p. 79
p. 80
Vues Gnralits
Concept
Vue = requte SELECT stocke, prsente comme une table (table dynamique).
Exemple
CREATE VIEW ClientsBref AS SELECT prenom, nom, idclient, ville FROM clients ; SELECT FROM ClientsBref ;
Commandes SQL
CREATE [OR REPLACE] VIEW vue AS ... ALTER VIEW DROP VIEW SHOW FULL TABLES [WHERE Table_type="VIEW"] SHOW CREATE VIEW
Inconvnients
La performance dune requte sur une vue est souvent excrable. = La vue est plus un outil dadministrateur que de dveloppeur
p. 81
p. 82
Vues Exemples
1. Dnir une vue Varticles qui contienne le nom complet de la catgorie de chaque article. 2. Dnir une vue Vcommandes qui augmente la table commande avec le nom du client, le nb de lignes de sa commande, et un champ montant. 3. Ajouter cette vue une colonne articles qui liste les articles de chaque commande sous la forme : "4 tuba, 2 bouteilles air". 4. Crer une vue Vclientsbref contenant lidentiant des clients, leur ville et le montant total de leurs commandes. Donner un utilisateur "stagiaire" le droit de consulter cette vue uniquement. 5. Dnir une vue Vsucces qui liste les articles les plus vendus (en units) dans lordre dcroissant. Le champ "vendu" vaudra 0 pour les articles jamais commands. 6. Acher le nombre de ventes par catgorie.
Clause ALGORITHM=...
MERGE vue remplace par sa dnition dans requte dappel TEMPTABLE utilisation dune table temporaire UNDEFINED MySQL fait le meilleur choix (MERGE si possible)
p. 83
p. 84
Vues modiables
Modier les donnes via une vue
Certaines vues acceptent des UPDATE, DELETE, INSERT si : La modication ne concerne quune seule table Chaque ligne de la vue se rfre une unique ligne de la table Nombreuses autres restrictions complexes cf doc 21.4.3 Updatable and Insertable Views Exemples : UPDATE Varticles SET nom=CONCAT(nom, *) WHERE categorie=squash ; : Query OK, 3 rows aected UPDATE Vsucces SET nom=CONCAT(nom, *) WHERE vendus>=5 : chec, GROUP BY incompatible !
Tables en mmoire
CREATE TABLE matable (...) ENGINE MEMORY ; existence limite la dure du serveur table partage entre tous les clients privilge ncessaire : CREATE TABLES
p. 85
p. 86
Internationalisation concepts
Au commencement tait lASCII
La manipulation du texte utilise 3 concepts : Le jeu de caractres utilis (character set) Exemples : Alphabet latin, Unicode Lencodage du texte (encoding) Exemples : latin1 (ISO-8859-1), UTF-8, UTF-16 La rgle dinterclassement (collation) Dtermine lordre de tri, le mode de comparaison, etc. Langlicisme collation est frquent. On emploie souvent abusivement charset pour encoding.
Francisation. . .
. . . des messages de MySQL
Changer la langue des messages derreur, etc. Paramtre du serveur : language=french Pas recommand !
Rappels
i18n Gestion de texte multilingue dans lapplication l10n Traduction de linterface utilisateur
p. 87
p. 88
Linterclassement (collation)
Rle
ordre alphabtique tendu pour comparaison, tri... classes de caractres quivalents, par ex. {e, , , , , E, . . .}
Impact sur
les oprateurs =, >, BETWEEN, LIKE. . . les commandes GROUP BY, ORDER BY On peut souvent changer localement la collation, par exemple : ORDER BY nom COLLATE utf8_turkish_ci
Principes de fonctionnement
plusieurs collations par jeu de caractre, dont 1 par dfaut nom de type charset_collation_var (ex. : utf8_general_ci) avec var { ci, cs, bin } = { sans casse, avec, pas de classes } possibilit dajouter au serveur une collation personnalise
p. 89
p. 90
En pratique et en rsum
la cration de la base, xer charset et collation par dfaut des tables (et ventuellement de la base) :
CREATE TABLE t1 (...) CHARACTER SET utf8 COLLATE utf8_general_ci ;
Internationalisation TP
1. Tester SHOW CHARACTER SET et SHOW COLLATION. 2. Dans une console mysql, acher actuelle la conguration du charset client. 3. Permuter son encodage client (latin1 utf8) 4. Tester un SELECT, un INSERT, et la fonction UPPER. Visualiser le rsultat de linsertion dans PhpMyAdmin. 5. Reprendre lencodage correct du client. Corriger lenregistrement mal encod grce UPDATE et aux fonctions BINARY et CONVERT( USING utf8). 6. Comment lister les clients venant de la ville Nmes (pas nme ou Nime) ?
Suivant les cas, adopter des valeurs direntes pour certains champs (mots de passe, identiants textuels. . .) :
CREATE TABLE t1 ( ref VARCHAR(8) CHARACTER SET ascii COLLATE ascii_bin
chaque connexion du client, dclarer lencodage souhait : SET NAMES latin1 ; Parfois lAPI le permet directement, sans SQL. Si on utilise DATE_FORMAT() et consort, les prcder dun : SET lc_time_names = fr_FR ; Relire la doc MySQL
p. 91
p. 92
Verrous - gnralits
LOCK TABLES nom-table [[AS] alias] lock-type [, nom-table [[AS] alias] lock-type] ... ( lock-type: READ | [LOW_PRIORITY] WRITE ) ... UNLOCK TABLES Priorit : WRITE > LOCAL > LOW_PRIORITY WRITE READ : empche lcriture ; tout le monde peut lire WRITE : empche tous les autres accs Notes
doit porter sur toutes les tables utilises, mme multiples privilge LOCK TABLE ncessaire en complment du SELECT sapplique aussi sur les vues pas de sens sur une table temporaire
Dverrouillages implictes
pose dun nouveau verrou dbut de transaction perte de connexion client - serveur
Attention aux interactions verrou - transactions FLUSH TABLES WITH READ LOCK : verrou global
prioritaire ncessite le privilge RELOAD
p. 93
p. 94
Particularits de MyISAM
limitations : ni cls trangres, ni transactions cache mmoire des index seulement index non plaant (B-Tree) stockage disque en 3 chiers par table : .frm (structure), .MYD (donnes), .MYI (index) tables et index trs compacts sur disque indexation spcique : FULLTEXT et SPATIAL
Memory tout le stockage en RAM ; perdu larrt serveur Archive prvu pour la journalisation = INSERT et SELECT seulement Merge fusion virtuelle de plusieurs tables MyISAM Maria (dv.) successeur prvu pour MyISAM Falcon (dv.) successeur prvus pour InnoDB
p. 95
p. 96
Particularits dInnoDB
Intgrit rfrentielle
Dnition des cls trangres CREATE TABLE table | ALTER TABLE table ADD [CONSTRAINT symb] FOREIGN KEY [i-fkey-id] (col1, ...) REFERENCES nom-table (col1, ...) [ON DELETE [RESTRICT | CASCADE | SET NULL ]] [ON UPDATE [RESTRICT | CASCADE | SET NULL ]]
RESTRICT rejette la modication, avec un message derreur CASCADE rpercute la modif sur la table rfrence SET NULL eectue laction et anNULLe la cl sur la table rfrenante
dclaration possible des cls trangres vrication de lintgrit rfrentielle support des transactions, avec 4 niveaux disolation utilisation dindex plaant (clustering) sur la cl primaire (B-Tree+) cache mmoire des donnes aussi stockage disque en un chier par table : .frm tables et index plus volumineux sur disque
p. 97
p. 98
Transactions
Thorie : proprits ACID pour les transactions Atomicit
rgle du tout ou rien sur une squence doprations inclut la rversibilit des opration
Transactions - utilisation
Cohrence
respect des rgles de cohrence aprs la transaction, quel que soit le rsultat
START TRANSACTION COMMIT [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [AND [NO] CHAIN] [[NO] RELEASE] SET AUTOCOMMIT = [0 | 1] Options :
CHAIN enchane immdiatement une autre transaction RELEASE coupe la connexion la n de la transaction
Isolation
les donnes dans un tat intermdiaire ne sont pas visibles des autres sessions assure la cohrence des donnes entre transactions minimise limpact sur les performances
Durabilit
une fois termine, la transaction ne peut tre remise en cause
p. 99 p. 100
Transactions - isolation
Commande SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL niveau Niveaux disolation, du plus faible au plus fort :
READ UNCOMMITTED accs en lecture aux autres transactions, o quon soit READ COMMITTED accs en lecture aux transactions valides REPEATABLE READ accs en lecture identique au premier SELECT de la transaction SERIALIZABLE comme prcdemment, mais tous les SELECT sont LOCK IN SHARE MODE
p. 101
p. 102
Caractristiques
apparues en MySQL 5.0 encore incomplet par rapport dautres SGBD langage procdural driv de SQL, sous-ensemble de SQL/PSM 2 types de routines (PS) : fonctions renvoient une valeur dans une expression, mais restrictions sur les oprations procdures ne sutilisent pas dans les expressions, mais ont une syntaxe plus riche
p. 103
p. 104
Procdures Exemples
mysql> CREATE PROCEDURE liste_clients () SELECT idclient, nom, prenom FROM clients ; mysql> CALL liste_clients ();
CREATE PROCEDURE cadeau (IN idbonclient CHAR(6)) COMMENT ajoute au client une commande gratuite pour 1 CAD09 BEGIN DECLARE nouv_numcommande INT DEFAULT 0; DECLARE nbclients INT DEFAULT 0; SELECT COUNT() INTO nbclients FROM clients WHERE idclient=idbonclient IF nbclients = 1 THEN INSERT INTO commandes (idclient, date) VALUES (idbonclient, NOW()); SET nouv_numcommande = LAST_INSERT_ID(); INSERT INTO details VALUES (nouv_numcommande, 0, CAD09, 1, 0.0); SELECT Oert; ELSE SELECT Erreur; END IF; END//
p. 105
p. 106
p. 107
p. 108
p. 109
p. 110
Procdures TP
Fonctions Prsentation
Les fonctions internes MySQL sont ROUND(), UPPER(), etc. Les fonctions utilisateur sont similaires : Utilises dans les expressions (et non avec CALL) Renvoient une valeur scalaire, mais nachent rien Pas de modication des paramtres Syntaxe de dclaration trs proche des procdures
1. Dnir une procdure cumul qui retourne le montant cumul ET le nombre darticles commands. 2. Dnir une procdure modes qui ache la valeur la plus frquente de la colonne prix de la table articles. 3. Ajouter un paramtre de sortie qui indique le nombre de ces valeurs. 4. Dnir une procdure qui ache la mdiane dune liste de valeurs (telle que la moiti des lments soit au-dessus). Plusieurs mthodes sont possibles.
Exemple
mysql> CREATE FUNCTION abrege (texte VARCHAR(255)) RETURNS VARCHAR(30) RETURN CONCAT( LEFT(texte,27), ... ) ; mysql> SELECT abrege(Cette phrase est trop longue !) ;
p. 111
p. 112
Fonctions - syntaxe
CREATE FUNCTION nomfonc ([para1 type1, para2 type2...]) RETURNS type LANGUAGE SQL | [NOT] DETERMINISTIC | {CONTAINS SQL | NO SQL | {READS | MODIFIES} SQL DATA} | SQL SECURITY { DEFINER | INVOKER } | COMMENT chaine [label:] BEGIN ... RETURN <valeur> ... END [label] SHOW FUNCTION STATUS ; SHOW CREATE FUNCTION nomfonc ; variable systme login_bin_trust_function_creators
Fonctions - exemples
Fonctions simples
Ecrire une fonction Majuscule qui prend une chane, et la retourne en minuscules, sauf la premire lettre en majuscules. A laide de la prcdente, crire une fonction PreNom, qui prend deux chanes et ache "Prnom Nom" bien typographis.
Fonctions requtes
Ecrire une fonction MontantCumule qui retourne le montant total command par un client de la base facsys. partir du nom dun nouveau client, retourner un nouveau idclient unique (rappel : 3 premiers caractres du nom, suivis dun numro, par ex. DUR005).
p. 113
p. 114
CASE valeur [ WHEN valeur1 THEN ... ; ] [ ELSE ...; ] END CASE
xN
xN
Les chappements
LEAVE label : quitte la boucle ITERATE label : recommence la boucle
p. 116
Curseurs
Curseurs - exemple
Gnralits
Autoriss lintrieur des routines : procdures, fonctions, triggers Passage un parcours classique dune liste de rsultats : boucle sur les lignes Chaque curseur est associ un SELECT
Dnir une procdure qui ache la somme des montants des N articles les plus chers et la somme totale du stock correspondant Dnir une fonction qui ache la mdiane dune liste de valeurs
Commandes
DECLARE mon-curseur CURSOR FOR SELECT... OPEN mon-curseur FETCH mon-curseur INTO var1, var2, ... CLOSE mon-cuseur
p. 117
p. 118
DECLARE nom-condition CONDITION FOR valeur-condition valeur-condition: SQLSTATE valeur | mysql-code-erreur Faon de dnir un alias pour une erreur ou une famille derreurs.
p. 119
p. 120
Implmenter une fonction maximum avec plafond sur les prix des articles : ne prend pas en compte les valeurs suprieures au plafond donn en paramtre.
p. 121
p. 122
Dclencheurs (Triggers)
But : dclencher une action complmentaire lors de la modication (Insert, Delete, Update) dun enregistrement dans une table. CREATE TRIGGER nom t-moment t-modif ON table FOR EACH ROW instruction ; | FOR EACH ROW BEGIN ... END ; t-moment = BEFORE | AFTER t-modif = INSERT | UPDATE | DELETE Complment : DROP TRIGGER [IF EXISTS] nom et SHOW TRIGGERS Valeurs : NEW.champ (Insert, Update) = modiable OLD.champ (Delete, Update) = lecture seule.
Triggers - Exemples
Gestion du stock des articles lors de la commande : CREATE TRIGGER majstock AFTER INSERT ON facsys.details FOR EACH ROW UPDATE articles SET stock := stock - NEW.quantite WHERE codearticle=NEW.codearticle ; Faire un compteur des montants et des commandes du jour (variable session). Si on commande des balles de squash : 5 au minimum. Ex. courant : journalisation des actions critiques sur une table Ex. : dnir une valeur par dfaut dynamique pour une colonne. Ex. 75 = Paris.
p. 123
p. 124
En rsum
Variables utilisateurs
ex. @var
(doc 8.4)
Aectation
Aectation directe
SET @a := 4, @b := "Dupont" ; SET @c := LEFT(@b, @a) ;
p. 125
p. 126
Commandes prpares
Contexte dutilisation normal
API pour les langages prvus :
natifs : C, Java (Connector/J), .NET surcouches lAPI C : mysqli (PHP)...
Usages
Optimisation : requte paramtres, prcompile sur le serveur Mta-programmation : construction dune requte en SQL
Utilisation dune chane quelconque pour crer un PREPARE
Exemple
PREPARE clientsNom FROM "SELECT nom, prenom, ville FROM clients WHERE Nom > ? " ; SET @nomdeb := "E" ; EXECUTE clientsNom USING @nomdeb ;
p. 127 p. 128
Optimisation ct serveur
Matriel
RAM Disques durs rapides
Buers
Adapter la taille des buers de MySQL key_buer_size = 256M read_buer_size = 1M max_allowed_packet = 16M
Cache
Augmenter la taille des caches query_cache_size=64M query_cache_type=1 query_cache_limit=256K
p. 129
p. 130
Les index
Gnralits
porte sur une ou plusieurs colonnes de la table possde un nom distinctif (PRIMARY pour la cl primaire)
Index
Permet MySQL de trouver rapidement une valeur Cl primaire = index Cl trangre = index (presque toujours) Contrainte dunicit UNIQUE = index
p. 131
p. 132
Index - utilisation
Dsactivation temporaire pour insertion massive
ALTER TABLE table DISABLE KEYS; ... ALTER TABLE table ENABLE KEYS;
Utilisation courante
utilisation automatique pour JOIN, ORDER... (cf EXPLAIN) utilisation force sur JOIN, ex. : SELECT * FROM t1 USE INDEX (col1, col2) indication = USE | IGNORE | FORCE
2. Optimisation
utilise le dictionnaire : index, taille des tables... produit le plan dexcution (arbre)
Cache dindex
CACHE INDEX LOAD INDEX INTO CACHE
p. 133
p. 134
EXPLAIN - syntaxe
EXPLAIN SELECT ... ; EXPLAIN EXTENDED SELECT ... ; SHOW WARNINGS ; ne sapplique qu SELECT = reformuler les UPDATE, INSERT... EXPLAIN : ache une vue du plan dexcution EXPLAIN EXTENDED : reconstruit un SQL canonique EXPLAIN SELECT * from articles WHERE prix >50.0 \G limites et imprcisions dEXPLAIN
Oprations bloquantes :
tris : ORDER BY ddoublonnage : DISTINCT certaines fonctions daggrgation globales : MIN(), MAX(), SUM()... partitionnement : GROUP BY
Arbre dexcution
p. 135
p. 136
EXPLAIN - colonnes
colonnes dEXPLAIN id le numro de SELECT dans la requte select_type type de SELECT, simple ou complexe... table la table concerne, ou lalias type le type daccs cette table choisi par MySQL possible_keys les cls utilisables ( premire vue) key la cl choisie par MySQL pour lopration key_len la longueur de cl utilise en octets ref la colonne rfrence par la cl choisie rows nombre de lignes parcourues (estimation) Extra infos complmentaires, selon champs prcdents
le SELECT ne contient ni sous-requte ni UNION requte principale sous-requte autre quapparaissant dans le FROM sous-requte apparaissant dans le FROM 2e partie (et suivantes) dune UNION encapsule tous les SELECT dune UNION
p. 137
p. 138
parcourt toutes les lignes de la table () parcourt toutes les lignes dans lodre de lindex (Extra=Using index) parcourt tout lindex parcourt un intervalle dindex accs index direct - valeurs multiples possibles accs index direct - au plus une valeur de retour remplac par une constante dans loptimiseur rsolu immdiatement par loptimiseur
colonne keys
souvent une cl de la liste parfois aucune ne convient = NULL parfois une cl extrieure la premire liste
colonne key_len
longueur utilise en octets si cl multicolonnes, peut tre infrieure au total
p. 139
p. 140
ANALYZE TABLE table ; que peut-on prvoir comme optimisation de la strucure de communes ?
colonne Extra Using Using Using Using index where temporary lesort utilise un index couvrant : vite laccs la table post-ltrage des lignes retournes utilisation dune table temporaire (tri...) tri externe, en mmoire ou sur disque
p. 141
p. 142
Benchmark
Commande BENCHMARK
Proling
Recherche des tapes longues dans un processus Limite une valuation dexpression Limite lexcution de la requte par le serveur Exemples SET @input := "mon mot de passe secret"; SELECT BENCHMARK(1000000, MD5(@input)); SELECT BENCHMARK(1000000, SHA1(@input)); SELECT BENCHMARK(10,(SELECT MAX(naiss) FROM naissances)); SELECT BENCHMARK(10,(SELECT @v:=MAX(naiss) FROM naissances)); Analyse a posteriori utiliser log-slow-queries Analyse en direct : commandes SQL
SET @@profiling :=1 ; SHOW PROFILES ; SHOW PROFILE [ ALL ] FOR QUERY ... ; types : BLOCK IO, CPU, MEMORY, PAGE FAULTS, SWAPS... paramtre : profiling_history_size (=15)
p. 143
p. 144
Bibliographie complmentaire
MySQL Reference Manual 5.0, AB Soft (plus complet en anglais) Matriser MySQL 5, OReilly France (2005), Darmaillac et Rigaux MySQL Cookbook, 2nd Ed (2006), OReilly MySQL Stored Procedure Programming (2006-03), OReilly High Performance MySQL, 2nd Ed. (2008-06), OReilly Expert MySQL 5, Apress (2007-01)
p. 145
p. 146
Informations utiles
Licence
Pour garder le contact : francois.gannaz@silecs.info Les documents utiliss sont disponibles en ligne : http://silecs.info/dld/MySQL/ Transparents noncs et corrections des exercices
Permission vous est donne de copier, distribuer et/ou modier ce document selon les termes de la Licence GNU Free Documentation License, Version 2.0 ou ultrieure publie par la Free Software Foundation ; pas de section inaltrable ; pas de texte inaltrable de premire page de couverture ; texte inaltrable de dernire page de couverture : Auteurs : Franois Gannaz, Guillaume Allgre, SILECS