Go to the first, previous, next, last section, table of contents.


1 Informations générales

Le logiciel MySQL (TM) est un serveur de base de données SQL très rapide, multi-threadé, multi-utilisateur et robuste. Le serveur MySQL est destiné aux missions stratégiques et aux systèmes de production à forte charge, ainsi qu'à l'intégration dans des logiciels déployés à grande échelle. MySQL est une marque déposée de MySQL AB.

Le logiciel MySQL dispose de deux licenses. Les utilisateurs peuvent choisir entre utiliser MySQL comme un logiciel Open Source/Logiciel libre, sous les termes de la licence GNU General Public License (http://www.gnu.org/licenses/) ou bien, ils peuvent acheter une licence commerciale auprès de MySQL AB. See section 1.4 Support MySQL et licences.

Le site web de MySQL (http://www.mysql.com/) fournit les dernières informations sur le serveur MySQL.

La liste suivante décrit les sections particulières de ce manuel :

Important:

Les rapports d'erreurs (aussi appelés bogues), ainsi que les questions et commentaires, doivent être envoyés à la liste de diffusion mysql@lists.mysql.com. See section 1.7.1.3 Comment rapporter un bogue ou un problème.

Le script mysqlbug doit être utilisé pour générer le rapport de bogues. Pour les distributions sources, le script mysqlbug est accessible dans le dossier `scripts'. Pour les distributions binaires, mysqlbug est installé dans le dossier `bin' (`/usr/bin' pour le package RPM du serveur MySQL).

Si vous avez trouvé un problème de sécurité critique dans le code du serveur MySQL, vous devez envoyez un email à security@mysql.com.

1.1 A propos du manuel

Ceci est le manuel de référence de MySQL; il documente MySQL jusqu'à la version 5.0.0-alpha. Les évolutions fonctionnelles sont toujours indiquées avec une référence à la version d'évolution, de manière à ce que ce manuel soit toujours valable, même si vous utilisez une ancienne version de MySQL. Etant un manuel de référence, il ne fournit aucune description générale sur le langage SQL ou les concepts de bases de données relationnelles.

Comme le logiciel de base de données MySQL est en développement constant, ce manuel es mis à jour fréquemment. La version la plus récente est disponibles à http://www.mysql.com/documentation/ en différents formats, incluant HTML, PDF et Windows HLP.

L'original du document est un fichier au format Texinfo. La version HTML est produite automatiquement avec une version modifiée de texi2html. La version en texte plein et version Info sont produites par makeinfo. La version PostScript est produite avec texi2dvi et dvips. La version PDF est produite avec pdftex.

Si vous avez du mal à trouver des informations dans ce manuel, vous pouvez essayer notre version avec moteur de recherche, sur notre site web : http://www.mysql.com/doc/.

Si vous avez des suggestions concernant des ajouts ou des corrections à ce manuel, vous pouvez les envoyez à l'équipe de documentation à docs@mysql.com.

Ce manuel a été écrit initialement par David Axmark et Michael (Monty) Widenius. Il est actuellement entretenu par Michael (Monty) Widenius, Arjen Lentz et Paul DuBois. Pour les autres contributeurs, voyez les section B Crédits.

La traduction de ce manuel a été faite sous la direction de Damien Seguy, et organisée par Mehdi Achour. David Manusset, Guillaume Plessis, Patrick Haond, Sylvain Maugiron et Yannick Torres ont contribué largement à cette traduction et son entretien.

Le copyright (2002) de ce manuel est la propriété de la société suédoise MySQL AB. See section 1.4.2 Copyrights et licences utilisées par MySQL.

1.1.1 Conventions utilisées dans ce manuel

Ce manuel utilise certaines conventions typographiques :

constant
La police à largeur fixe est utilisée pour les noms de commandes et les options, les requêtes SQL, les noms de bases de données, de tables et de colonnes, le code C et Perl, les variables d'environnement. Par exemple, ``Pour voir comment mysqladmin fonctionne, exécutez-le avec l'option --help.''
`filename'
La police à largeur fixe avec des guillemets d'encadrement indique des noms de fichiers et de chemins de dossiers. Par exemple : ``La distribution est installée dans le dossier `/usr/local/'.''
`c'
La police à largeur fixe avec des guillemets d'encadrement est aussi utilisée pour indiquer des séquences de caractères. Par exemple : ``Pour spécifier un caractère joker, utilisez le caractère `%'.''
italic
Les polices en italique sont utilisées pour attirer l'attention, comme ceci.
boldface
Le gras est utilisé pour les entêtes de tables, et aussi pour attirer fortement votre attention.

Lorsque les commandes qui sont affichées sont destinées à être exécutées par un programme particulier, le nom du programme est indiqué dans l'invite de la commande. Par exemple, shell> indique une commande que vous exécutez depuis votre console shell, et mysql> indique une commande que vous exécutez depuis le client mysql :

shell> tapez une commande shell ici
mysql> tapez une requête SQL ici

Les commandes shell sont affichées en utilisant la syntaxe du Bourne. Si vous utilisez le style csh-shell, vous aurez peut être a adapter légèrement les commandes. Par exemple, la syntaxe de modification d'une variable et d'exécution d'une commande ressemble à ceci en Bourne shell :

shell> NOMVAR=valeur une_commande

En csh, vous auriez a exécuter la commande suivante :

shell> setenv NOMVAR valeur
shell> une_commande

Souvent, les noms de bases de données, tables ou colonnes doivent être remplacés dans les commandes. Pour indiquer qu'une telle substitution est nécessaire, ce manuel utilise les noms de nom_de_base, nom_de_table et nom_colonne. Par exemple, vous pourriez avoir une requête comme ceci :

mysql> SELECT nom_colonne FROM nom_de_base.nom_de_table;

Cela signifie que si vous devez saisir une requête semblable, vous devriez utiliser votre propre nom de colonne, table et base de données, ce qui pourrait se traduire par ceci :

mysql> SELECT author_name FROM biblio_db.author_list;

Les mot réservés SQL ne sont pas sensibles à la casse, et peuvent être écrits en majuscules ou minuscules. Ce manuel utilise les majuscules.

Dans les illustrations de syntaxe, les crochets (`[' et `]') sont utilisés pour indiquer des clauses ou mots optionnels. Par exemple, dans la requête suivante, IF EXISTS est optionnel :

DROP TABLE [IF EXISTS] nom_de_table

Lorsqu'un élément de syntaxe est constitué d'un certain nombre d'alternatives, les alternatives sont séparées par des barres verticales (`|'). Lorsqu'un membre d'un tel jeu de possibilités peut être choisi, les alternatives sont listées entre crochets (`[' et `]'):

TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str)

Lorsqu'un élément d'un jeu de possibilités doit être choisi, les alternatives sont placées entre accolades (`{' et `}'):

{DESCRIBE | DESC} nom_de_table {nom_colonne | wild}

1.2 Qu'est ce que MySQL?

MySQL, le plus populaire des serveurs de bases de données SQL Open Source, est développé, distribué et supporté par MySQL AB. MySQL AB est une société commerciale, fondée par les développeurs de MySQL, qui développent leur activité en fournissant des services autour de MySQL. section 1.3 Qui est MySQL AB ?

