21.1 Comparer MySQL et mSQL

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, mSQL est plus rapide dans les tches suivantes :
  • Tests qui effectuent des connexions/deconnexion repetées, avec une requête tres simple entre les deux.
  • Opérations INSERT dans des tables simples, avec quelques colonnes et clés.
  • CREATE TABLE et DROP TABLE.
  • SELECT sur ce qui n'est pas un index. (l'analyse d'une table est très simple).
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 mSQL (et que la plus part des implémentation SQL) dans les cas suivants :
  • Opérations SELECT complexes.
  • 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.
  • SELECT avec de nombreuses expressions.
  • SELECT sur 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. mSQL peut devenir desespérement lent si vous changez l'ordre des tables dans la commande SELECT. Dans la suite de teste, il est arrivé que mSQL soit 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 clause WHERE est simple et si elle utilise des colonnes indexées, la jointure sera plutôt rapide. 11 La suite de tests de MySQL.
  • ORDER BY et GROUP BY.
  • DISTINCT.
  • Utiliser des colonnes de type TEXT ou BLOB.
SQL
  • GROUP BY and HAVING. mSQL ne supporte pas la clause GROUP BY. MySQL supporte complètement la clause GROUP BY avec la clause HAVING et les instructions suivantes : COUNT(), AVG(), MIN(), MAX(), SUM() and STD(). COUNT(*) est optimisé pour retourner TRES rapidement le bon compte si SELECT ne fait que compter dans une seule table, sans colonne supplémentaire, ni clause WHERE. MIN() et MAX() acceptent aussi des arguments chaînes.
  • INSERT et UPDATE avec calculs. MySQL peut faire des calculs dans une commande INSERT et UPDATE. Par exemple :
    mysql> UPDATE SET x=x*10+y WHERE x<20;
    
  • Alias. MySQL permet les alias de colonnes.
  • Qualification minimale des noms de colonnes. Avec MySQL, si un nom de colonne est unique parmi les tables en jeu dans une requête, il n'est pas nécessaire de l'identifier avec son nom complet.
  • SELECT avec des fonctions. MySQL dispose de nombreuses fonctions (trop nombreuses pour être listées ici : allez à 7.3 Fonctions utilisées dans les clauses SELECT et WHERE).
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 MEDIUMINT qui ne prend que 3 octets. Si vous avez 100,000,000 enregistrements, économiser 25% de la place peut être primordial. mSQL2 dispose 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 que mSQL. 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 mSQL mais avec quelques fonctionnalités en plus.
JDBC (Java)
MySQL dispose actuellement de 4 pilotes JDBC :
  • 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
Les pilotes recommendés sont twz et mm. Les deux fonctionnent parfaitement. Nous savons que mSQL dispose 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 BY etc... ne sont pas implémentés dans mSQL, il a pas mal de retard. Pour dire les choses simplement, il suffit de comparer le fichier d'historique de mSQL et 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.
mSQL et MySQL dispose d'outils partenaires très interssants. Etant donné qu'il n'est pas facile de porter ces outils de MySQL à mSQL), la plus part des applications interssantes, disponibles pour mSQL sont aussi disponibles pour MySQL. MySQL est livré avec un utilitaire tout simple, msql2mysql qui corrige les problèmes d'orthographe dans les API C entre mSQL et MySQL Par exemple, il va remplacer les appels à msqlConnect() par mysql_connect(). Convertir un programme client de mSQL à MySQL ne prend que quelques minutes.

21.1.1 Comment convertir les outils mSQL pour MySQL

Selon notre expérience, il ne prendrait que quelques heures pour convertir des outils tels que msql-tcl et msqljava qui utilisent les API C mSQL pour qu'ils fonctionnent avec MySQL.

Les instructions de conversion sont :

  1. Exécutez le script msql2mysql sur les sources. Cele requiert le programme replace, qui est distribués par MySQL.
  2. Compiler.
  3. Corriger les erreurs de compilation.

Les différences entre les API C mSQL et les API C MySQL sont :

  • MySQL utilise la structure MYSQL comme type de connexion, (mSQL utilise un entier int).
  • mysql_connect() prend un pointeur sur une structure MYSQL comme paramètre. Il est facile d'en définir un globalement, ou bien d'utiliser malloc() pour en créer un. mysql_connect() prend deux paramètres pour spécifier l'utilisateur, et le mot de passe. Vous povuez utiliser NULL, NULL pour appeler lesv valeurs par défaut.
  • mysql_error() prend une structure MYSQL comme paramètre. Vous pouvez simplement ajouter le paramètre de votre fonction msql_error() si vous portez un vieux code.
  • MySQL retourne une erreur et un message d'erreur, pour toutes les errerurs mSQL ne fait que retourner un message d'erreur.
  • Quelques incompatibilités existent, notamment à cause des connexions simultanées de MySQL

21.1.2 En quooi les protocoles de communications de mSQL et MySQL diffèrent?

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 mSQL protocol 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.

21.1.3 En quoi la syntaxe SQL de mSQL 2.0 diffère de MySQL

Column types

MySQL
Has the following additional types (among others; see CREATE TABLE):
  • ENUM type for one of a set of strings.
  • SET type for many of a set of strings.
  • BIGINT type for 64-bit integers.
MySQL also supports the following additional type attributes:
  • UNSIGNED option for integer columns.
  • ZEROFILL option for integer columns.
  • AUTO_INCREMENT option for integer columns that are a PRIMARY KEY. mysql_insert_id().
  • DEFAULT value for all columns.
mSQL2
mSQL column types correspond to the MySQL types shown below:
mSQL type Corresponding MySQL type
CHAR(len) CHAR(len)
TEXT(len) TEXT(len). len is the maximal length. And LIKE works.
INT INT. With many more options!
REAL REAL. Or FLOAT. Both 4- and 8-byte versions are available.
UINT INT UNSIGNED
DATE DATE. Uses ANSI SQL format rather than mSQL'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 TABLE statement.
mSQL
Indexes must be created after the table has been created, with separate CREATE INDEX statements.

To insert a unique identifier into a table

MySQL
Use AUTO_INCREMENT as a column type specifier. mysql_insert_id().
mSQL
Create a SEQUENCE on a table and select the _seq column.

To obtain a unique identifier for a row

MySQL
Add a PRIMARY KEY or UNIQUE key to the table.
mSQL
Use the _rowid column. Observe that _rowid may change over time depending on many factors.

To get the time a column was last modified

MySQL
Add a TIMESTAMP column to the table. This column is automatically set to the current date and time for INSERT or UPDATE statements if you don't give the column a value or if you give it a NULL value.
mSQL
Use the _timestamp column.

NULL value comparisons

MySQL
MySQL follows ANSI SQL and a comparison with NULL is always NULL.
mSQL
In mSQL, NULL = NULL is TRUE. You must change =NULL to IS NULL and <>NULL to IS NOT NULL when porting old code from mSQL to 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 BINARY attribute, 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
LIKE is a case-insensitive or case-sensitive operator, depending on the columns involved. If possible, MySQL uses indexes if the LIKE argument doesn't start with a wildcard character.
mSQL
Use CLIKE.

Handling of trailing spaces

MySQL
Strips all spaces at the end of CHAR and VARCHAR columns. Use a TEXT column if this behavior is not desired.
mSQL
Retains trailing space.

WHERE clauses

MySQL
MySQL correctly prioritizes everything (AND is evaluated before OR). To get mSQL behavior 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 mSQL query:
mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
To make MySQL evaluate this the way that mSQL would, 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.