|  |  
 
Cette section a été écrite par des développeurs MySQL, et il doit être lu avec quelques reserves. Cependant, il n'y a AUCUNE erreur factuelle, autant que nous le sachions.
 
Pour une liste complète de toutes les limites, fonctions et types, allez à  crash-me(en anglais). 
Performance
Pour une comparaison de performances valide, consultez la suite de tests.
  11  La suite de tests de MySQL.
Parce qu'il n'y a pas de création de thread général, que l'analyseur syntaxique est compact, les fonctionnalités peu nombreusese, et
la sécurité simple, mSQLest plus rapide dans les tches suivantes :
Etant donné que ces opéartions sont simples, il est très difficile de les surpasser dès qu'on a une partie administrative plus importante. Apres l'établissement de la connexion, MySQL devrait être plus rapide.
D'un autre coté, MySQL est beaucoup plus rapide que
Tests qui effectuent des connexions/deconnexion repetées, avec une requête tres simple entre les deux.
Opérations INSERTdans des tables simples, avec quelques colonnes et clés.
CREATE TABLEetDROP TABLE.
SELECTsur ce qui n'est pas un index. (l'analyse d'une table est très simple). mSQL(et que
la plus part des implémentation SQL) dans les cas suivants :
Opérations SELECTcomplexes.
Récupération de résultat très importants (MySQL a un protocol pluls rapide, plus sur et bien meilleur).
Tables à longueur d'enregistrement variable, étant donné que MySQL les gère mieux, 
et qu'il autorise les index sur les colonnes VARCHAR.
Gestion des tables ayant beaucoup de colonnes.
Gestion des tables ayant des lignes de très grande taille.
SELECTavec de nombreuses expressions.
SELECTsur les grandes tables.
Gestion de plusieurs connexions simultanées. MySQL est complétement multi-threaded. Chaque connexion a son propre thread, ce qui fait que les threads ne s'attendent pas les uns les autres (sauf lorsque des LOCK sont posés sur les tables). Avec mSQL, une fois la connexion établie, les autres doivent attendre que le premier ait terminé, quelque soit la requête lancée. Lorsque cette dernière est terminée, la connexion se termine, et la prochaine connexion est ouverte.
Jointures.
mSQLpeut devenir desespérement lent si vous changez l'ordre des tables dans 
la commandeSELECT. Dans la suite de teste, il est arrivé quemSQLsoit 15000 fois plus lent que MySQL
Cela est du àmSQLà qui manque un optimisateur de jointures. Cependant,
si vous placez les tables dans le bon ordre, si la clauseWHEREest simple
et si elle utilise des colonnes indexées, la jointure sera plutôt rapide.
  11  La suite de tests de MySQL.
ORDER BYetGROUP BY.
DISTINCT.
Utiliser des colonnes de type TEXTouBLOB.SQL
Utilisation du disque
A quel point pouvez vous réduire vos tables?
MySQL dispose de types de colonnes précis, qui vous permettent de créer des tables qui prenent le moins de place possible. Comme exemple de type de table bien pratique, nous pouvons prendre MEDIUMINTqui ne prend que 3 octets. Si vous avez 100,000,000 enregistrements, économiser 25% de la place peut être primordial.mSQL2dispose de beaucoup moins de types de colonnes, et cela rend difficile la réduction de tables.Stabilité
Cela est plus difficile à estimer objectivement. Pour la stabilité, voyez   1.5  Est ce que MySQL est stable?.
Nous n'avons aucune experience en terme de stabilité mSQL, et nous ne nous étendrons pas sur ce point.Prix
Un autre élément d'importance est la licence. MySQL a une licence plus souple que 
 mSQL, et il est aussi moins cher quemSQL.  
