|
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 tches 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
-
- 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.
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 :
-
Exécutez le script
msql2mysql sur les sources. Cele requiert le programme
replace , qui est distribués par MySQL.
-
Compiler.
-
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
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.
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.
-
|