, sqlpro Une critique objective mais sans pitié pour MySQL...Voici une liste non exhaustive des points pour lesquels je considère que MySQL est un ersatz de SGBDR C/S et qui peuvent poser problème, tant au niveau des performances des applications que de la qualité des données (certains résultats de requête sont mathématiquement faux). En fait, dès sa conception reposant directement sur l'OS, MySQL a été mal conçu. Parmi les principaux défauts de mySQL notons : la pauvreté de la gestion de la concurrence (en pratique les performances de MySQL chutent à plus de 5 utilisateurs en concurrence, alors que tous les autres SGBDR acceptent des centaines d'utilisateurs en parallèle sans broncher), la gestion plus que pauvre des transactions, des sauvegardes impossible à chaud, le manque de fonctionnalité des contraintes SQL, un SQL hors norme et très incomplet (près de 20 ans de retard - certaines requêtes étant infaisables avec MySQL), et pour couronner le tout, la destruction de certaines de vos données ! ... bref un ensemble de problèmes édifiants pour un SGBDR qui se vante d'être le meilleur sans qu'aucun benchmark n'ai jamais étayé cette affirmation !
Voici quelques un des griefs objectifs sur lequel je me base pour affirmer mes dires :
Gestion des threads très pauvre :
- pas de possibilité de donner la priorité à certains threads
- en principe : une connexion = un thread, mais cela ne fonctionne pas dans tous les cas
- aucun moyen d'être sûr qu'il y a X threads en activité
- trop de changement de contexte des threads
- sous utilisation du multi processeur, en particulier lorsque le serveur est chargé et à partir de 4 à 8 CPU
- les requêtes en sont pas multithreadées (processus unique)
- impossibilité d'utiliser les architecture NUMA
- impossibilité d'utiliser AWE sous Windows 32 bits
Gestion mémoire peu souple :
- pas de process unique d'allocation mémoire : chaque moteur à le sien !
- taille du buffer de tri non flexible (comme certains autres tampon mémoire)
- arrive à cours de mémoire lorsque le nombre de threads devient important
- utilise rarement toute la mémoire lorsque seulement quelques threads sont actif et qu'ils le pourraient
Gestion peu fiable des méta données voire inexistantes :
- MySQL n'a pas de méta données statiques (tables systèmes)
- les informations sont générées à la demande depuis les fichiers .frm
- rare sont les fonctions de méta données permettant d'obtenir des informations sur une session (nom d'hôte, adresse IP ou MAC, nom d'application...)
- les opérations de lecture des méta données ne sont pas transactionnelle (on peut donc obtenir un résultat faux).
Indexation restreinte :
- les techniques d'indexation sont très limitées comme le sont les paramètres de création d'un index
- des index sur des colonnes calculées ou des expressions sont impossibles
- des index partiaux ou filtrés ne sont pas pris en charge
- les vues matérialisées ou indexées n'existent pas sous MySQL
- pas d'indexation possible des données XML ni SIG (spatial)
- pas d'index couvrant (clause INCLUDE).
Moteur de requête très limité :
- exécution de certaines opérations strictement dépendante de l'écriture
- exécution parallèle des requêtes très limitée
- gestion du cache des procédures peu évolué (la paramétrisation semble inexistante)
- parseur gourmand en ressources, spécialement pour des petites requêtes
- pas de réécriture pour l'optimiseur (algébrisation plus que faible - test de la requête de Chris Date infaisable, voir : http://blog.developpez.com/sqlpro/p5919/langage-sql-norme/votre-base-de-donnees-est-elle-intellige/ )
- utilisation outrancière de tables temporaires pour la résolution des requêtes
- incapacité de l'optimiseur à synthétiser les opérations dans les vues (simplification des jointures par exemple)
- pas d'optimisation sémantique (sachant tirer partit des contraintes)
Exécution des procédures exécrable :
- mauvaise gestion du cache des procédure à travers les différentes connexions
- pré verrouillage des tables (sauf moteur InnoD![]()
- gestion des curseurs plus que limitée :
-- aucun curseur scrollable (ils sont systématiquement matérialisés, impossible d'avancer autrement qu'en avant et d'une ligne)
-- pas de possibilité de faire du READ ONLY pour éviter de verrouiller les tables
-- impossibilité d'imbriquer la lecture des curseurs
-- pas de possibilité de mettre à jour la ligne courante du curseur
-- aucun curseur dynamique
- le code des déclencheurs n'est pas partagé entre les différentes tables ouvertes
- aucune possibilité d'utiliser un langage externe (sauf pour coder les UDF)
- déclencheurs poudre aux yeux : on ne peut pratiquement rien faire dans un trigger DML !
Réplication peu fiable :
- la réplication ne peut être utilisé dans des contextes de haute sécurité car elle ne garantie pas l'intégrité de la base
- pas de réplication synchrone
- pas d'outil pour vérifier la consistance des données répliquées
- pas de mécanisme intégré de gestion de la haute disponibilité (genre log shipping ou database mirroring)
Convention de nommage très dépendante des moteurs :
- du fait que les tables sont stockées chacune dans un fichier différent, leurs noms peut être sensible ou non à la casse
- le portage d'un environnement à l'autre est difficile (Unix étant Case Sensitive, alors que ce n'est pas le cas de Windows ou MAC OS).
- du fait que les contraintes sont dépendantes du moteur, la portabilité en souffre aussi
SQL pauvre (MySQL ne respecte même pas la norme de 1992 !) :
- pas de domaines
- pas de schémas SQL
- pas de collation insensible aux accents
- pas de requêtes récursives
- des NULLs pas vraiement NULL !!! (voir ci après)
- pas d'opérateur ensemblistes comme INTERSECT ou EXCEPT
- pas d'expression de tables (CTE)
- pas de fonctions de fenêtrage
- pas de relationnel objet (CREATE TYPE ... )
- mélange de calcul agrégés et non agrégés sans clause GROUP BY avec résultat imprévisible !
- groupage OLAP anormatif et incomplet (syntaxe incorrecte de CUBE et ROLLUP, pas de fonction GROUPINGS, pas de GROUPING SET, NULL LAST, NULL FIRST...)
- sous requêtes très limitées dans les ordres de mise à jour
- contraintes dépendantes du moteur
- contraintes CHECK plus que limitées
- contraintes FOREIGN KEY farfelues et non normatives (voir ci après)
- impossible de créer des fonctions (UDF) table.
- pas de type xml et méthodes XQuery/XPath pour la manipulation des documents XML plus que limitées
- type TIME farfelu donnant des résultats incorrect dans les calculs (en sus du mélange physique logique avec UNIX_TIMESTAMP()...)
- type ENUM avec conversions implicites farfelues, donnant des résultats fantaisistes
- certaines requêtes classiques de mise à jour sont infaisable en SQL (viol de la règle de CODD n°7), en effet MySQL ne fonctionne pas de manière ensembliste mais itérative !
- syntaxe SQL très perverse... Certaines commandes passent, ne font aucune erreur de syntaxe, mais ne font rien... Exemple FOREIGN KEY ... SET DEFAULT...
- insertion de données fausses par conversions silencieuses (par exemple une date inexistante comme le 31/02/2000... ou un nombre incompatible avec le format du type et qui va être tronqué : 99999999 dans un NUMERIC(5,2) donne 999.99 !)
- ordre spécifique totalement farfelus en lieu et place des ordres SQL normatif... Exemple REPLACE ... INTO (alors que MERGE est la norme !)
et pour couronner le tout la fameuse date 0000-00-00 qui constitue un bug irréfragable
NOTA : tout ceci à des conséquences dramatiques sur les performances. A lire sur le sujet : http://blog.developpez.com/sqlpro/p9821/langage-sql-norme/agregation-d-intervalles-en-sql-1/
Gestion des transactions plus que minimale :
- seul le moteur innodb accepte les transactions
- le niveau d'isolation par défaut (REPEATABLE READ) est trop élevé pour un usage courant. Il s'ensuit des blocages intempestifs
- le niveau d'isolation snapshot n'est pas implémenté
- pas de gestion automatique de résolution des conflits de verrous mortels dans tous les cas
- point de sauvegarde (SAVEPOINT) limités
- il n'est pas possible de faire un COMMIT ou un ROLLBACK dans un trigger
- pas de déclencheur INSTEAD OFF
- pas de déclencheur DDL
- pas de déférabilité des contraintes
Fonctionnalités poudre aux yeux :
- indexation full texte (recherches textuelle) plus que limitée
- SIG très pauvre et inexploitable comparativement à PostGreSQL par exemple, et bien entendu Oracle ou MS SQL Server
- outils de haute disponibilités très limités à inexistant (pas de log shipping, pas de mirroring...)
- partitionnement profondément anti performant
Gestion du stockage des données inexistantes :
- pas de possibilité de définir la stratégie de gestion des espaces de stockage (par exemple impossible de faire de la pré réservation des espaces de stockage, ni de gérer la stratégie de croissance...)
- partitionnement des données plus cosmétique que technique (et générant de nombreux problèmes de performances)
- pas de stockage compressé des données
- pas de stockage cryptées des données
Gestion des privilèges et sécurité minimaliste :
- sécurité des connexions et des utilisateurs très limitée
- pas de gestion des rôles
- pas de privilèges possible au niveau schéma SQL
- pas de privilèges possible au niveau bases de données SQL
- pas de privilèges possible au niveau serveur
- impersonnalisation impossible
- pas de cryptage des données intégrée
- pas d'authentification possible par certificats
- pas d'outil d'audit de sécurité...
Sauvegardes irréalistes :
- il n'est pas possible de réaliser une sauvegarde à chaud en s'assurant que la base reste intègre
- aucun parallélisme possible pour la sauvegarde (sur plusieurs fichiers, à plusieurs destination, par plusieurs threads...)
- pas de sauvegarde compressées (permettant de réduire le temps de génération de la sauvegarde)
- la durée des sauvegardes et plus encore la durée de la restauration sont des opérations prohibitives pour de grosses bases.
Pas vraiment un logiciel libre :
- il n'est pas open source (http://www.xaprb.com/blog/2008/05/14/mysql-free-software-but-not-open-source/)
il convient de payer la licence :
- soit paiement sous forme de code : vous ne payez pas la licence, mais mettez le code de votre appli à la disposition de tous
- soit paiement sous forme de licence
Car en choisissant l'option GPL, soit disant gratuite, cela contamine le code de votre application. Lire la discussion suivante : http://www.developpez.net/forums/d1133986/bases-donnees/decisions-sgbd/choix-sgbd/#post6264561
aucune garantie :
Voici ce que donne certaines sorties de message d'outils MySQL :
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
S'agissant de logiciels libre, de manière générale, la dissolution des responsabilité pose de grave problème aux éditeurs qui l'oublient trop souvent. En effet, si un logiciel est mis en cause dans un accident par exemple (comme ce fut le cas du surdosage mortel de l'appareil de radio thérapie d'Épinal) l'éditeur ne peut se retourner contre le fabriquant de MySQL puisque sa licence exclu d'emblée toute responsabilité. Il ne reste plus à l'éditeur qu'a tester toutes les possibilité ce qui peut s'avérer long fastidieux et horriblement couteux !
Correction des bugs :
Du fait de l'absence des responsabilités, l'éditeur n'est pas tenu de corriger ses principaux bugs, et c'est ce qu'il semble faire dans la pratique, privilégiant la sortie de "nouveautés" peu abouties au détriment de la corrections des défauts existants...
D'autant que certains bugs font froid dans le dos en matière de sécurité ! Par exemple celui de la troncature des chaînes de caractères... A lire : http://www.mcherifi.org/hacking/la-faille-mysql-column-truncation.html
Vous avez dit performances ? On plaisante !
Enfin, certains affirment haute et fort que MySQL est le plus rapide des SGBDR... C'est peut être vrai, à condition de n'avoir jamais qu'un seul utilisateur... En effet, dans tous les benchmarks comparatifs et ce depuis plus d'une décennie, MySQL devient un escargot dès que la concurrence fait rage, face à des SGBDR bien conçus comme PostGreSQL, Oracle, IBM Db2, Sybase ou SQL Server... En particulier après 5 utilisateur, MySQL commence à plonger !
Quelques exemples parmi d'autres :
http://www.randombugs.com/linux/mysql-postgresql-benchmarks.html
http://tweakers.net/reviews/657/1/database-test-dual-intel-xeon-5160-introduction.html
http://jayant7k.blogspot.com/2008/06/mysql-versus-postgresql.html
Un petit benchmark comparant MySQL, PostGreSQL et MS SQL Server sur une requête un peu compliquée mais avec une seule table en lecture....
On y relève que MySQL est 1000 fois moins rapide que PostGreSQL et 6000 fois moins que SQL Server.. une paille !
Un large choix de moteur ?... de qui se moque t-on !!!
On nous assène à longueur de temps que la joie dans MySQL c'est qu'il dispose de plusieurs moteurs... Et l'on présente cet argument comme très intéressant. Mais c'est prendre les gens pour des imbéciles :
- chaque moteur ayant des limites et spécificité différentes je ne peut pas avoir SIMULTANÉMENT certaines fonctionnalités. Par exemple il est impossible d'avoir à la fois l'indexation textuelle et les transactions !
- la syntaxe des commandes dépend du moteur. Si vous êtes éditeur et que votre client n'utilise que tel moteur, alors il vous faut récrire une grande partie de l'application...
- les développeurs doivent apprendre plusieurs syntaxes en fonction des commandes spécifiques de MySQL et comme ils ne le retiennent pas, il doivent sans arrêt corriger leur code, d'où une perte de temps de développement.
En fait ce choix de moteurs cache l'incapacité de faire un outil homogène du fait des problèmes techniques interne à MySQL... Bref, l'oin d'être un avantage, cela constitue l'un des inconvénients majeurs de MySQL...
Ce qui est dommage c'est qu'il existe un SGBDR réellement libre et parfaitement bien conçu : PostGreSQL...
Ce qui explique le succès de MySQL est le lobbying qu'a fait la société MySQLAB en fourguant son SGBD à de nombreux hébergeurs gratuitement afin de noyer la concurrence. Opération brillamment réussie, mais quand on voit les dégâts que cela fait en production... En effet, nombreux sont les sites web marchand, qui, par exemple lorsque la montée en charge se fait sentir sont incapable d'absorber la charge...
Il n'est qu'a voir les nombreuses critiques et les problèmes sans noms, les crash et autres arrêt intempestifs qui émaillent les forums consacrés à ce pseudo SGBDR...
Forums MySQL de DVP
Forums MySQL de MySQL AB / SUN / Oracle
Pour poursuivre votre lecture sur les erreurs incroyables de MySQL :
http://sql-info.de/mysql/gotchas.html
http://www.productcriticblog.com/2007/03/who-else-wants-to-use-postgressql.html
http://casey.shobe.info/documents/mysql_limitations/
Bref, j'ai l'impression que MySQL n'est qu'un gigantesque brouillon !
--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

mysql>
SELECT x, x+1, x-1, x=1, x='3'
FROM meeeeeh;
+------+------+------+------+-------+
| x | x+1 | x-1 | x=1 | x='3' |
+------+------+------+------+-------+
| 3 | 2 | 0 | 1 | 1 |
+------+------+------+------+-------+mysql>
CREATE TABLE meeeeeh
(x ENUM( '3','2' ),
y ENUM( '3','2' ),
z ENUM( '2','3' ),
peutetre ENUM( 'true','false'));
mysql>
INSERT INTO meeeeeh
VALUES (1, NULL, NULL, 1),
(2, NULL, NULL, 0);
mysql>
SELECT *
FROM meeeeeh;
+------+------+------+----------+
| x | y | z | peutetre |
+------+------+------+----------+
| 3 | NULL | NULL | true |
| 2 | NULL | NULL | |
+------+------+------+----------+
mysql>
UPDATE meeeeeh
SET y = x+1,
z = x;
mysql>
SELECT *
FROM meeeeeh;
+------+------+------+----------+
| x | y | z | peutetre |
+------+------+------+----------+
| 3 | 2 | 3 | true |
| 2 | 3 | 2 | |
+------+------+------+----------+
mysql>
UPDATE meeeeeh
SET y = x+1,
z = x+0,
peutetre = NOT peutetre;
mysql>
SELECT *
FROM meeeeeh;
+------+------+------+----------+
| x | y | z | peutetre |
+------+------+------+----------+
| 3 | 2 | 2 | |
| 2 | 3 | 2 | true |
+------+------+------+----------+mysql>
SELECT 0 IN ('a','b');
+----------------+
| 0 IN ('a','b') |
+----------------+
| 1 |
+----------------+mysql>
CREATE TABLE truc
(x INT PRIMARY KEY );
mysql>
INSERT INTO truc
VALUES (10),(20),(19),(30);
mysql>
UPDATE truc
SET x = x/2;
ERROR 1062 (23000): Duplicate entry '10' for key 'PRIMARY'
mysql>
SELECT *
FROM truc;
+----+
| x |
+----+
| 5 |
| 10 |
| 19 |
| 30 |
+----+Aucune requête ne se fait sur des données sur disque. Pour traiter la moindre requête (lecture ou écriture comprise) il faut que les données soient présentent en RAM. or le SGBDR conserve toutes les données en mémoire tant qu'il y a de la RAM, donnant ainsi l'impression d'aller de plus en plus vite. Plus vous requêterez, plus vous placerez en RAM, plus ce sera rapide...
SELECT c.cmn_nom, d.dpt_numero, d.dpt_nom, r.rgn_nom
FROM tr_commune_cmn c
INNER JOIN tr_departement_dpt d ON d.dpt_id = c.cmn_id_departement
INNER JOIN tr_region_rgn r ON r.rgn_id = d.dpt_id_regionCREATE TABLE T
(
id INT NOT NULL,
text1 VARCHAR(32) NOT NULL,
text2 VARCHAR(32) NOT NULL DEFAULT 'toto'
);
INSERT INTO T (id) VALUES (1);
INSERT INTO T (text1) VALUES('test');
mysql> SELECT * FROM T;
+----+-------+-------+
| id | text1 | text2 |
+----+-------+-------+
| 1 | | toto |
| 0 | test | toto |
+----+-------+-------+
2 rows in set (0.00 sec)CREATE TABLE T1 (C1 INT);
INSERT INTO T1 VALUES (1);
INSERT INTO T1 VALUES (1);
INSERT INTO T1 VALUES (2);
CREATE INDEX X ON T1 (C1);
CREATE TABLE T2 (C2 INT, C1 INT);
ALTER TABLE T2 ADD CONSTRAINT FK FOREIGN KEY (C1) REFERENCES T1 (C1);A noter que MySQL vous permet d'enregistrer certaines dates qui ne sont pas strictement légales, par exemple 1999-11-31. La raison est que nous pensons que la vérification des dates est à faire niveau application.
Vous pouvez spécifier une valeur de type TIME avec différents formats :
*
Une chaîne au format 'D HH:MM:SS.fraction'. (Notez que MySQL ne stockera pas la fraction d'une valeur TIME.)
Ce que je reproche à MySQL est simple : faire croire qu'il s'agit d'un SGBD Relationnel, alors que cela n'est pas vrai. C'est une simple encapsulation de SQL sur de la gestion de données en fichiers...
Vous devez être identifié pour poster un commentaire.
Copyright © 2000-2012 - www.developpez.com