Quelque soit le produit que vous décidez de choisir, pensez à prendre une licence ou un support email.
(Il vous faut aquérir une licence pour inclure MySQL dans un produit que vous vendez).Interfaces Perl
MySQL a pratiquement les mêmes interfaces avec Perl que mSQLmais avec quelques fonctionnalités en plus.JDBC (Java)
MySQL dispose actuellement de 4 pilotes JDBC :
Les pilotes recommendés sont twz et mm. Les deux fonctionnent parfaitement.
Nous savons que
Le pilote gwe : une interface Java par GWE technologies (plus du tout supportée).
Le pilote jms : un pilote gwe amélioré par Xiaokun Kelvin ZHU
Le pilote twz : Un pilote de type 4 JDBC par Terrence W. Zellers
Le pilote mm : Un pilote de type 4 JDBC par Mark Matthews
 mSQLdispose d'un pilote JDBC, mais nous n'avons que très peu d'expérience, et ne pouvons pas comparer.Vitesse de developpement
MySQL dispose d'une petite équipe de développeur, mais nous sommes habitués à
travailler en C et C++ très rapidement. Etant donné que les threads, fonctions, GROUP BYetc...
ne sont pas implémentés dansmSQL, il a pas mal de retard.
Pour dire les choses simplement, il suffit de comparer le fichier d'historique 
demSQLet de le comparer à la section news de MySQL Reference Manual (  D  Historique des versions de MySQL).
Le logiciel le plus rapidement developpé est une évidence.Programmes utilitaires.
mSQLet MySQL dispose d'outils partenaires très interssants.
Etant donné qu'il n'est pas facile de porter ces outils deMySQLà 
mSQL), la plus part des applications interssantes, disponibles
pourmSQLsont aussi disponibles pour MySQL.
MySQL est livré avec un utilitaire tout simple,msql2mysqlqui corrige les problèmes d'orthographe dans les API C entremSQLet MySQL
Par exemple, il va remplacer les appels àmsqlConnect()parmysql_connect(). Convertir un programme client demSQLà MySQL 
ne prend que quelques minutes. 
Selon notre expérience, il ne prendrait que quelques heures
pour convertir des outils tels que msql-tcletmsqljavaqui utilisent
les API CmSQLpour qu'ils fonctionnent avec MySQL. 
Les instructions de conversion sont : 
 
Exécutez le script msql2mysqlsur les sources. Cele requiert le programmereplace, qui est distribués par MySQL.
Compiler.
Corriger les erreurs de compilation.
 
Les différences entre les API C mSQLet les API C MySQL sont : 
MySQL utilise la structure MYSQLcomme type de connexion, 
(mSQLutilise un entierint).
mysql_connect()prend un pointeur sur une structureMYSQLcomme paramètre.
Il est facile d'en définir un globalement, ou bien d'utilisermalloc()pour en créer un.mysql_connect()prend deux paramètres pour spécifier l'utilisateur, et le mot de passe.
Vous povuez utiliserNULL, NULLpour appeler lesv valeurs par défaut.
mysql_error()prend une structureMYSQLcomme paramètre. Vous pouvez simplement
ajouter le paramètre de votre fonctionmsql_error()si vous portez un vieux code.
MySQL retourne une erreur et un message d'erreur, pour toutes les errerurs mSQLne fait que retourner un message d'erreur.
Quelques incompatibilités existent, notamment à cause des connexions simultanées de MySQL
 
There are enough differences that it is impossible (or at least not easy)
to support both.
 
The most significant ways in which the MySQL protocol differs
from the mSQLprotocol are listed below: 
A message buffer may contain many result rows.
The message buffers are dynamically enlarged if the query or the
result is bigger than the current buffer, up to a configurable server and
client limit.
All packets are numbered to catch duplicated or missing packets.
All column values are sent in ASCII. The lengths of columns and rows are sent
in packed binary coding (1, 2 or 3 bytes).
MySQL can read in the result unbuffered (without having to store the
full set in the client).
If a single write/read takes more than 30 seconds, the server closes
the connection.
If a connection is idle for 8 hours, the server closes the connection.
 