Le site web de MySQL (http://www.mysql.com/) fournit les toutes dernières actualités sur le logiciel MySQL et sur la société MySQL AB.

MySQL est un système de gestion de bases de données.
Une base de données est un ensemble organisé de données. Cela peut aller d'une simple liste de courses au supermarché à une galerie de photos, ou encore les grands systèmes d'informations des multi-nationales. Pour ajouter, lire et traiter des données dans une base de données, vous avez besoin d'un système de gestion de bases de données tel que le serveur MySQL. Comme les ordinateurs sont très bons à manipuler de grandes quantités de données, le système de gestion de bases de données joue un rôle central en informatique, aussi bien en tant qu'application à part entière, qu'intégré dans d'autres logiciels.
MySQL est un serveur de bases de données relationnel.
Un serveur de bases de données stocke les données dans des tables séparées plutôt que de tout rassembler dans une seule table. Cela améliore la rapidité et la souplesse de l'ensemble. Les tables sont reliées par des relations définies, qui rendent possible la combinaison de données entre plusieurs tables durant une requête. Le SQL dans ``MySQL'' signifie ``Structured Query Language'' : le langage standard pour les traitements de bases de données.
MySQL est Open Source.
Open Source (Standard Ouvert) signifie qu'il est possible à chacun d'utiliser et de modifier le logiciel. Tout le monde peut télécharger MySQL sur Internet, et l'utiliser sans payer aucun droit. Toute personne en ayant la volonté peut étudier et modifier le code source pour l'adapter à ses besoins propres. Le logiciel MySQL utilise la licence GPL (GNU General Public License), http://www.gnu.org/licenses/, pour définir ce que vous pouvez et ne pouvez pas faire avec ce logiciel, dans différentes situations. Si vous ne vous sentez pas confortable avec la licence GPL ou bien que vous devez intégrer MySQL dans une application commerciale, vous pouvez acheter une licence commercial auprès de MySQL AB. See section 1.4.3 Licences MySQL.
Pourquoi utiliser le serveur de bases de données MySQL?
Le serveur de bases de données MySQL est très rapide, fiable et facile à utiliser. Si c'est ce que vous recherchez, vous devriez faire un essai. Le serveur de bases de données MySQL dispose aussi de fonctionnalités pratiques, développées en coopération avec nos utilisateurs. Vous pouvez trouver une comparaison des performances du serveur MySQL avec d'autres systèmes de bases de données dans nos pages de tests de performances. See section 5.1.4 La suite de tests MySQL. Le serveur MySQL a été développé à l'origine pour gérer de grandes bases de données plus rapidement que les solutions existantes, et a été utilisé avec succès dans des environnements de production très contraints et très exigeants, depuis plusieurs années. Bien que toujours en développement, le Le serveur MySQL offre des fonctions nombreuses et puissantes. Ses possibilités de connexions, sa rapidité et sa sécurité font du serveur MySQL une serveur hautement adapté à Internet.
Les caractéristiques techniques du serveur MySQL.
Pour des détails techniques avancés, voyez section 6 Référence du langage MySQL. Le logiciel de bases de données MySQL est un système client/serveur, constitué d'un serveur SQL multi-threadé qui supporte différents systèmes de stockage, plusieurs logiciels clients et librairies, outils d'administration, ainsi que de nombreuses interfaces de programmation (des API). Nous fournissons aussi le serveur MySQL sous la forme d'une librairie multi-threadé que vous pouvez inclure dans vos applications, pour obtenir un produit plus compact, plus rapide et plus facile à gérer.
Il existe un grand nombre de contributions à MySQL.
Il est très probable que vous pourrez trouver votre éditeur préféré ou que votre environnement de programmation supporte déjà le serveur de base de données MySQL.

La prononciation officielle de MySQL est ``My Ess Que Ell'' (en anglais), ce qui donne ``Maille Esse Cu Elle'' en phonétique française. Evitez d'utiliser la prononciation ``my sequel'', mais nous ne nous formaliserons pas que vous utilisiez ``my sequel'' ou une autre prononciation adaptée.

1.2.1 Histoire de MySQL

Nous avons débuté avec l'intention d'utiliser mSQL pour se connecter à nos tables en utilisant nos propres routines bas niveau ISAM. Cependant, après quelques tests, nous sommes arrivés à la conclusion que mSQL n'était pas assez rapide et flexible pour nos besoins. Cela nous a conduit à créer une nouvelle interface SQL pour notre base de données, mais en gardant la même API que mSQL. Cette API a été choisie pour la facilité de port des programmes de tiers.

Les liens avec le nom MySQL ne sont pas parfaitement établis. Notre dossier de base et un grand nombre de librairies et outils étaient préfixés par ``my'' depuis plus de 10 ans. Mais la fille de Monty, plus jeune que lui, était aussi appelée My. Lequel des deux a conduit au nom de MySQL est toujours un mystère, même pour nous.

Le nom du dauphin MySQL (notre logo) est Sakila, qui a été choisi par les fondateurs de MySQL AB à partir d'une grande liste de noms suggérés par les utilisateurs dans le concours "Name the Dolphin" ("Nommez le dauphin"). Le nom a été suggéré par Ambrose Twebaze, un développeur de softwares open source de Swaziland, Afrique. D'après Ambrose, le nom Sakila puise ses origines du SiSwati, la langue locale du Swaziland. Sakila est aussi le nom d'une ville dans Arusha, Tanzanie, près du pays d'origine d'Ambrose, Uganda.

1.2.2 Les fonctionnalités principales de MySQL

La liste suivante décrit les caractéristiques principales du logiciel de bases de données MySQL. See section 1.5 MySQL 4.0 In A Nutshell.

Interne et portabilité
Column Types
Commandes et fonctions
Securité
Charges supportées et limites
Connectivité
Traductions
Clients et utilitaires

1.2.3 Jusqu'à quel point MySQL est il stable ?

Cette section répond aux questions ``Jusqu'à quel point MySQL est il stable ?'' et ``Puis-je faire confiance à MySQL pour mon projet ?'' Nous allons tenter d'apporter des réponses claires à ces questions importantes qui concernent tous les utilisateurs potentiels. Les informations de cette section sont fournies par les listes de diffusions, qui sont très actives et promptes à identifier les problèmes et les rapporter.

Le code original date du début des années 80 et fournit une base de code stable, tout en assurant une compatibilité ascendante avec le format ISAM. A TcX, le prédécesseur de MySQL AB, le code de MySQL a fonctionné sur des projets depuis la mi 1996, sans aucun problème. Lorsque le Serveur MySQL a été livré à un public plus large, nous avons réalisé qu'il contenait du code ``jamais testé'' qui a été rapidement identifié par les utilisateurs, qui effectuait des requêtes différentes des nôtres. Chaque nouvelle version avait moins de problèmes de portabilité, même si chaque nouvelle version avait de nombreuses nouvelles fonctionnalités.

Chaque version du Serveur MySQL était parfaitement fonctionnelle. Les seuls problèmes étaient rencontrés par les utilisateurs de code de ces ``zone d'ombres''. Naturellement, les nouveaux utilisateurs ne connaissent pas ces zones : cette section tente de les présenter, dans la mesure de nos connaissances. Les descriptions correspondent surtout aux versions 3.23 du Serveur MySQL. Tous les bogues connus et rapportés ont été corrigés dans la dernière version, à l'exception de ceux qui sont listés dans la section Bugs, qui sont des problèmes de conception. See section 1.8.5 Erreurs connues, et limitations de MySQL.

La conception du serveur MySQL est faite en plusieurs couches, avec des modules indépendants. Certains des modules les plus récents sont listés ici, avec leur niveau de test :

Réplication -- Gamma
De grands serveurs en grappe utilisant la réplication sont en production, avec de bons résultats. L'amélioration de la réplication continue avec MySQL 4.x.
Tables InnoDB -- Stable (en 3.23 depuis 3.23.49)
Le gestionnaire transactionnel de tables InnoDB a été déclaré stable en MySQL version 3.23, à partir de la version 3.23.49. InnoDB est utilisé dans de grands systèmes complexes, avec forte charge.
Tables BDB -- Gamma
Le code de Berkeley DB est très stable, mais nous sommes encore en train d'améliorer l'interface du gestionnaire transactionnel de table BDB du serveur MySQL. Cela demande encore du temps pour qu'il soit aussi bien testé que les autres types de tables.
FULLTEXT -- Beta
La recherche en texte plein fonctionne mais n'est pas encore largement adoptée. Des améliorations importantes sont prévues pour MySQL 4.0.
MyODBC 2.50 (utilise ODBC SDK 2.5) -- Gamma
En utilisation croissante. Certains problèmes sont apparus avec des applications tierces, et indépendemment du pilote ODBC ou du serveur utilisé.
Tables à restauration automatique MyISAM -- Gamma
Ce statut ne concerne que le nouveau code du gestionnaire de tables MyISAM qui vérifie si la table a été correctement fermée lors de l'ouverture, et qui exécute automatiquement la vérification et réparation éventuelles de la table.
Insertions de masse -- Alpha
Nouvelle fonctionnalité des tables MyISAM pour MySQL 4.0 qui permet des insertions plus rapides.
Verrouillage -- Gamma
Cette fonctionnalité est très dépendante du système. Sur certains systèmes, il y a de gros problèmes lors de l'utilisation du verrouillage système (avec la fonction fcntl()). Dans ces cas, il faut utiliser mysqld avec l'option --skip-external-locking. Les problèmes sont connus sur certaines distributions Linux, et sur SunOS lorsqu'il est utilisé avec des disques en mode NFS.

MySQL AB fournit un support de première qualité pour les clients payant, mais les listes de diffusions de MySQL sont généralement rapides à donner des réponses aux questions les plus communes. Les bogues sont généralement corrigés aussitôt avec un patch. Pour les bogues sérieux, il y a presque toujours une nouvelle version.

1.2.4 Quelles tailles de tables supporte MySQL ?

MySQL version 3.22 a une limite de 4Go par table. Avec le nouveau format de table MyISAM, disponible avec MySQL version 3.23, la taille maximale des tables a été poussée à 8 millions de teraoctets (2 ^ 63 octets).

Notez, toutefois, que les systèmes d'exploitation ont leur propres limites. Voici quelques exemples :

Système d'exploitation Limite
Linux-Intel 32 bit 2Go, 4Go ou plus, suivant la version de Linux
Linux-Alpha 8To (?)
Solaris 2.5.1 2Go (4Go possibles avec un patch)
Solaris 2.6 4Go (peut être modifié avec une option)
Solaris 2.7 Intel 4Go
Solaris 2.7 UltraSPARC 512Go

En Linux 2.2, vous pouvez avoir des tables plus grandes que 2Go en utilisant le patch LFS pour les systèmes de fichiers ext2. En Linux 2.4, le patche existe aussi pour ReiserFS.

Cela signifie que les tables MySQL sont généralement limitées par le système d'exploitation.

Par défaut, les tables MySQL peuvent atteindre une taille de 4Go. Vous pouvez vérifier la taille des tables avec la commande SHOW TABLE STATUS ou la commande en ligne myisamchk -dv nom_de_table. See section 4.5.6 Syntaxe de SHOW.

Si vous avez besoin de tables plus grandes que 4Go (et que votre système d'exploitation le supporte, modifiez les paramètres AVG_ROW_LENGTH et MAX_ROWS lorsque vous créez votre table. See section 6.5.3 Syntaxe de CREATE TABLE. Vous pouvez aussi les modifier ultérieurement avec ALTER TABLE. See section 6.5.4 Syntaxe de ALTER TABLE.

Si vos tables sont accessibles uniquement en lecture, vous pouvez aussi utiliser l'utilitaire myisampack pour rassembler et compresser plusieurs tables en une seule. myisampack compresse généralement la table de près de 50%, ce qui vous augmente d'autant la taille maximale de la table. See section 4.7.4 myisampack, le générateur de tables MySQL compressées en lecture seule.

Vous pouvez aussi contourner les limites du système d'exploitation avec les tables MyISAM, en utilisant l'option RAID. See section 6.5.3 Syntaxe de CREATE TABLE.

Une autre solution est d'utiliser la librairie MERGE, qui permet de gérer plusieurs tables comme une seule. See section 7.2 Tables assemblées MERGE.

1.2.5 Compatibilité an 2000

Le serveur MySQL lui même n'a aucun problème de compatibilité avec l'an 2000 (Y2K) :

Vous pouvez rencontrer des problèmes avec les applications qui utilisent le serveur MySQL sans être compatible avec l'an 2000. Par exemple, les vieilles applications utilisent des valeurs d'années sur deux chiffres (ce qui est ambigu), plutôt qu'avec 4 chiffres. Ce problème peut être complété par des applications qui utilisent des valeurs telles que 00 ou 99 comme indicateur de données ``manquante''.

Malheureusement, ces problèmes peuvent se révéler difficiles à corriger car différentes applications peuvent être écrites par différents programmeurs, et chacun utilise un jeu différent de conventions et de fonctions de gestion des dates.

Voici une illustration simple qui montre que le serveur MySQL n'a aucun problème avec les dates jusqu'en 2030 :

mysql> DROP TABLE IF EXISTS y2k;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE y2k (date DATE,
    ->                   date_time DATETIME,
    ->                   time_stamp TIMESTAMP);
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO y2k VALUES
    -> ("1998-12-31","1998-12-31 23:59:59",19981231235959),
    -> ("1999-01-01","1999-01-01 00:00:00",19990101000000),
    -> ("1999-09-09","1999-09-09 23:59:59",19990909235959),
    -> ("2000-01-01","2000-01-01 00:00:00",20000101000000),
    -> ("2000-02-28","2000-02-28 00:00:00",20000228000000),
    -> ("2000-02-29","2000-02-29 00:00:00",20000229000000),
    -> ("2000-03-01","2000-03-01 00:00:00",20000301000000),
    -> ("2000-12-31","2000-12-31 23:59:59",20001231235959),
    -> ("2001-01-01","2001-01-01 00:00:00",20010101000000),
    -> ("2004-12-31","2004-12-31 23:59:59",20041231235959),
    -> ("2005-01-01","2005-01-01 00:00:00",20050101000000),
    -> ("2030-01-01","2030-01-01 00:00:00",20300101000000),
    -> ("2050-01-01","2050-01-01 00:00:00",20500101000000);
Query OK, 13 rows affected (0.01 sec)
Records: 13  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM y2k;
+------------+---------------------+----------------+
| date       | date_time           | time_stamp     |
+------------+---------------------+----------------+
| 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 |
| 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 |
| 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 |
| 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 |
| 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 |
| 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 |
| 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 |
| 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 |
| 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 |
| 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 |
| 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 |
| 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 |
| 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 |
+------------+---------------------+----------------+
13 rows in set (0.00 sec)

Cet exemple montre que les types DATE et DATETIME ne poseront aucun problème avec les dates futures (ils gèrent les dates jusqu'en 9999).

Le type TIMESTAMP, qui est utilisé pour stocker la date courante, est valide jusqu'en 2030-01-01. TIMESTAMP va de 1970 en 2030 sur les machines 32 bits (valeur signée). Sur les machines 64 bits, il gère les dates jusqu'en 2106 (valeur non signée).

Même si le serveur MySQL est compatible an 2000, il est de votre responsabilité de fournir des données non ambiguës. Voyez section 6.2.2.1 An 2000 et les types date pour les règles du serveur MySQL pour traiter les dates ambiguës (les données contenant des années exprimées sur deux chiffres).

1.3 Qui est MySQL AB ?

MySQL AB est l'entreprise des fondateurs de MySQL et les principaux développeurs. A l'origine, MySQL AB a été établie en Suède, par David Axmark, Allan Larsson et Michael Monty Widenius.

Tous les développeurs du serveur MySQL sont employés par l'entreprise. Nous sommes une organisation virtuelle, avec des employés répartis dans une douzaine de pays à travers le monde. Nous communiquons intensivement entre nous sur l'Internet tous les jours, et avec nos utilisateurs, fans et partenaires.

Nous nous consacrons au développement du logiciel MySQL et à la diffusion de notre base de données auprès des nouveaux utilisateurs. MySQL AB est propriétaire des droits du code source de MySQL, du logo MySQL et de la marque de commerce, ainsi que du manuel. See section 1.2 Qu'est ce que MySQL?.

Les valeurs fondamentales de MySQL témoignent de notre implication auprès de MySQL et des Logiciels libres.

Nous souhaitons que la base de données MySQL soit :

MySQL AB et les collaborateurs de MySQL AB :

Le site web de MySQL (http://www.mysql.com/) fournit les dernières informations à propos de MySQL et MySQL AB.

1.3.1 Les services et le modèle d'affaire de MySQL AB

Une des questions les plus fréquentes que nous rencontrons est : ``Comment arrivez-vous à vivre en développant un produit gratuit ?'' Voici comment.

MySQL AB fait des affaires en vendant du support, des services, des licences commerciales et en percevant des royalties. Nous utilisons ces fonds pour le développement des produits et des affaires de MySQL.

La compagnie est profitable depuis sa conception. En octobre 2001, nous avons accepté un financement de la part d'un groupe d'investisseurs scandivanes important et de quelques business angels. Cet investissement est utilisé pour consolider notre modèle d'affaires et assurer les bases de notre croissance à long terme.

1.3.1.1 Support

MySQL AB est dirigé par ses propriétaires, qui sont les fondateurs et les principaux développeurs de la base de données MySQL. Les développeurs se consacrent au support des utilisateurs et des autres utilisateurs, afin de rester au courant de leurs besoins et leurs problèmes. Tout notre support est donné par des développeurs qualifiés. Les questions vraiment épineuses sont étudiées par Michael Monty Widenius, auteur principal du code du serveur MySQL. See section 1.4.1 Support proposé par MySQL AB.

Pour plus d'informations et pour commander un support de différents niveaux, voyez http://www.mysql.com/support/ ou contactez notre équipe de vente à sales@mysql.com.

1.3.1.2 Formation et certification

MySQL AB organise des formations MySQL à travers le monde entier. Nous offrons des cours inter et intra entreprise, adaptés aux besoins spécifiques de chaque société. La formation MySQL est aussi disponible auprès de nos partenaires, les centres de formation certifiés MySQL.

Nos documents de formation utilisent les mêmes exemples de bases de données que notre documentation et nos applications d'exemple, et ils sont toujours mis à jour pour prendre en compte les dernières versions de MySQL. Nos formateurs sont épaulés par notre équipe de développement pour garantir la qualité de la formation et le développement continu des documents de cours. Cela vous assure aussi qu'il n'y aura pas de questions laissées ouvertes durant les cours.

Suivre nos formations vous permettra d'atteindre tous vos buts avec votre application MySQL. Vous allez aussi :

Si vous êtes intéressé par nos formations, en tant que participant potentiel, ou comme partenaire de formation, visitez la section de formation à http://www.mysql.com/training/ ou contactez-nous à : training@mysql.com.

Le programme de certification MySQL est publié dans le second semestre 2002. Pour plus de détails, voyez http://www.mysql.com/certification/.

1.3.1.3 Conseil

MySQL AB et ses partenaires accrédités offrent des services de conseil aux utilisateurs du serveur MySQL et à ceux qui intègrent le serveur MySQL dans leurs logiciels, à travers le monde.

Nos consultants peuvent vous aider à concevoir et paramétrer vos bases, construire des requêtes efficaces, optimiser votre plate-forme, résoudre les problèmes de migration, installer la réplication, bâtir des applications transactionnelles robustes et bien plus encore. Nous aidons aussi les clients à intégrer le serveur MySQL dans leurs produits et applications, pour un déploiement d'envergure.

Nos consultants travaillent en collaboration étroite avec notre équipe de développement pour assurer la qualité technique de nos services professionnels. Les missions de conseil peuvent aller de sessions de démarrage de deux jours à des projets de plusieurs semaines ou mois. Notre expertise couvre non seulement le serveur MySQL, mais s'étend aussi aux langages de programmation tels que PHP, Perl et d'autres encore.

Si vous êtes interessé par nos services de conseil ou si vous souhaitez devenir un partenaire conseil, visitez la section conseil de notre site web à http://www.mysql.com/consulting/ ou contactez notre équipe de conseil à consulting@mysql.com.

1.3.1.4 Licences commerciales

La base de données MySQL est publiée sous la licence GNU General Public License (GPL). Cela signifie que le logiciel MySQL peut être utilisé gratuitement, en acceptant les termes de la licence GPL. Si vous ne voulez pas être lié par les termes de la licence GPL (comme le fait que votre application aussi doit être GPL), vous pouvez acheter une licence du même produit auprès de MySQL AB. Voyez http://www.mysql.com/support/arrangements/price.html. Comme MySQL AB est propriétaire du copyright du code source de MySQL, nous pouvons utiliser une double licence, qui fait que le même produit est disponible sous la licence GPL et sous une licence commerciale. Cela ne change en rien l'implication de MySQL AB dans le mouvement des logiciels libres. Pour plus de détails sur quand une licence commerciale est nécessaire, voyez section 1.4.3 Licences MySQL.

Nous vendons aussi des licences commerciales aux logiciels Open Source GPL qui ajoutent à la valeur du serveur serveur MySQL. Un bon exemple est le gestionnaire de table transactionnel InnoDB qui offre le support ACID, le verrouillage de ligne, la restauration après crash, le multi versionnage, le support des clés étrangères, etc. See section 7.5 Tables InnoDB.

1.3.1.5 Partenariats

MySQL AB a un programme de partenariat mondial qui couvre la formation, le conseil et le support, les publications, la revente et la distribution des produits MySQL. Les partenaires MySQL AB gagnent en visibilité grâce au site http://www.mysql.com/ et le droit d'utiliser certaines versions spéciales des marques de commerce MySQL pour identifier leurs produits et promouvoir leur entreprise.

Si vous êtes intéressé à devenir un partenaire MySQL AB, envoyez un email à partner@mysql.com.

Le mot MySQL et le logo MySQL avec le dauphin sont des marques commerciales de MySQL AB. See section 1.4.4 Logos MySQL AB et marque déposée. Ces marques représentent un investissement capital que les fondateurs de MySQL ont placé depuis plusieurs années.

1.3.1.6 Publicité

Le site web MySQL (http://www.mysql.com/) est très populaire auprès des développeurs et des utilisateurs. En Octobre 2001, nous avons eu 10 millions de pages vues. Nos visiteurs représentent un groupe effectuant des décisions d'achat et des recommandations pour le matériel et les logiciels. Douze pour cents de nos visiteurs émettent des décisions d'achat, et seulement 9 % n'en prennent pas du tout. Plus de 65 % d'entre eux ont effectué un ou plusieurs achats sur internet ces six derniers mois, et 70 % prévoient d'en faire un dans le mois à venir.

1.3.2 Contacts

Le site web de MySQL (http://www.mysql.com/) fournit les dernières informations à propos de MySQL et MySQL AB.

Pour les contacts presse et les questions qui ne sont pas couvertes par les annonces officielles (http://www.mysql.com/news/), envoyez un email à press@mysql.com.

Si vous avez un contrat de support valide avec MySQL AB, vous obtiendrez des réponses rapides et précises de notre équipe technique sur le logiciel MySQL. Pour plus d'informations, voyez section 1.4.1 Support proposé par MySQL AB. Sur notre site web, voyez http://www.mysql.com/support/, ou envoyez un email à sales@mysql.com.

Pour des informations sur les formations MySQL, visitez la section formation à http://www.mysql.com/training/. Si vous avez un accès restreint à Internet, contactez l'équipe de formation de MySQL AB à l'adresse training@mysql.com. See section 1.3.1.2 Formation et certification.

Pour des informations sur le programme de certification MySQL, voyez la section http://www.mysql.com/certification/. See section 1.3.1.2 Formation et certification.

Si vous êtes interessé par du conseil, visitez la section conseil à http://www.mysql.com/consulting/. Si vous avez un accès restreint à Internet, contactez l'équipe de conseil de MySQL AB à consulting@mysql.com. See section 1.3.1.3 Conseil.

Les licences commerciales peuvent être commandées en ligne à http://order.mysql.com/. Vous trouverez aussi des informations sur les commandes par fax à MySQL AB. Plus d'informations sur les licences sont disponibles à http://www.mysql.com/products/pricing.html. Si vous avez des questions qui concernent les licences ou que vous souhaitez un devis pour un achat de nombreuses licences, remplissez le formulaire de contact disponible sur le site web (http://www.mysql.com/) ou envoyez un email à licensing@mysql.com (pour les questions de licence) ou à sales@mysql.com (pour les devis). See section 1.4.3 Licences MySQL.

Si vous représentez une entreprise qui est interessée par un partenariat avec MySQL AB, envoyez un email à partner@mysql.com. See section 1.3.1.5 Partenariats.

Pour plus d'informations sur la politique de marque de commerce de MySQL, reportez-vous à http://www.mysql.com/company/trademark.html ou envoyez un email à trademark@mysql.com. See section 1.4.4 Logos MySQL AB et marque déposée.

Si vous êtes interessé par un des emplois à MySQL AB présentés dans notre section job (http://www.mysql.com/company/jobs/), envoyez un email à jobs@mysql.com. N'envoyez pas votre CV en pièce jointe, mais collez-le dans le corps du texte à la fin de votre message.

Pour des discussions générales entre utilisateurs, dirigez vos questions sur la liste de diffusion appropriée. See section 1.7.1 Listes de diffusion MySQL.

Les rapports d'erreurs (aussi appelés bogues), ainsi que les questions et suggestions doivent être envoyés à la liste de diffusion mysql@lists.mysql.com. Si vous avez trouvé un trou de sécurité critique dans le serveur MySQL, envoyez votre courriel à security@mysql.com. See section 1.7.1.3 Comment rapporter un bogue ou un problème.

Si vous avez un résultat de test que nous pouvons publier, contactez-nous à benchmarks@mysql.com.

Si vous avez des suggestions concernant les améliorations ou les corrections de ce manuel, envoyez-les à l'équipe du manuel docs@mysql.com. Pour les remarques spécifiques à la version française, vous pouvez aussi contacter directement Damien Seguy à damien.seguy@nexen.net.

Pour les questions ou commentaires à propos du fonctionnement ou du contenu du site web MySQL (http://www.mysql.com/), envoyez un email à webmaster@mysql.com.

MySQL AB a une politique de protection des données privées qui est présentée à http://www.mysql.com/company/privacy.html. Pour toutes les questions concernant cette politique, envoyez un email à privacy@mysql.com.

Pour toutes les autres questions, envoyez un email à info@mysql.com.

1.4 Support MySQL et licences

Cette section décrit le support MySQL et les accords de licence.

1.4.1 Support proposé par MySQL AB

Le support technique de MySQL AB est la réponse individualisée à vos problèmes particuliers, en direct, de l'équipe d'ingénieurs qui programme la base de données MySQL.

Nous tâchons d'avoir un support technique exhaustif et global. Presque tous les problèmes qui impliquent MySQL sont importants pour nous, s'ils sont importants pour vous. Typiquement, les clients qui recherchent de l'aide sur les différentes commandes, qui souhaitent résoudre des problèmes de performance, réparer des systèmes corrompus, comprendre les impacts des systèmes d'exploitation ou des réseaux sur les performances de MySQL, mettre en place des bonnes pratiques pour la sauvegarde et l'entretien, utiliser les APIs, etc. Notre support couvre uniquement le serveur MySQL et nos propres utilitaires, pas les produits tiers d'entreprises qui accèdent au serveur MySQL, même si nous pouvons parfois aider.

Les informations détaillées sur les différents niveaux de support sont disponibles à http://www.mysql.com/support/, et les contrats de support peuvent aussi être commandés en ligne. Si vous avez un accès restreint à Internet, vous pouvez contacter notre équipe commerciale à sales@mysql.com.

Le support technique est identique à l'assurance vie. Vous pouvez vivre très heureux sans pendant plusieurs années, mais lorsque vous rencontrerez une catastrophe, il sera trop tard pour l'acheter. Si vous utilisez MySQL pour des applications importantes et que vous rencontrez des problèmes, cela peut vous prendre très longtemps pour comprendre par vous- même. Vous pourriez alors avoir besoin de communiquer avec les techniciens les plus expérimentés de MySQL, ceux qui sont employés par MySQL AB.

1.4.2 Copyrights et licences utilisées par MySQL

MySQL AB est propriétaire du copyright du code source de MySQL, des logos MySQL, de la marque de commerce et de ce manuel. See section 1.3 Qui est MySQL AB ?. Plusieurs licences distinctes sont disponibles pour la diffusion de MySQL :

  1. Toutes les sources spécifiques de MySQL pour le serveur, le client mysqlclient et la librairie, ainsi que la librairie GNU readline sont couverts par la licence GNU General Public License. See section G Licence Publique Générale GNU. Le texte de cette licence est aussi disponible dans le fichier intitulé `COPYING' dans les distributions.
  2. La librairie GNU getopt est sous la licence GNU Lesser General Public License. See section H Licence Publique Générale GNU Limitée.
  3. Certaines parties du code source (la librairie regexp) sont placées sous un copyright de type Berkeley.
  4. Les anciennes versions de MySQL (3.22 et plus récentes) sont sujettes à des licences plus strictes (http://www.mysql.com/support/arrangements/mypl.html). Voyez la documentation spécifique de chaque version pour plus de détails.
  5. La manuel n'est actuellement PAS distribué sous la licence GPL. L'utilisation du manuel est sujette à ces conditions : Communiquez par e-mail avec docs@mysql.com pour plus d'informations, ou si vous êtes interessé par la traduction du manuel.

Pour plus de détails sur comment les licences MySQL fonctionnent, voyez section 1.4.3 Licences MySQL. Voyez aussi section 1.4.4 Logos MySQL AB et marque déposée.

1.4.3 Licences MySQL

Le logiciel MySQL est publié sous la licence GNU General Public License (GPL), qui est probablement mieux connue sous le nom de Open Source. Les termes exacts de la licence GPL sont disponibles sur le site de http://www.gnu.org/licenses/. Voyez aussi http://www.gnu.org/licenses/gpl-faq.html et http://www.gnu.org/philosophy/enforcing-gpl.html.

Comme le logiciel MySQL est publié sous la licence GPL, il est souvent utilisé gratuitement, mais pour certains usages vous souhaiterez peut-être acheter une licence commerciale auprès de MySQL AB à http://order.mysql.com/. Voyez http://www.mysql.com/support/arrangements.html pour plus d'informations.

Les anciennes versions de MySQL (3.22 et plus anciennes) sont sujettes à une licence plus stricte (http://www.mysql.com/support/arrangements/mypl.html). Voyez la documentation spécifique de chaque version pour information.

Notez bien que l'utilisation du logiciel MySQL sous une licence commerciale. GPL, ou toute autre ancienne licence MySQL ne vous donne pas automatiquement le droit d'utiliser les marques commerciales de MySQL AB. See section 1.4.4 Logos MySQL AB et marque déposée.

1.4.3.1 Utiliser MySQL avec la licence commerciale

La licence GPL est contagieuse, dans le sens où lorsqu'un programme est lié à la licence GPL, toutes les sources de toutes les parties du produit final doivent aussi être publiée sous la licence GPL. Sinon, vous violez la licence, et annulez vos droits d'utiliser le programme GPL.

Vous avez besoin d'une licence commerciale pour :

Si vous avez besoin d'une licence, vous en aurez besoin d'une pour chaque installation de MySQL. Cela est valable quelque soit le nombre de processeurs de la machine, et il n'y a pas de limite artificielle de nombre de connexion simultanées.

Pour les licences commerciales, voyez notre site web http://www.mysql.com/support/arrangements/price.html. Pour les contrats de support, voyez http://www.mysql.com/support/. Si vous avez des besoin spéciaux, ou que vous avez un accès restreint à internet, contactez notre équipe de vente à sales@mysql.com.

1.4.3.2 Utiliser MySQL sous licence GPL libre

Vous pouvez utiliser le logiciel MySQL sous la licence gratuite GPL si vous acceptez les termes et conditions de la licence GPL. Pour une liste exhaustive des questions courantes à propos de la licence GPL, voyez la FAQ générale de la Free Software Foundation à http://www.gnu.org/licenses/gpl-faq.html. Quelques cas courants :

Si vous utilisez le serveur de bases de données MySQL sans avoir besoin de licence commerciale, nous vous encourageons à acheter le support auprès de MySQL AB malgré tout. De cette façon, vous contribuez au développement de MySQL et en obtenez des avantages immédiats vous-même. See section 1.4.1 Support proposé par MySQL AB.

Si vous utilisez MySQL dans un contexte commercial tel que vous en tirez profit, nous vous demandons de participer au développement de MySQL en achetant du support. Nous pensons que comme MySQL aide votre entreprise, il est raisonnable de vous demander d'aider à votre tour MySQL AB. (Sinon, lorsque vous nous posez des questions de support, non seulement vous utilisez gratuitement un système dans lequel nous avons investi beaucoup de temps, mais en plus, vous nous demandez du support gratuit, en plus !)

1.4.4 Logos MySQL AB et marque déposée

Beaucoup d'utilisateurs de MySQL souhaitent afficher le logo du dauphin MySQL AB sur leur sites web, leur livres ou leurs produits. Nous encourageons ces actes, tant qu'on part du principe que le mot MySQL et le logo du dauphin MySQL sont des marques déposées par MySQL AB et ne doivent être utilisés que dans les conditions décrites à la page suivante : http://www.mysql.com/company/trademark.html.

1.4.4.1 Le logo original de MySQL

Le dauphin MySQL a été conçu par l'agence de publicité finlandaise Priority, en 2001. Le dauphin a été choisi en tant que symbole représentatif de MySQL, car c'est un animal intelligent, rapide et élancé, qui parcourt sans effort l'océan des données. Nous aimons aussi les dauphins.

Le logo original de MySQL ne peut être utilisé que par les représentants de MySQL AB et par ceux qui ont un accord signé leur permettant de le faire.

1.4.4.2 Logos MySQL qui peuvent être utilisés dans autorisation préalable

Nous avons conçu un jeu de logos qui peuvent être utilisés sous conditions, et qui peuvent être téléchargés depuis notre site web à http://www.mysql.com/press/logos.html et utilisés sur les sites web tiers sans autorisation écrite de MySQL AB. L'utilisation de ces logos n'est pas inconditionnelle, mais, comme leur nom l'implique, sujette à notre politique de marque de commerce qui est aussi disponible sur notre site web. Il est recommandé de lire ce document avant d'utiliser les logos sur votre site web. En bref, les pré-requis sont :

Contactez-nous à trademark@mysql.com pour voir avec nous tous les arrangements spéciaux qui vous conviendraient.

1.4.4.3 Quand avez vous besoin d'autorisation pour utiliser le logo MySQL?

Dans les cas suivants vous devez obtenir une permission écrite de MySQL AB avant d'utiliser les logos MySQL :

En dehors des raisons commerciales et légales, nous nous devons de suivre l'utilisation du logo MySQL sur les produits, livres, etc. Nous demanderons une compensation pour l'affichage des logos MySQL AB sur les produits, car nous pensons qu'il est raisonnable qu'une partie des revenus ainsi générés servent à poursuivre le développement de la base de données MySQL.

1.4.4.4 Logos de partenariat MySQL AB

Le logo partenariat MySQL ne doit être utilisé que par les compagnies et les personnes ayant un partenariat écrit avec MySQL AB Le partenariat inclut une certification en tant que consultant ou professeur MySQL.

Merci de visiter section 1.3.1.5 Partenariats.

1.4.4.5 Utiliser le nom MySQL sur des documents imprimés ou des présentations

MySQL AB apprécie les références à la base MySQL. Il faut toutefois garder à l'esprit que MySQL est une marque commerciale, propriété de MySQL AB. A cause de cela, il faut ajouter au logo le symbole de marque de commerce (TM) lors de la première ou de la plus visible utilisation du mot MySQL dans le texte et, là où approprié, établir clairement que MySQL est une marque commerciale de MySQL AB. Reportez-vous à notre politique de marque commerciale à http://www.mysql.com/company/trademark.html pour plus de détails.

1.4.4.6 Utilisation du nom MySQL dans un nom de société ou de produit

L'utilisation du mot MySQL dans le nom d'une compagnie, d'un produit ou d'un nom de domaine Internet est interdite sans une permission écrite de MySQL AB.

1.5 MySQL 4.0 In A Nutshell

Promise depuis longtemps par MySQL AB et attendue avec impatience par nos utilisateur, le serveur MySQL 4.0 est disponible en version de production.

MySQL 4.0 est disponible au téléchargement depuis http://www.mysql.com/ et nos mirroirs. MySQL 4.0 a été testée par un grand nombre d'utilisateurs et il est en production sur de très grands sites.

Les fonctionnalités principales de MySQL serveur 4.0 sont destinées à nos utilisateurs professionnels et communautaire : elles améliorent le capacités de MySQL pour gérer les missions critiques et les systèmes fortement chargés. D'autres fonctionnalités sont destinées aux utilisateurs de solutions intégrées.

MySQL version 4.0.12 a été déclarée stable pour utilisation en production, en mars 2003. Cela signifie que désormais, seules les corrections de bugs pour la série 4.0 seront faites. Les corrections de bugs critiques pour les séries 3.23 seront aussi proposées. See section 2.5.3 Passer de la version 3.23 à la version 4.0.

Les nouvelles fonctionnalités sont ajoutées en MySQL 4.1, qui est désormais disponibles sur notre serveur de versions BitKeeper. See section 1.6 MySQL 4.1 In A Nutshell.

1.5.1 Fonctionnalités disponibles depuis MySQL 4.0

Amélioration des performances
MySQL Server embarqué
Le moteur InnoDB en standard
Nouvelels fonctionnalités
Standards compliance, portability and migration
Internationalisation
Amélioration de l'ergonomie
Durant la mise en place de fonctionnalités pour de nouveaux utilisateurs, nous n'avons pas oublié notre communauté de loyaux utilisateurs.

La section sur les nouveautés du manuel rassemble toutes les nouveautés. See section C.3 Changements dans la publication 4.0.x (Beta).

1.5.2 MySQL Server intégré (embedded)

libmysqld rend le serveur MySQL disponible pour toute une gamme d'applications très vaste. En utilisant la librairie du serveur MySQL intégré, vous pouvez utiliser MySQL dans différentes applications et appareillages, où l'utilisateur final n'aura même pas idée de sa présence. Le serveur MySQL intégré est idéal pour équiper les bornes internet, les kiosques publics, les packages matériel/ logiciels clé en main, les serveurs MySQL haute performances, et les bases de données autonomes sur CDrom.

De nombreux utilisateurs de libmysqld profiteront de la double licence. Pour ceux qui ne souhaitent pas être liés par la licence GPL, la librairie est aussi disponible avec une licence commerciale. La librairie MySQL intégrée utilise la même interface que la librairie cliente classique, ce qui la rend pratique à utiliser. See section 8.4.15 libmysqld, la librairie du serveur embarqué MySQL.

1.6 MySQL 4.1 In A Nutshell

MySQL Server 4.0 a posé les fondations pour de nouvelles fonctionnalités telles que les sous-requêtes imbriquées et l'Unicode qui sont dors et déjà implémentée en version 4.1, ainsi que les procédures stockées SQL-99, qui seront disponibles pour la version 5.0. Ils représentent les fonctionnalités les plus demandées par de nombreux clients.

Avec ces améliorations, les critiques du serveur de base de données MySQL devront être plus imaginatifs que jamais pour identifier des manques dans le serveur MySQL. Déjà connu depuis longtemps pour sa stabilité, sa rapidité et sa facilité d'emploi, le serveur MySQL va désormais satisfaire la liste de tous les voeux des clients les plus exigents.

1.6.1 Fonctionnalités disponibles depuis MySQL 4.1

Les fonctionnalités ci-dessous sont implémentées en MySQL 4.1. Quelques autres fonctionnalités sont prévues pour MySQL 4.1, mais très peu. See section 1.9.1 New Features Planned For 4.1.

Les plus récentes fonctionnalités en cours de réalisation, comme par exemple les procédures stockées, seront disponibles en MySQL 5.0. See section 1.9.2 New Features Planned For 5.0.

Support for subqueries and derived tables
Speed enhancements
New functionality
Standards compliance, portability and migration
Internationalisation
Usability enhancements

La section sur les nouveautés du manuel rassemble toutes les nouveautés. See section C.2 Changes in release 4.1.x (Alpha).

1.6.2 Phases de publication

De nouvelles fonctionnalités sont ajoutées à MySQL 4.1, qui est déjà disponible dans notre système BitKeeper. See section 2.3.4 Installer à partir de l'arbre source de développement.

Le jeu de fonctionnalités destiné à la version 4.1 est globalement définitif. Les nouveautés iront essentiellement à la nouvelle version de développement 5.0. MySQL 4.1 va suivre son développement normal avec une phase Alpha (durant laquelle de nouvelles fonctionnalités peuvent être ajoutées ou modifiées), puis Beta (où les fonctionnalités sont fixées, et seules des corrections sont faîtes), puis Gamma (qui indique qu'une version de production verra le jour dans quelques semaines), avant que la version 4.1 ne deviennent la nouvelle version officielle.

1.6.3 Utilisation immédiate en production

Il est recommandé aux utilisateurs de ne pas passer leurs systèmes en production sous le serveur MySQL 4.x, jusqu'à ce qu'elle soit publiée en phase béta (telle que la 4.0.3 beta). Toutefois, même la version initiale a passé avec succès notre batterie de tests, sans aucune erreur sur aucune plate-forme que nous avons utilisé. Etant donné le grand nombre de fonctionalités supplémentaires, nous recommandons le serveur MySQL, même en version alpha, pour les phases de développement. L'agenda de publication du serveur MySQL 4.x est tel qu'il atteindra un état stable avant les applications qui sont aujourd'hui en phase de développement.

1.6.4 MySQL 5.0, The Next Development Release

Les nouveaux développements de MySQL sont désormais concentrés sur la version 5.0. Les procédures stockées et d'autres fonctionnalités seront en vedette. See section 1.9.2 New Features Planned For 5.0.

1.7 Sources d'informations MySQL

1.7.1 Listes de diffusion MySQL

Cette section vous présente les listes de diffusions MySQL, et donne des conseils quand à leur utilisation. En vous inscrivant à une des listes de diffusion, vous recevrez les messages que les autres auront envoyé, et vous pourrez envoyer vos propres questions et réponses.

1.7.1.1 Les listes de diffusions de MySQL

Pour vous inscrire à la liste de diffusion principale de MySQL, envoyez un courrier électronique à mysql-subscribe@lists.mysql.com.

Pour vous désinscrire à la liste de diffusion principale de MySQL, envoyez un courrier électronique à mysql-unsubscribe@lists.mysql.com.

Seule l'adresse d'où vous envoyez votre message est importante. La ligne de sujet et le corps sont ignorés.

Si votre adresse de réponse n'est pas valide, vous pouvez spécifier votre adresse explicitement, en ajoutant un tiret après le mot subscribe ou unsubscribe, suivi de votre adresse dans laquelle vous aurez remplacé le caractère `@' par `='. Par exemple, pour inscrire l'adresse your_name@host.domain, envoyez un message à mysql-subscribe-your_name=host.domain@lists.mysql.com.

Les mails envoyés à mysql-subscribe@lists.mysql.com et mysql-unsubscribe@lists.mysql.com sont géré automatiquement par le robot ezmlm. Des informations sur ezmlm sont disponibles à http://www.ezmlm.org/.

Pour poster un message sur la liste elle-même, envoyez votre message à mysql@lists.mysql.com. Toutefois, n'envoyez pas de mail d'inscription ou de désinscription à mysql@lists.mysql.com car tous les mails envoyés à cette adresse sont distribués automatiquement à des milliers d'utilisateurs.

Votre site local peut avoir beaucoup d'inscrits à la liste mysql@lists.mysql.com. Si c'est le cas, vous pouvez avoir une liste de diffusion locale, de façon à ce que les messages envoyés par lists.mysql.com à votre site local soit propagés par votre serveur local. Dans ce cas, contactez votre administrateur local pour être ajouté ou retiré de la liste.

Si vous voulez que le trafic de cette liste soit envoyé à une autre boîte aux lettres de votre client mail, installez un filtre basé sur les entêtes du message. Vous pouvez utiliser notamment les entêtes List-ID: et Delivered-To: pour identifier les messages de la liste. Les listes de diffusion MySQL suivantes existent :

announce-subscribe@lists.mysql.com announce
Ceci est la liste de diffusion d'annonces des versions de MySQL et des programmes compagnons. C'est une liste à faible volume, et tout utilisateur doit y être inscrit.
mysql-subscribe@lists.mysql.com mysql
La liste de diffusion principale pour les discussions générales sur MySQL. Notez que certains sujets sont à diriger sur les listes spécialisées. Si vous postez sur la mauvaise liste, vous pourriez ne pas avoir avoir de réponse.
mysql-digest-subscribe@lists.mysql.com mysql-digest
La liste mysql en format journalier. Cela signifie que vous recevrez tous les messages de la journée en un seul gros email.
bugs-subscribe@lists.mysql.com bugs
Sur cette liste, vous ne devriez envoyez que des bogues complets, reproductibles ainsi que le rapport qui va avec, en utilisant le script mysqlbug (si vous utilisez Windows, il faut aussi inclure la description du système d'exploitation et la version de MySQL MySQL). De préférence, vous devriez tester le problème avec la dernière version stable ou de développement du serveur MySQL avant de l'envoyer. Tout le monde doit être capable de reproduire le bogue simplement avec la ligne de commande mysql test < script avec le cas de test inclus. Tous les bogues doivent être posté sur la liste, et seront corrigés ou documentés dans la prochaine version de MySQL!. Si les modifications sont trop petites, nous publierons aussi un patch qui résout le problème.
bugs-digest-subscribe@lists.mysql.com bugs-digest
La liste bugs en format journalier.
internals-subscribe@lists.mysql.com internals
Une liste pour ceux qui travaillent sur le code MySQL. Sur cette liste, vous pouvez discuter du développement de MySQL et envoyer des patchs.
internals-digest-subscribe@lists.mysql.com internals-digest
La liste internals en format journalier.
java-subscribe@lists.mysql.com java
Une liste pour ceux qui utilisent MySQL et java. Elle concerne majoritairement les pilotes JDBC.
java-digest-subscribe@lists.mysql.com java-digest
La liste java en format journalier.
win32-subscribe@lists.mysql.com win32
Une liste pour ceux qui utilisent MySQL sur les systèmes d'exploitation de Microsoft, tels que Windows 9x/Me/NT/2000/XP.
win32-digest-subscribe@lists.mysql.com win32-digest
La liste win32 en format journalier.
myodbc-subscribe@lists.mysql.com myodbc
Une liste pour tout ce qui concerne la connexion à MySQL avec le pilote ODBC.
myodbc-digest-subscribe@lists.mysql.com myodbc-digest
La liste myodbc en format journalier.
mysqlcc-subscribe@lists.mysql.com mysqlcc
Une liste pour tout ce qui concerne le client graphique MySQL Control Center.
mysqlcc-digest-subscribe@lists.mysql.com mysqlcc-digest
La liste mysqlcc en format journalier.
plusplus-subscribe@lists.mysql.com plusplus
Une liste pour tout ce qui concerne la programmation avec les API C++ de MySQL.
plusplus-digest-subscribe@lists.mysql.com plusplus-digest
La liste plusplus en format journalier.
msql-mysql-modules-subscribe@lists.mysql.com msql-mysql-modules
Une liste pour tout ce qui concerne Perl et le support du module msql-mysql-modules.
msql-mysql-modules-digest-subscribe@lists.mysql.com msql-mysql-modules-digest
La liste msql-mysql-modules en format journalier.

Vous pouvez vous inscrire ou vous désinscrire de toutes les listes en même temps de la même façon que nous l'avons décrit au début. Dans votre message d'inscription, utilisez simplement le nom de liste approprié. Par exemple, pour vous inscrire à la liste myodbc, envoyez un message à myodbc-subscribe@lists.mysql.com ou myodbc-unsubscribe@lists.mysql.com.

Si vous ne pouvez pas obtenir d'informations sur la liste de diffusion, une de vos options est de prendre un contrat de support auprès de MySQL AB, qui vous donnera un contact direct avec les développeurs MySQL. See section 1.4.1 Support proposé par MySQL AB.

Le tableau suivant présente diverses autres listes de diffusions consacrée à MySQL, dans d'autres langues que l'anglais. Notez que ces ressources ne sont pas gérées par MySQL AB, ce qui fait que nous ne pouvons pas garantir leur qualité.

mysql-france-subscribe@yahoogroups.com Une liste de diffusion française
list@tinc.net Une liste de diffusion coréenne
Envoyez un message àsubscribe mysql your@e-mail.address.
mysql-de-request@lists.4t2.com Une liste de diffusion allemande
Envoyez un message à subscribe mysql-de your@e-mail.address. Vous aurez plus d'informations sur cette liste à http://www.4t2.com/mysql/.
mysql-br-request@listas.linkway.com.br Une liste de diffusion portugaise
Envoyez un message à subscribe mysql-br your@e-mail.address.
mysql-alta@elistas.net Une liste de diffusion espagnole
Envoyez un message à subscribe mysql your@e-mail.address.

1.7.1.2 Poser des questions ou rapporter un bogue

Avant de soumettre un rapport de bogue ou une question, commencez par ces étapes simples :

Si vous n'arrivez pas à trouver une réponse à votre question dans le manuel ou dans les archives, vérifiez auprès de votre expert MySQL local. Si vous ne trouvez toujours pas la réponse, vous pouvez lire la section suivante et envoyer un mail bien préparé à mysql@lists.mysql.com.

1.7.1.3 Comment rapporter un bogue ou un problème

Ecrire un bon rapport de bogue requiert de la patience, et le faire dès le début épargnera votre temps et le notre. Un bon rapport de bogue qui contient un cas de test complet améliorera vos chances de voir le bogue corrigé à la prochaine version. Cette section vous aidera à écrire correctement un rapport de bogue, de manière à ce que vous ne gaspillez pas votre temps à faire des textes qui ne nous aideront que peu ou pas.

Nous vous recommandons d'utiliser le script mysqlbug pour générer un rapport de bogue (ou rapporter un problème), dans la mesure du possible. mysqlbug est situé dans le dossier `scripts' de la distribution, ou, pour les distributions binaire, dans le dossier `bin' du dossier d'installation de MySQL. Si vous êtes dans l'incapacité d'utiliser mysqlbug, vous devez tout de même inclure toutes les informations nécessaires listées dans cette section.

Le script mysqlbug vous aide à générer un rapport en déterminant automatiquement les informations suivantes, mais si quelque chose d'important lui échappe, ajoutez le dans votre message! Lisez cette section avec attention, et assurez vous que toutes les informations décrites ici sont présentes dans votre message.

Pour rapporter un bogue ou un problème, il faut le soumettre à la liste mysql@lists.mysql.com. Si vous pouvez rédiger un cas de test qui démontre clairement le bogue, il faut le poster sur la liste bugs@lists.mysql.com. Notez que sur cette liste, vous ne devez poster qu'un rapport complet de bogue regénérable, avec le script mysqlbug. Si vous travaillez sous Windows, vous devez ajouter une description de votre système d'exploitation et de votre version de MySQL. De préférence, il vaut mieux utiliser la dernière version de MySQL, version stable ou de développement, avant d'envoyer un message. Tout le monde doit être capable de reproduire le bogue en utilisant simplement la ligne de commande ``mysql test < script'', avec le cas de bogue fourni, ou bien d'exécuter un script shell ou Perl qui est inclut dans le rapport de bogue. Tous les bogues postés sur la liste bogues seront corrigés ou documentés dans la prochaine version de MySQL. Si seul de petits changements sont nécessaires, nous publierons aussi un patch.

Si vous avez découvert un problème de sécurité sensible dans MySQL, il faut envoyer un email à security@mysql.com.

Sachez qu'il est toujours possible de répondre à un message qui contient trop d'informations, alors qu'il est impossible de répondre à um message qui contient trop peu d'informations. Souvent, il est facile d'omettre des faits parce que vous pensez connaître la cause du problème et supposez que ces détails ne sont pas importants. Un bon principe à suivre est : si vous avez un doute à propos de quelque chose, faites nous en part. Il est bien plus rapide et bien moins frustrant d'écrire quelques lignes de plus dans un rapport plutôt que d'être obligé de demander une nouvelle fois et d'attendre une réponse parce que vous avez oublié une partie des informations la première fois.

L'erreur la plus commune est de ne pas indiquer le numéro de la version de MySQL qui est utilisé, ou de ne pas indiquer le système d'exploitation que vous utilisez (y compris le numéro de version de ce système d'exploitation). Ce sont des informations de première importance, et dans 99% d4es cas, le rapport de bogue est inutilisable sans ces informations. Souvent, nous recevons des questions telles que ``Pourquoi est ce que cela ne fonctionne pas pour moi?''. Puis nous nous aperçevons que la fonctionnalités en question n'est même pas programmée dans la version de MySQL utilisée, ou que le bogue décrit est déjà corrigé dans une nouvelle version de MySQL. Parfois aussi, les erreurs sont dépendantes des plate-formes. Dans ce cas, il est presque impossible de les corriger sans savoir quel système d'exploitation et quelle version exacte est utilisée.

Pensez aussi à fournir des informations concernant votre compilateur, si c'est pertinent. Souvent, les développeurs trouvent des bogues dans les compilateurs, et pensent que c'est liés à MySQL. La plupart des compilateurs sont en constant développement, et s'améliorent de version en version. Pour déterminer si votre problèe dépend de votre compilateur, nous avons besoin de savoir quel compilateur est utilisé. Notez que les problèmes de compilations sont des bogues, et doivent être traités avec un rapport de bogues.

Il est particulièrement utile de fournir une bonne description du bogue dans le rapport de bogue. Cela peut être un exemple de ce que vous avez fait qui a conduit au problème, ou une description précise. Les meilleurs rapports sont ceux qui incluent un exemple complet permettant de reproduire le bogue. See section D.1.6 Faire une batterie de tests lorsque vous faites face à un problème de table corrompue.

Si un programme produit un message d'erreur, il est très important d'inclure ce message dans votre rapport. Il est préférable que le message soit le message exact, car il est alors possible de le retrouver en utilisant les archives : même la casse doit être respectée. N'essayez jamais de vous rappeler d'un message d'erreur, mais faites plutôt un copier/coller du message complet dans votre rapport.

Si vous avez un problème avec MyODBC, essayez de générer un fichier de trace MyODBC. See section 8.3.7 Rapporter des problèmes avec MyODBC.

Pensez aussi que de nombreux personnes qui liront votre rapport utilisent un formatage de 80 colonnes. Lorsque vous générez votre rapport et vos exemples avec l'outil de ligne de commande, utilisez une largeur de 80 colonnes. Utilisez l'option --vertical (ou la fin de commande \G) pour les affichages qui excèdent une telle largeur (par exemple, avec la commande EXPLAIN SELECT; voyez l'exemple un peu plus tard dans cette section.

Voici un pense-bête des informations à fournir dans votre rapport :

Si vous disposez de l'accès au support client, contactez aussi le support client à mysql-support@mysql.com, en plus de la liste de rapport de bogues, pour un traitement prioritaire.

Pour des informations sur les rapports de bogues avec MyODBC, voyez section 8.3.4 Comment reporter les problèmes avec ODBC.

Pour des solutions aux problèmes les plus courants, voyez section A Problèmes et erreurs communes.

Lorsque des solutions vous sont envoyées individuellement et non pas à la liste, il est considéré comme bien vu de rassembler ces réponses et d'en envoyer un résumé sur le liste, de manière à ce que les autres en profitent aussi.

1.7.1.4 Conseils pour répondre sur la liste de diffusion

Si vous pensez que votre réponse peut avoir un intérêt général, vous pouvez envisager de l'envoyer sur la liste de diffusion, plutôt que de faire une réponse personnelle aux demandeurs. Essayez de rendre votre réponse aussi générale que possible, pour que suffisamment d'autres personnes puissent en profiter. Lorsque vous envoyez une réponse sur la liste, assurez vous qu'elle ne représente pas un doublon d'une réponse précédente.

Essayez de résumer l'essentiel de la question dans votre réponse. Ne vous croyez pas obligé de citer tout le message original.

Attention : n'envoyez pas de message avec le mode HTML activé ! De nombreux utilisateurs ne lisent pas leurs emails avec un navigateur.

1.7.2 Support de la communauté MySQL sur IRC (Internet Relay Chat)

En plus des différentes listes de diffusion MySQL, vous pouvez rencontrer des utilisateurs expérimentés sur IRC (Internet Relay Chat). Voici les meilleurs canaux, à notre connaissance :

Si vous recherchez un client IRC pour vous connecter à un réseau IRC, voyez donc X-Chat (http://www.xchat.org/). X-Chat est disponible sous Unix et sous Windows.

1.8 Quels standards respecte MySQL?

Cette section présente comment MySQL interprète les standards SQL ANSI. Le serveur MySQL dispose de nombreuses extensions au standard ANSI et vous trouverez ici comment les exploiter. Vous trouvrez aussi des informations sur les fonctionnalités manquantes de MySQL et comment y trouver des palliatifs.

Notre but n'est pas, sans une bonne raison, de restreindre les capacités de MySQL à un usage unique. Même si nous n'avons pas les ressources de développement à consacrer à toutes les opportunités, nous sommes toujours interessés et prêts à aider ceux qui utilisent MySQL dans de nouveaux domaines.

Un de nos objectifs avec ce produit est de tendre à la compatibilité ANSI 99, mais sans sacrifier la vitesse ou la robustesse. Nous ne reculons pas devant l'ajout de nouvelle fonctionnalités au langage SQL, ou le support de fonctionnalités hors SQL, qui améliorent le confort d'utilisation de MySQL. La nouvelle interface de gestionnaires HANDLER de MySQL 4.0 est un exemple de cette stratégie. See section 6.4.2 Syntaxe de HANDLER.)

Nous continuons de supporter les bases transactionnelles et non transactionnelles pour combler les besoins des sites web ou des applications à fort besoin d'archivage, ainsi que les applications critiques à très haute disponibilité.

Le serveur MySQL a été conçu pour travailler avec des bases de taille moyenne (de 10 à 100 millions de lignes, ou des tables de 100 Mo) sur des systèmes de petite taille. Nous continuons d'améliorer MySQL pour qu'il fonctionne avec des bases gigantesques (tera octets), tout en conservant la possibilité de compiler une version réduite de MySQL pour qu'il fonctionne sur des appareils embarqués ou nomades. L'architecture compacte de MySQL rend possible le support de ces applications si différentes, sans aucun conflit dans les sources.

Nous n'étudions pas le support du temps réel ou des bases de données en grappe (même si vous pouvez dores et déjà réaliser de nombreuses applications avec les services de réplication).

Nous ne croyons pas au support natif du XML en base, mais nous allons faire en sorte d'ajouter le support XML que réclame nos clients du coté client. Nous pensons qu'il est préférable de conserver le serveur central aussi ``simple et efficace'' que possible, et développer les librairies qui gèrent la complexité du coté client. Cela fait partie de la stratégie que nous avons mentionné plus tôt, pour ne sacrifier ni la vitesse, ni la robustesse du serveur.

1.8.1 Quels standards suit MySQL ?

SQL92, niveau de base. ODBC niveau 0-3.51.

Nous nous dirigeons vers le support complet du standard ANSI SQL99, mais sans aucune concession sur la vitesse ou la qualité du code.

1.8.2 Exécuter MySQL en mode ANSI

Si vous démarrez mysqld avec l'option --ansi, les comportements suivants du serveurs MySQL changent :

Ceci revient à utiliser les options suivantes : --sql-mode=REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES, IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY.

1.8.3 Extensions de MySQL à la norme ANSI SQL92

Le serveur MySQL inclut des extensions que vous ne trouverez probablement pas dans les autres bases de données. Soyez prévenus que si vous les utilisez, votre code ne sera probablement pas portable sur d'autres serveurs SQL. Dans certains cas, vous pouvez écrire du code qui inclut des spécificités de MySQL, mais qui restent portables, en les incluant dans des commentaires de la forme /*! ... */. Dans ce cas, le serveur MySQL va analyser la chaîne et exécuter le code à l'intérieur de ces commentaires comme une commande normale, mais d'autres serveurs ignoreront ces commentaires. Par exemple :

SELECT /*! STRAIGHT_JOIN */ col_name FROM table1,table2 WHERE ...

Si vous ajoutez le numéro de version après le point d'exclamation '!', la syntaxe sera exécutée uniquement si la version du serveur MySQL est égale ou plus récente que le numéro de version utilisé.

CREATE /*!32302 TEMPORARY */ TABLE t (a int);

Cela signifie que si vous avez la version 3.23.02 ou plus récente, le serveur MySQL va utiliser le mot réservé TEMPORARY.

Voici une liste des apports spécifiques de MySQL :

1.8.4 Différences de MySQL avec ANSI SQL92

Nous tâchons de rendre le serveur MySQL compatible avec le standard ANSI SQL, et le standard ODBC SQL, mais dans certains cas, MySQL se comporte différemment.

Pour voir la liste des priorités de développement des nouvelles extensions de MySQL, consultez la liste de tâches sur http://www.mysql.com/doc/en/TODO.html. C'est la toute dernière liste de tâche de ce manuel. See section 1.9 Les évolutions de MySQL (la liste des tâches).

1.8.4.1 Sous sélections (SubSELECTs)

Les sous-requtes ont ŽtŽ implŽmentŽes en MySQL 4.1. See section 1.6.1 Fonctionnalités disponibles depuis MySQL 4.1.

Jusqu'à la version 4.0, le serveur MySQL ne prenait en charge que les requêtes imbriquées de la forme INSERT ... SELECT ... et REPLACE ... SELECT .... Vous pouvez néanmoins utiliser la fonction IN() dans d'autres contextes. Les sous-requêtes sont implémentées dans l'arborescence de développement 4.1.

En attendant, vous pourrez dans la plupart des cas réécrire la requête sans sous-requêtes :

SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);

Ceci peut être réécrit de la façon suivante :

SELECT table1.* FROM table1,table2 WHERE table1.id=table2.id;

Les requêtes :

SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2
                                       WHERE table1.id=table2.id);

peuvent être réécrites ainsi :

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id
                                       WHERE table2.id IS NULL;

Pour des requêtes plus complexes, vous pouvez généralement créer des tables temporaires contenant les sous-requêtes. Cependant, dans certains cas cette option ne fonctionnera pas. Le cas le plus fréquent se produit avec les instructions DELETE, pour lesquelles le SQL standard ne prend pas en charge les jointures (sauf dans les sous Select). Dans une telle situation, en attendant que les sous-requêtes soient prises en charge par MySQL Server, vous disposez de deux options.

La première option consiste à utiliser un langage de programmation procédural (tel que Perl ou PHP) afin de soumettre une requête SELECT pour obtenir les clés primaires des enregistrements à supprimer. On utilise ensuite ces valeurs pour construire l'instruction DELETE (DELETE FROM ... WHERE ... IN (key1,key2, ...)).

La seconde option consiste à utiliser le SQL interactif pour construire automatiquement un ensemble d'instructions DELETE, grâce à l'extension MySQL CONCAT() (à la place de l'opérateur standard ||).

Par exemple :

SELECT CONCAT('DELETE FROM tab1 WHERE pkid = ', "'", tab1.pkid, "'", ';')
  FROM tab1, tab2
 WHERE tab1.col1 = tab2.col2;

Vous pouvez placer cette requête dans un fichier script et rediriger son entrée vers l'interpréteur de ligne de commande mysql, tout en ouvrant un canal de communication (pipe) pour diriger sa sortie vers une seconde instance de l'interpréteur :

shell> mysql --skip-column-names mydb < myscript.sql | mysql mydb

La version 4.0 de MySQL prend en charge les instructions DELETE sur plusieurs tables pouvant être utilisées afin de supprimer efficacement des lignes à partir d'informations issues d'une table, voire de plusieurs tables en même temps.

1.8.4.2 SELECT INTO TABLE

Le serveur MySQL ne supporte pas encore l'extension Oracle SQL : SELECT ... INTO TABLE .... A la place, le serveur MySQL supporte la syntaxe ANSI SQL INSERT INTO ... SELECT ..., qui revient au même. See section 6.4.3.1 Syntaxe de INSERT ... SELECT.

INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID
       FROM tblTemp1 WHERE tblTemp1.fldOrder_ID > 100;

Vous pouvez aussi utiliser SELECT INTO OUTFILE... ou CREATE TABLE ... SELECT.

1.8.4.3 Transactions et opérations atomiques

Le serveur MySQL support les transactions avec les gestionnaires de tables InnoDB et BDB. See section 7 Types de tables MySQL. InnoDB dispose aussi de la compatibilité ACID.

Toutefois, les tables non transactionnelles de MySQL telles que MyISAM exploitent un autre concept pour assurer l'intégrité des données, appelé ``opérations atomiques''. Les opérations atomiques disposent d'une bien meilleure protection des données pour des performances également accrues. Comme MySQL supporte les deux méthodes, l'utilisateur est capable de choisir celle qui correspond à ses besoins, suivant qu'il a besoin de vitesse ou de sécurité. Ce choix peut être fait table par table.

Comment exploiter les capacités de MySQL pour protéger l'intégrité des données, et comment ces fonctionnalités se comparent-elles avec les méthodes transactionnelles ?

  1. En mode transactionnel, si votre application a été écrite en dépendant de l'appel de ROLLBACK au lieu de COMMIT dans les situations critiques, les transactions sont plus plus pratiques. Les transactions s'assurent que les modifications non achevées ou les activités corrosives ne sont pas archivées dans la base. Le serveur a l'opportunité d'annuler automatiquement l'opération, et votre base de données est sauve. Le serveur MySQL, dans la plupart des cas, vous permet de résoudre les problèmes potentiels en incluant de simples vérifications avant les modifications, et en exécutant des scripts simples pour vérifier l'intégrité de vos bases de données, ainsi que les incohérences, et pour réparer automatiquement les problèmes, ou encore vous alerter si une erreur est identifiée. Notez qu'en utilisant simplement le log de MySQL, ou en utilisant un log supplémentaire, vous pouvez normalement réparer à la perfection toutes les tables, sans aucune perte de données.
  2. Souvent, les modifications de données transactionnelles fatales peuvent être réécrites de manière atomique. En général, tous les problèmes d'intégrité que les transactions résolvent peuvent être corrigés avec la commande LOCK TABLES ou des modifications atomiques, qui assurent que vous n'aurez jamais d'annulation automatique de la base, ce qui est un problème commun des bases transactionnelles.
  3. Même un système transactionnel peut perdre des données si le serveur s'arrête. La différence entre les systèmes repose alors dans ce petit laps de temps où ils peuvent perdre des données. Aucun système n'est sécurisé à 100 %, mais simplement ``suffisament sécurisé''. Même Oracle, réputé pour être la plus sûre des bases de données transactionnelles, est montré du doigt pour perdre des données dans ces situations. Pour être tranquille avec MySQL, que vous utilisiez les tables transactionnelles ou pas, vous n'avez besoin que de sauvegardes et de logs de modifications. Avec ces deux outils, vous pourrez vous protéger de toutes les situations que vous pourriez rencontrer avec d'autres bases de données transactionnelles. De toute manière, il est bon d'avoir des sauvegardes, indépendamment de la base que vous utilisez.

La méthode transactionnelle a ses avantages et ses inconvénients. De nombreux utilisateurs et développeurs d'applications dépendent de la facilité de pallier un problème lorsqu'une annulation semble nécessaire ou presque. Cependant, même si vous êtes néophyte des opérations atomiques, ou plus familier avec les transactions, prenez en considération le gain de vitesse que les tables non transactionnelles offrent. Ces gains vont de 3 a 5 fois la vitesse des tables transactionnelles les plus rapides et les mieux optimisées.

Dans des situations où l'intégrité est de la plus grande importance, le serveur MySQL assure une intégrité du niveau des transactions, ou encore mieux avec les tables non transactionnelles. Si vous verrouillez les tables avec LOCK TABLES, toutes les modifications seront bloquées jusqu'à ce que la vérification d'intégrité soit faite (à comparer avec un verrou en écriture), les lectures et insertions sont toujours possibles. Les nouvelles lignes ne seront pas accessibles en lecture tant que le verrou n'aura pas été levé. Avec INSERT DELAYED, vous pouvez faire attendre les insertions dans une pile, jusqu'à ce que les verrous soit levés, sans que le client n'attende cette levée de verrou. See section 6.4.4 Syntaxe de INSERT DELAYED.

``Atomique'', avec le sens que nous lui donnons, n'a rien de magique. Ce terme signifie simplement que vous pouvez être certain que lorsque vous modifiez des données dans une table, aucun autre utilisateur ne peut interférer avec votre opération, et qu'il n'y aura pas d'annulation automatique (ce qui pourrait arriver avec des tables transactionnelles si nous ne sommes pas trop soigneux). Le serveur MySQL garantit aussi qu'il n'y aura pas de lectures erronées.

Voici quelques techniques pour travailler avec des tables non transactionnelles :

1.8.4.4 Procédures stockées et triggers

Une procédure stockée est une liste de commandes SQL qui peuvent être compilées et stockées sur le serveurs. Une fois que cela est fait, les clients n'ont pas besoin de soumettre à nouveau toute la commande, mais font simplement référence à la procédure stockée. Cela conduit à des performances bien meilleures, car les commandes n'ont pas à être analysées plusieurs fois, et que bien moins d'informations transitent sur le réseau. Vous pouvez aussi élevez le niveau conceptuel de votre application en mettant en place des librairies de fonctions sur le serveur.

Un trigger est une procédure stockée qui est activée lorsqu'un événement particulier survient. Par exemple, vous pouvez installer une procédure stockée qui est déclenchée dès qu'une ligne est effacée dans une table d'achat, pour que le client soit automatiquement effacé si tous ses achats sont effacés.

La future version du langage sera capable de supporter les procédures stockées. Notre objectif est d'impolémenter les procédures stockées pour la version 5.0 du serveur MySQL. Nous nous pencherons aussi sur les triggers.

1.8.4.5 Les clés étrangères

Notez que les clés en SQL ne sont pas utilisées pour joindre des tables, mais pour assurer l'intégrité référentielle (contraintes de clés étrangères). Si vous voulez obtenir des résultats issus de tables multiples avec une commande SELECT, vous allez joindre les tables comme ceci :

SELECT * FROM table1,table2 WHERE table1.id = table2.id;

See section 6.4.1.1 Syntaxe de JOIN. See section 3.5.6 Utiliser les clefs étrangères.

En MySQL version 3.23.44 et plus récentes, les tables InnoDB supportent les vérifications d'intégrité référentielles. See section 7.5 Tables InnoDB. Pour les autres types de tables, le serveur mySQL accepte la syntaxe FOREIGN KEY dans la commande CREATE TABLE, mais ne la prend pas en compte.

La syntaxe FOREIGN KEY dans la clause ON DELETE ... est principalement utilisée pour des raisons de documentation. Certaines applications ODBC peuvent utiliser cette clause pour produire des conditions WHERE automatiques, mais c'est généralement simple à éviter. FOREIGN KEY est parfois utilisé pour vérifier une contrainte, mais cette vérification n'est pas nécessaire en pratique, si les lignes sont insérées dans la table dans le bon ordre.

Avec le serveur MySQL, vous pouvez contourner le problème de l'absence de la clause ON DELETE ... en ajoutant la commande DELETE appropriée dans l'application, lorsque vous effacez une ligne dans une table qui a une clé étrangère. En pratique, cette technique est aussi rapide (et même parfois plus rapide), et bien plus portable que l'utilisation des clés étrangères.

Avec le serveur MySQL 4.0, vous pouvez utiliser les commandes d'effacement multi-tables pour effacer des lignes dans plusieurs tables en une seule commande. See section 6.4.6 Syntaxe de DELETE.

Dans un futur proche, nous allons étendre l'implémentation de la clause FOREIGN KEY pour que cette information soit stockée dans le fichier de spécification des tables et puisse être lu par mysqldump et ODBC. Dans une étape ultérieure, nous allons implémenter les contraintes de clé étrangère pour les applications qui ne peuvent pas être codées sans.

Gardez bien en tête que les clés étrangères sont souvent méconnues, ce qui peut causer de graves problèmes. Même lorsqu'elles sont utilisées correctement, ce n'est pas une solution magique pour les problèmes d'intégrité référentielle, même si cela simplifie parfois les choses.

Voici des avantages aux contraintes de clés étrangères :

Inconvénients :

1.8.4.6 Les vues

Il est prévu d'implémenter les vues dans la version 5.0 du serveur MySQL.

Les vues sont la plupart du temps utiles pour donner accès aux utilisateurs à un ensemble de relations représentées par une table (en mode inaltérable). Beaucoup de bases de données SQL ne permettent pas de mettre à jour les lignes dans une vue, vous devez alors faire les mises à jour dans les tables séparées.

Vu que le serveur MySQL est la plupart du temps utilisé dans des applications où le développeur à un contrôle total sur l'utilisation de la base de données, la plupart de nos utilisateurs n'ont pas considéré les vues comme très importantes (du moins, personne n'a été assez intéressé à ce sujet pour être prêt à financer l'implémentation des vues).

On n'a pas forcément besoin des vues pour restreindre l'accès aux colonnes, et ce, parce que MySQL a un système de droits très sophistiqué. See section 4.2 Règles de sécurité et droits d'accès au serveur MySQL.

1.8.4.7 `--' comme début de commentaire

Certaines bases de données SQL utilisent `--' comme début de commentaire. Le serveur MySQL utilise `#'. Vous pouvez aussi utiliser la syntaxe du langage C /* ceci est un commentaire */. See section 6.1.6 Syntaxe des commentaires.

MySQL version 3.23.3 et plus récent supporte les commentaires de type `--', si ce commentaire est suivi d'un espace. Ceci est dû au fait que ce type de commentaire a causé beaucoup de problèmes avec les requêtes générées automatiquement, qui contiennent du code tel que celui-ci, où nous insérons automatiquement la valeur du paiement dans la table !payment! :

UPDATE tbl_name SET credit=credit-!payment!

Pensez à ce qui se passe lorsque la valeur de payment est négative. Comme 1--1 est valide en SQL, la conséquence est de commencer un commentaire `--'.

En utilisant notre implémentation des commentaires avec le serveur MySQL version 3.23.3 et plus récent, 1-- ceci est un commentaire ne pose pas ce type de problème.

Une autre fonctionnalité supplémentaire est que le client en ligne de commande mysql supprime toutes les lignes qui commencent par `--'.

Les informations suivantes sont destinées aux utilisateurs de MySQL avec des versions antérieures à la version 3.23.3 :

Si vous avez un programme SQL dans un fichier texte qui contient des commentaires au format `--', il est recommandé d'utiliser :

shell> replace " --" " #" < text-file-with-funny-comments.sql \
         | mysql database

au lieu du classique :

shell> mysql database < text-file-with-funny-comments.sql

Vous pouvez aussi éditer le fichier de commande ``lui-même'' pour remplacer les commentaires `--' par des commentaires `#' :

shell> replace " --" " #" -- text-file-with-funny-comments.sql

Puis, rétablissez-les avec :

shell> replace " #" " --" -- text-file-with-funny-comments.sql

1.8.5 Erreurs connues, et limitations de MySQL

1.8.5.1 Erreurs connues en 3.23 et corrigées ultérieurement

Les erreurs suivantes sont connues mais restent non corrigées en MySQL 3.23, car pour les corriger, il nous faudrait modifier trop de code : cela risquerait d'introduire des bugs bien pire. Ces bugs sont considérés comme 'non nuisibles' ou 'supportables'.

1.8.5.2 Bugs connus / limitations de MySQL

Les problèmes suivants sont connus, et sont en tête de liste pour être corrigés :

Les problèmes suivants sont connus et seront corrigés en leur temps :

Les bogues suivants sont connus dans les anciennes versions de MySQL :

Pour les bogues spécifiques aux systèmes d'exploitation, voyez la section sur la compilation et le port.

1.9 Les évolutions de MySQL (la liste des tâches)

Cette section liste les fonctionnalités que nous prévoyons d'ajouter à MySQL.

La liste est grossièrement réalisée dans l'ordre de priorité. Si vous voulez modifier cet ordre, achetez une licence de support, et dites-nous ce que vous souhaitez voir en premier. See section 1.4 Support MySQL et licences.

L'objectif est de supporter complètement la norme ANSI SQL99, tout en lui ajoutant de nombreuses améliorations. Le défi est de faire tout cela sans sacrifier la vitesse d'exécution, ni la qualité du code.

1.9.1 New Features Planned For 4.1

Les fonctionnalités suivantes ne sont pas encore en MySQL 4.1, mais il est prévu de les implémenter avant que MySQL 4.1 passe en version beta. Pour une liste des fonctionnalités déjà disponibles en MySQL 4.1, voyez section 1.6.1 Fonctionnalités disponibles depuis MySQL 4.1.

Le développement des nouvelles fonctionnalités est passé en version 5.0.

1.9.2 New Features Planned For 5.0

Les fonctionnalités suivantes sont prévues pour la version 5.0. Notez que comme nous avons de nombreux développeurs qui travaillent sur différents projets, il peut aussi y avoir des ajouts de fonctionnalités. Il y a aussi des chances que ces fonctionnalités soient ajoutées en MySQL 4.1. Pour une liste des fonctionnalités déjà disponibles en MySQL 4.1, voyez section 1.6.1 Fonctionnalités disponibles depuis MySQL 4.1.

Procédures stockées
Nouvelle fonctionnalité
Compatibilité avec les standards, portabilité et migration.
Amélioration de la vitesse
Internationalisation
Amélioration de l'ergonomie

1.9.3 Nouvelles fonctionnalités prévues pour 5.1

Nouvelle fonctionnalité
Amélioration de la vitesse
Amélioration de l'ergonomie

1.9.4 Ce qui doit être fait dans un futur proche

Nouvelle fonctionnalité
Compatibilité avec les standard, migration et portabilité.
Amélioration des performances
Internationalisation
Ergonomie
Nouveaux systèmes d'exploitation.

1.9.5 Ce qui est prévu à moyen terme

Le temps est indiqué en temps de travail et non pas en temps normal.

1.9.6 Ce qui n'est pas prévu

1.10 Comparatif de MySQL avec les autres serveurs SQL

Nos utilisateurs ont réussi à exécuter nos tests avec un grand nombre de serveurs SQL Open Source ou non. Nous connaissons des tests exécutés avec Oracle, DB/2, Microsoft SQL Server et d'autres produits commerciaux. Pour des raisons légales, nous ne pouvons pas les publier dans notre manuel de référence.

Cette section inclut la comparaison de MySQL avec mSQL pour des raisons historiques, et avec PostgreSQL car c'est aussi une base Open Source. Si vous avez des résultats de tests que nous pouvons publier, contactez-nous à benchmarks@mysql.com.

Pour une liste comparative des fonctions et types supportés, voyez la page web de l'utilitaire crash-me à l'adresse http://www.mysql.com/information/crash-me.php.

1.10.1 MySQL face à mSQL

Performance
Pour un véritable test de vitesse, consultez la suite de test de MySQL. See section 5.1.4 La suite de tests MySQL. Comme il n'y a pas de création de threads, que l'analyseur est plus petit, et que les fonctionnalités sont moins nombreuses, mSQL devrait être plus rapide avec : Comme ces opérations sont très simples, il est difficile d'être meilleur lorsque les coûts d'administration sont bien plus forts. Une fois la connexion établie, le serveur MySQL devrait être bien plus rapide. D'un autre coté, le serveur MySQL est plus rapide que mSQL (et que les autres serveurs SQL) avec :
Support de SQL
Efficacité d'utilisation de l'espace disque
C'est à dire, comment pouvez-vous réduire la taille de vos tables ? MySQL a des types très précis, et vous pouvez créer des tables avec un très petit espace. Un exemple de type de données pratique est le type MEDIUMINT qui occupe 3 octets. Si vous avez 100 millions d'enregistrement, économiser un octet par enregistrement est très important. mSQL2 a un jeu de type de données plus limité, ses tables sont donc plus grosses.
Stabilité
Il est difficile de juger de cela objectivement. Pour un début sur la stabilité du serveur MySQL, voyez section 1.2.3 Jusqu'à quel point MySQL est il stable ?. Nous n'avons aucune expérience avec la stabilité du code de mSQL, alors nous ne nous prononceront pas la-dessus.
Prix
Un autre point important est la licence. MySQL dispose d'une licence plus souple que mSQL, est il est aussi moins cher que mSQL. Quelque soit le produit que vous utilisez, n'oubliez pas de prendre un contrat de support par email ou une licence commerciale.
interface Perl
MySQL a la même interface avec Perl que mSQL, avec des fonctionnalités supplémentaires.
JDBC (Java)
MySQL supporte de nombreux pilotes JDBC : Le pilote recommandé est le pilote mm. Le pilote Resin est aussi bon (les tests sont bons) mais nous n'avons pas reçu beaucoup d'informations à son propos. Nous savons que mSQL a un pilote JDBC, mais nous n'avons pas l'expérience pour le comparer.
Vitesse de développement
MySQL a une petite équipe de développeur, mais nous sommes très habitués à coder en C et C++, très rapidement. Comme les threads, les fonctions, GROUP BY et de nombreuses autres fonctionnalités ne sont pas encore codées pour mSQL, il y a beaucoup faire pour nous rattraper. Pour mesurer cela, vous pouvez consulter le fichier d'historique de mSQL `HISTORY' pour l'an dernier, et le comparer avec la section nouveautés du manuel de référence MySQL (see section C Historique des changements MySQL). Il est alors assez évident de voir qui se développe plus vite.
Programmes utilitaires
Les deux projets mSQL et MySQL ont des contributions de tiers très intéressantes. Comme il est plus facile de porter vers les versions plus récentes (depuis mSQL vers MySQL), presque toutes les applications intéressantes de mSQL sont disponibles pour MySQL. MySQL est livré avec un programme simple msql2mysql qui corrige les différences de syntaxe entre mSQL et MySQL pour la plupart des fonctions de l'API C. Par exemple, il modifie les occurrences de msqlConnect() en mysql_connect(). Convertir un programme client de mSQL vers MySQL requiert un effort minimal.

1.10.1.1 Comment convertir des outils mSQL pour MySQL

Selon notre expérience, il ne prend pas longtemps pour convertir des outils tels que msql-tcl et msqljava qui utilisent l'API C de mSQL pour qu'ils fonctionnent avec l'API C de MySQL.

La procédure de conversion est la suivante :

  1. Exécutez le script shell msql2mysql sur la source. Ce script requiert le programme replace, qui est distribué avec le serveur MySQL.
  2. Compilez.
  3. Corrigez les erreurs de compilation.

Les différences entre l'API C de mSQL et de MySQL sont :

1.10.1.2 Différences entre les protocoles de communication de mSQL et de MySQL

Il y a tellement de différences qu'il est impossible (ou tout au moins très difficile) de ne pas les supporter toutes.

Les traits les plus caractéristiques de différences entre le protocole de communication de MySQL et de mSQL :

1.10.1.3 Comparatif des syntaxes SQL de mSQL 2.0 et MySQL

Types de colonnes

Serveur MySQL
Dispose des types traditionnels (entre autres : see section 6.5.3 Syntaxe de CREATE TABLE):
MySQL supporte aussi les attributs de types suivants :
mSQL2
Les types de colonnes de mSQL correspondent aux types de MySQL dans cette table :
mSQL type Type MySQL correspondant
CHAR(len) CHAR(len)
TEXT(len) TEXT(len). len est la taille maximale. Et LIKE fonctionne.
INT INT. Avec de nombreuses options supplémentaires.
REAL REAL. Ou FLOAT. Les versions 4 et 8 octets sont disponibles.
UINT INT UNSIGNED
DATE DATE. Utilise le format ANSI SQL plutôt que le format spécifique de mSQL.
TIME TIME
MONEY DECIMAL(12,2). Un nombre à virgule fixe.

Création d'index

Serveur MySQL
Les index peuvent être spécifiés au moment de la création de la table avec la commande CREATE TABLE.
mSQL
Les index doivent être créés après la création de la table, avec une commande CREATE INDEX séparée.

Insertion d'un identifiant unique dans une table

Serveur MySQL
Utilisez l'option de colonne AUTO_INCREMENT. See section 8.4.3.31 mysql_insert_id().
mSQL
Créez une SEQUENCE dans la table et sélectionnez la colonne _seq.

Obtenir un identifiant unique pour une ligne

Serveur MySQL
Ajoutez la clé PRIMARY KEY ou UNIQUE à la table et utilisez ceci. Nouveau en version 3.23.11 : si la clé PRIMARY ou UNIQUE est constituée d'une seule colonne et qu'il est de type entier, vous pouvez y faire référence avec _rowid.
mSQL
Utilisez la colonne _rowid. Notez bien que _rowid peut changer durant ce temps, en fonction de nombreux facteurs.

Lire la date de dernière modification d'une colonne

Serveur MySQL
Ajoutez une colonne de type TIMESTAMP dans la table. Cette colonne prend automatiquement la date et l'heure courante lors des commandes INSERT ou UPDATE si vous ne lui affectez pas de valeur, ou si vous lui donnez la valeur NULL.
mSQL
Utilisez la colonne _timestamp.

Comparaisons avec la valeur NULL

Serveur MySQL
MySQL suit la norme ANSI SQL, et la comparaison avec une valeur NULL retourne toujours NULL.
mSQL
Avec mSQL, NULL = NULL est vrai (TRUE). Vous devez changer =NULL en IS NULL et <>NULL en IS NOT NULL lorsque vous portez du vieux code de mSQL vers MySQL.

Comparaisons de chaînes

Serveur MySQL
Normalement, la comparaison de chaînes est faîte sans tenir compte de la casse, et l'ordre de tri est déterminé par le jeu de caractères courant (ISO-8859-1 Latin1 par défaut). Si vous ne le souhaitez pas, déclarez vos colonnes avec l'option BINARY, qui fera que les comparaisons peuvent être faites en fonction de l'ordre ASCII utilisé sur l'hôte MySQL.
mSQL
Toutes les comparaisons de chaînes sont faites en tenant compte de la casse, en fonction de l'ordre ASCII.

Recherche insensible à la casse

Serveur MySQL
LIKE est un opérateur sensible ou non à la casse, suivant les colonnes utilisées. Si possible, MySQL utilise des index si l'argument de LIKE ne commence pas par un caractère joker.
mSQL
Utilise CLIKE.

Gestion des espaces finaux

Serveur MySQL
Supprime tous les espaces de fin de chaînes dans les colonnes CHAR et VARCHAR. Utilisez les colonnes de type TEXT si ce comportement n'est pas souhaité.
mSQL
Conserve les espaces finaux.

clause WHERE

Serveur MySQL
MySQL établit correctement les priorités : AND est calculé avant les OR. Pour obtenir le comportement de mSQL avec MySQL, utilisez les parenthèses (tel que présenté dans l'exemple un peu plus loin).
mSQL évalue les opérations de gauche à droite. Cela signifie que
certaines opérations logiques exprimées avec trois arguments ou plus ne peuvent être exprimées. Cela signifie aussi que vous devez modifier des requêtes lorsque vous passez à MySQL : tout ce que vous avez à faire est d'ajouter des parenthèses. Supposez que vous avez le code mSQL suivant :
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
Pour le passer sur MySQL et le faire fonctionner comme sur mSQL, vous devez ajouter ces parenthèses :
mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));

Contrôle d'accès

Serveur MySQL
Possède des tables qui stockent les droits de chaque utilisateur, hôte et base. See section 4.2.6 Comment fonctionne le système de droits.
mSQL
Dispose d'un fichier `mSQL.acl' dans lequel vous pouvez ajouter et modifier les droits d'accès des utilisateurs.

1.10.2 Comparatif de MySQL avec PostgreSQL

Lorsque vous lirez ces sections, notez bien que les deux produits évoluent continuellement. Les équipes de MySQL AB et de PostGreSQL travaillent toutes deux à rendre leur base les meilleures possibles, et elles présentent toutes les deux des alternatives sérieuses aux bases de données commerciales.

La comparaison qui suit a été fait par MySQL AB. Nous avons essayé d'être aussi précis et objectifs que possible, mais même si nous connaissons MySQL sur le bout des doigts, nous n'avons pas une connaissance aussi pointues des possibilitées de PostgreSQL : nous pourrions être en erreur. Nous corrigerons ces erreurs dès qu'elles seront portées à notre attention.

Nous souhaitons noter que PostgreSQL et MySQL sont deux produits largement répandus, mais qui présentent des objectifs différents, même si tous les deux se dirigent vers la compatibilité ANSI SQL. Cela signifie que pour certaines applications, MySQL est bien plus optimisé, et pour d'autres, c'est PostGreSQL. Lorsque vous choisissez votre serveur de base de données, commencez par vérifier que le jeu de fonctionnalités de votre base correspond bien à votre application. Si vous avez besoin de vitesse pure, MySQL est probablement votre choix. Si vous avez besoin des fonctionnalités que PostGreSQL propose, utilisez PostgreSQL.

1.10.2.1 Stratégies de développement de MySQL et PostgreSQL

Lorsque nous ajoutons des fonctionnalités à MySQL, nous mettons un point d'honneur à le faire de manière optimale et définitive. Le code doit être tellement bon que vous n'y verrez rien à ajouter dans un futur accessible. Nous sommes peu enclins à sacrifier la vitesse aux fonctionnalités, mais nous faisons notre possible pour trouver une solution qui donnera le meilleur. Cela signifie que le développement prend plus de temps, mais que le résultat en vaut la peine. Ce type de développement n'est possible que parce que le code est vérifié par quelques (actuellement 2) personnes avant qu'il ne soit inclus dans le serveur.

Chez MySQL AB, nous croyons aux publications fréquentes car cela nous permet de transmettre nos nouveautés plus rapidement aux utilisateurs. Comme nous publions une nouvelle version mineure toutes les trois semaines, et une version majeure chaque année. Toutes les versions sont testées soigneusement, avec nos outils de tests et sur de nombreuses plate-formes.

PostgreSQL est basé sur un noyau de nombreux contributeurs. Avec cette configuration, il est logique d'ajouter de nombreuses fonctionnalités, au lieu de les implanter optimalement, car il sera toujours temps d'optimiser lorsque le besoin s'en fera sentir.

Une autre différence majeure entre MySQL et PostgreSQL est que presque tout le code de MySQL est fait par des développeurs employés par MySQL AB et qui travaillent toujours sur ce code. Les seules exceptions sont le moteur de transaction et la librairie d'expressions régulières.

Le contraste est saisissant avec le code de PostgreSQL, dont la majorité est réalisée par un grand groupe de personnes avec différentes sensibilités. Ce n'est que récemment que les développeurs de PostGreSQL ont annoncé qu'ils ont eu finalement le temps de faire le tour du code de la version courante.

Les deux stratégies de développement présentées ont leur mérites et inconvénients. Chez MySQL AB, nous pensons, bien sur, que notre modèle est le meilleur car il conduit à une meilleure cohérence du code, et, à notre avis, moins de bogues. Comme nous sommes les auteurs du serveur MySQL, nous sommes les mieux placés pour coordonner les publications.

1.10.2.2 Comparaison des fonctionnalités de MySQL et PostgreSQL

Sur la page crash-me (http://www.mysql.com/information/crash-me.php) vous pouvez trouver une liste des avantages et limitations que l'on peut détecter avec un programme. Notez bien que de nombreuses évaluations numériques peuvent être modifiées avec les options de démarrage des différentes bases de données. Cette page web est extrêmement pratique si vous voulez vous assurer que votre application fonctionnera sur différents serveurs SQL, ou si vous voulez convertir votre application d'un serveur à l'autre.

MySQL offre les avantages suivants sur PostgreSQL:

Les inconvénients de MySQL face à PostgreSQL:

PostgreSQL offre actuellement les avantages suivants sur MySQL :

Notez que comme nous connaissons le plan de développement de MySQL, nous avons inclus la table suivante, avec les version du serveur MySQL où les fonctionnalités seront supportées. Malheureusement, nous ne pouvions pas faire les mêmes comparaisons avec les fonctionnalités à venir de PostgreSQL, car nous ne connaissons pas le plan de développement de PostgreSQL.

Fonctionnalité version de MySQL
Sous-sélections 4.1
Clé étrangères 5.0 (3.23 avec InnoDB)
Vues 5.0
Procédures stockées 5.0
Triggers 5.0
Unions 4.0
Jointures totales 4.1
Contraintes 4.1 ou 5.0
Curseurs 4.1 ou 5.0
R-trees 4.1 (pour les tables MyISAM)
Tables héritées Non prévu
Type de données extensible Non prévu

Autres raisons de considérer PostgreSQL :

Les inconvénients de PostgreSQL face à MySQL :

Pour une liste complète des inconvénients, examinez la première table de cette section.

1.10.2.3 Performances comparées de MySQL et PostgreSQL

Le seul test de vitesse Open Source que nous connaisssons et qui peut être utilisé pour tester les performances de MySQL et de PostgreSQL (et d'autres bases de données) est le nôtre. Il est disponible à l'adresse http://www.mysql.com/information/benchmarks.html.

Nous avons demandé de nombreuses fois aux développeurs de PostgreSQL et aux utilisateurs de PostgreSQL de nous aider à développer et améliorer ce test, pour en faire le meilleur test possible, mais nous n'avons pas reçu de réponse de leur part.

Nous, les développeurs MySQL, avons, à cause de cela, passé de nombreuses heures à obtenir les meilleures performances de PostgreSQL pour ces tests, mais comme nous ne connaissons pas intimement le serveur PostgreSQL, nous sommes certains d'être passé à coté de certains points. Sur la page de test, nous avons documenté exactement comment nous avons exécuté le test, pour qu'il soit facile à tout le monde de reproduire et de confirmer nos résultats.

Les tests sont généralement exécutés avec et sans l'option --fast. Lorsque l'option --fast est utilisée, nous tentons d'utiliser tous les trucs connus du serveur pour que l'exécution soit aussi rapide que possible. L'idée est que le mode normal doit montrer comment le serveur devrait se comporter avec une configuration normale, et le mode --fast montre comment le serveur se comporte si le développeur utilise toutes les extensions du serveur pour accélérer son application.

Lorsque nous exécutons PostgreSQL avec l'option --fast, nous exécutons la commande VACUUM après chaque modification importante de la table, et après l'effacement de table, pour conserver la base dans un état parfait pour les prochaines sélections. Le temps nécessaire à l'exécution de la commande VACUUM est mesuré séparément.

Lorsque PostgreSQL 7.1.1 fonctionne, nous n'avons pu le faire fonctionner avec l'option --fast car durant les test d'INSERT, le postmaster (démon PostgreSQL) s'est arrété, et la base était tellement corrompue qu'il a été impossible de redémarrer le postmaster. Après un deuxième problème identique, nous avons décidé de reporter les tests --fast jusqu'à la prochaine version de PostgreSQL. Les détais sur la machine avec laquelle nous avons exécuté les tests sont disponible sur la page de tests.

Avant de passer aux autres tests de performances que nous connaissons, nous souhaitons vous donner des détails sur le contexte des tests.

Il est très facile d'écrire un test qui montre que toutes les bases du monde sont les meilleures, en se limitant simplement aux points forts de la base, et en ne testant rien qui soit une faiblesse. De plus, si la conclusion se ramène à un seul chiffre, c'est encore plus facile.

Cela revient à mesurer la vitesse de MySQL par rapport à PostgreSQL en regardant simplement les temps moyens des tests de MySQL sur notre page. En se basant sur ces informations, notre serveur MySQL serait 40 fois plus rapide que PostgreSQL, ce qui est, bien sûr, faux. Nous pourrions même rendre les choses encore pires en prenant les tests où PostgreSQL a les pires performances, et dire que MySQL est plus de 2000 fois plus rapide que PostgreSQL.

Le fait est que MySQL fait un certain nombre d'optimisation que PostgreSQL ne fait pas. C'est aussi vrai, bien sûr, dans le sens inverse. Un optimiseur SQL est un programme complexe, et une compagnie peut passer des années à le rendre de plus en plus rapide.

Lorsque vous regardez les résultats des tests, vous devriez vous limiter aux opérations que vous utilisez dans votre application, et utiliser simplement ces résultats pour décider quelle base de données est la plus adaptée à vos besoins. Les résultats de tests vous montrent quelles opérations sont le point faible de chaque base, et vous donnent des indications sur ce qu'il faudra éviter de faire.

Nous connaissons deux tests de performances qui indiquent que PostgreSQL est plus rapide que MySQL. Ces deux tests sont faits dans un environnement multi-utilisateur, un test que nous, chez MySQL AB, nous n'avons pas eu le temps de mettre en place car c'est une tâche énorme de le faire pour que ce soit équitable pour chaque base.

Le premier est le test payant, effectué pour Great Bridge, une entreprise qui a tenté durant 16 mois de bâtir un modèle d'affaires avec PostgreSQL mais qui a désormais cessé les opérations. C'est probablement le pire test que nous ayons jamais vu. Non seulement ce test était bâti pour ne tester que les points forts de PostgreSQL, mais il était totalement déloyal pour toutes les autres bases de données utilisées dans le test.

Note : nous savons aussi que même certains des développeurs principaux de PostgreSQL n'ont pas aimé la manière avec laquelle Great Bridge a dirigé le test, et nous ne blâmons pas l'équipe de PostgreSQL pour ces tests.

Ce test a été condamné dans de nombreux articles et groupes d'utilisateurs, et nous ne citerons que quelques-uns des points qui étaient incorrects.

Tim Perdue, un inconditionnel de PostgreSQL et un utilisateur réticent de MySQL, publia une comparaison sur PHPbuilder (http://www.phpbuilder.com/columns/tim20001112.php3).

Lorsque nous avons eu connaissance de la comparaison, nous avons téléphoné à Tim Perdue à ce propos, car il y avait de nombreux résultats étranges dans ses publications. Par exemple, il statuait que MySQL avait un problème avec 5 utilisateurs durant ses tests, alors que nous avons des utilisateurs avec des machines similaires, qui utilisent MySQL avec plus de 2000 utilisateurs simultanés, et 400 requêtes par secondes. (Dans ce cas, la limite est la bande passante du réseau, pas le serveur SQL).

Il semblait qu'il utilisait un noyau Linux qui avait des problèmes avec les threads, comme les noyaux avant le 2.4 qui avait des problèmes avec les threads sur les machines à plusieurs processeurs. Nous avons documenté dans le manuel comment corriger ce problème, et Tim devrait être bientôt au courant de ce problème.

Les autres problèmes possibles pourraient provenir d'une vieille librairie glibc ou du fait que MySQL n'utilise pas une version exécutable de notre site web, qui est bâtie avec une version corrigée de glibc library. Dans ces cas, les symptômes sont ceux que Tim a mesuré.

Nous avons demandé à Tim d'avoir accès a ses données pour que nous puissions reproduire le test, et s'il pouvait vérifier la version de MySQL sur sa machine pour voir ce qui n'allait pas. Il a promis qu'il nous contacterait mais n'a rien fait à ce jour.

A cause de cela, nous ne pouvons pas non plus avoir confiance en ce test.

Avec le temps qui passe, les technologies évoluent, et les tests précédents ne sont désormais plus valables. Le serveur MySQL dispose d'un jeu de gestionnaires de tables, avec des choix très différents sur la vitesse et les fonctionnalités. See section 7 Types de tables MySQL. Il serait intéressant de voir comment les tests ci-dessus s'effectuent avec les différents gestionnaires de tables de MySQL. PostgreSQL a aussi, bien sûr, de nouvelles fonctionnalités depuis que ces tests ont été menés. Comme ces tests ne sont pas publiquement disponibles, il n'y a pas moyen pour nous de savoir comment les bases se comportent de nos jours avec ces tests.

Conclusion :

Les seuls tests qui existent aujourd'hui, disponibles au téléchargement pour tous, et que vous pouvez exécuter avec MySQL, PostgreSQL sont les tests de MySQL. Chez MySQL AB, nous croyons que les bases de données Open Source devraient être testées avec des outils Open Source ! C'est le seul moyen de nous assurer que personne ne peut faire de tests que personne ne peut reproduire, et les utiliser pour proclamer que sa base est meilleure que les autres. Sans connaître le fond des choses, il est impossible de répondre à une telle déclaration.

Ce que nous trouvons étrange est que chaque test que nous avons vu à propos de PostgreSQL est impossible à reproduire, et indique que PostgreSQL est le meilleur dans la plupart des tests, alors que les nôtres , que tout le monde peut reproduire, montrent le contraire. Avec cela, nous ne voulons pas dire que PostgreSQL n'est pas bon dans de nombreuses tâches (il l'est !!), ou qu'il n'est pas plus rapide que MySQL dans certaines conditions. Nous voulons juste voir un test équitable où PostgreSQL se comporte bien, pour que nous puissions avoir une compétition amicale !

Pour plus d'informations sur nos tests, voyez section 5.1.4 La suite de tests MySQL.

Nous travaillons actuellement sur une suite de tests de perfomance qui inclue des tests multi utilisateurs, et une meilleure documentation sur les tests individuels pour indiquer ce qu'ils font et comment ajouter d'autres tests à la suite.


Go to the first, previous, next, last section, table of contents.