Column types
 
MySQL
Has the following additional types (among others; see
  CREATE TABLE):
ENUMtype for one of a set of strings.
SETtype for many of a set of strings.
BIGINTtype for 64-bit integers.
MySQL also supports
the following additional type attributes:
UNSIGNEDoption for integer columns.
ZEROFILLoption for integer columns.
AUTO_INCREMENToption for integer columns that are aPRIMARY KEY.mysql_insert_id().
DEFAULTvalue for all columns.mSQL2
mSQLcolumn types correspond to the MySQL types shown below:
| mSQLtype | Corresponding MySQL type |  | CHAR(len) | CHAR(len) |  | TEXT(len) | TEXT(len).lenis the maximal length.
AndLIKEworks. |  | INT | INT. With many more options! |  | REAL | REAL. OrFLOAT. Both 4- and 8-byte versions are available. |  | UINT | INT UNSIGNED |  | DATE | DATE. Uses ANSI SQL format rather thanmSQL's own. |  | TIME | TIME |  | MONEY | DECIMAL(12,2). A fixed-point value with two decimals. |  
Index creation
 
MySQL
Indexes may be specified at table creation time with the CREATE TABLEstatement.mSQL
Indexes must be created after the table has been created, with separate
CREATE INDEXstatements. 
To insert a unique identifier into a table
 
MySQL
Use AUTO_INCREMENTas a column type
specifier.mysql_insert_id().mSQL
Create a SEQUENCEon a table and select the_seqcolumn. 
To obtain a unique identifier for a row
 
MySQL
Add a PRIMARY KEYorUNIQUEkey to the table.mSQL
Use the _rowidcolumn. Observe that_rowidmay change over time
depending on many factors. 
To get the time a column was last modified
 
MySQL
Add a TIMESTAMPcolumn to the table. This column is automatically set
to the current date and time forINSERTorUPDATEstatements if
you don't give the column a value or if you give it aNULLvalue.mSQL
Use the _timestampcolumn. 
NULLvalue comparisons 
MySQL
MySQL follows
ANSI SQL and a comparison with NULLis alwaysNULL.mSQL
In mSQL,NULL = NULLis TRUE.  You
must change=NULLtoIS NULLand<>NULLtoIS NOT NULLwhen porting old code frommSQLto MySQL. 
String comparisons
 
MySQL
Normally, string comparisons are performed in case-independent fashion with
the sort order determined by the current character set (ISO-8859-1 Latin1 by
default).  If you don't like this, declare your columns with the
BINARYattribute, which causes comparisons to be done according to the
ASCII order used on the MySQL server host.mSQL
All string comparisons are performed in case-sensitive fashion with
sorting in ASCII order.
 
Case-insensitive searching
 
MySQL
LIKEis a case-insensitive or case-sensitive operator, depending on
the columns involved. If possible, MySQL uses indexes if theLIKEargument doesn't start with a wildcard character.mSQL
Use CLIKE. 
Handling of trailing spaces
 
MySQL
Strips all spaces at the end of CHARandVARCHARcolumns. Use aTEXTcolumn if this behavior is not desired.mSQL
Retains trailing space.
 
WHEREclauses 
MySQL
MySQL correctly prioritizes everything (ANDis evaluated
beforeOR). To getmSQLbehavior in MySQL, use
parentheses (as shown below).mSQL
Evaluates everything from left to right. This means that some logical
calculations with more than three arguments cannot be expressed in any
way. It also means you must change some requêteswhen you upgrade to
MySQL. You do this easily by adding parentheses.  Suppose you
have the following mSQLquery:
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
To make MySQL evaluate this the way that mSQLwould,
you must add parentheses:
mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));
 
Access control
 
MySQL
Has tables to store grant (permission) options per user, host and
database.   6.6  Fonctionnement du système de droits.
mSQL
Has a file `mSQL.acl' in which you can grant read/write privileges for
users.
 |