mSQLThis section has been written by the MySQL developers, so it should be read with that in mind. But there are NO factual errors that we know of.
For a list of all supported limits, functions and types, see the
 crash-me web page.
mSQL should be quicker at:
INSERT operations into very simple tables with few columns and keys.
CREATE TABLE and DROP TABLE.
SELECT on something that isn't an index. (A table scan is very
easy.)
mSQL (and
most other SQL implementions) on the following:
SELECT operations.
VARCHAR columns.
SELECT with many expressions.
SELECT on large tables.
mSQL, once one connection
is established, all others must wait until the first has finished, regardless
of whether the connection is running a query that is short or long. When the
first connection terminates, the next can be served, while all the others wait
again, etc.
mSQL can become pathologically slow if you change the order of tables
in a SELECT. In the benchmark suite, a time more than 15000 times
slower than MySQL was seen.  This is due to mSQL's lack of a
join optimizer to order tables in the optimal order. However, if you put the
tables in exactly the right order in mSQL2 and the WHERE is
simple and uses index columns, the join will be relatively fast!
See section 11  The MySQL benchmark suite.
ORDER BY and GROUP BY.
DISTINCT.
TEXT or BLOB columns.
GROUP BY and HAVING.
mSQL does not support GROUP BY at all.
MySQL supports a full GROUP BY with both HAVING and
the following functions: COUNT(), AVG(), MIN(),
MAX(), SUM() and STD().  COUNT(*) is optimized to
return very quickly if the SELECT retrieves from one table, no other
columns are retrieved and there is no WHERE clause.  MIN() and
MAX() may take string arguments.
INSERT and UPDATE with calculations.
MySQL can do calculations in an INSERT or UPDATE.
For example:
mysql> UPDATE SET x=x*10+y WHERE x<20;
SELECT with functions.
MySQL has many functions (too many to list here; see section 7.3  Functions for use in SELECT and WHERE clauses).
MEDIUMINT that is 3 bytes long. If you have 100,000,000 records,
saving even one byte per record is very important.
mSQL2 has a more limited set of column types, so it is
more difficult to get small tables.
mSQL stability, so we cannot say
anything about that.
mSQL, and is also less expensive than
mSQL.  Whichever product you choose to use, remember to at least
consider paying for a license or email support.  (You are required to get
a license if you include MySQL with a product that you sell,
of course.)
mSQL with
some added features.
mSQL has a JDBC driver, but we have too little experience
with it to compare.
GROUP BY and so
on are still not implemented in mSQL, it has a lot of catching up
to do. To get some perspective on this, you can view the mSQL
`HISTORY' file for the last year and compare it with the News
section of the MySQL Reference Manual (see section D  MySQL change history). It should be
pretty obvious which one has developed most rapidly.
mSQL and MySQL have many interesting third-party
tools. Since it is very easy to port upward (from mSQL to
MySQL), almost all the interesting applications that are available for
mSQL are also available for MySQL.
MySQL comes with a simple msql2mysql program that fixes
differences in spelling between mSQL and MySQL for the
most-used C API functions.
For example, it changes instances of msqlConnect() to
mysql_connect(). Converting a client program from mSQL to
MySQL usually takes a couple of minutes.
mSQL tools for MySQL
According to our experience, it would just take a few hours to convert tools
such as msql-tcl and msqljava that use the
mSQL C API so that they work with the MySQL C API.
The conversion procedure is:
msql2mysql on the source. This requires the
replace program, which is distributed with MySQL.
Differences between the mSQL C API and the MySQL C API are:
MYSQL structure as a connection type (mSQL
uses an int).
mysql_connect() takes a pointer to a MYSQL structure as a
parameter.  It is easy to define one globally or to use malloc() to get
one.
mysql_connect() also takes 2 parameters for specifying the user and
password.  You may set these to NULL, NULL for default use.
mysql_error() takes the MYSQL structure as a parameter. Just add
the parameter to your old msql_error() code if you are porting old code.
mSQL returns only a text error message.
mSQL and MySQL client/server communications protocols differThere 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:
mSQL 2.0 SQL syntax differs from MySQLColumn types
MySQL
CREATE TABLE syntax):
ENUM type for one of a set of strings.
SET type for many of a set of strings.
BIGINT type for 64-bit integers.
UNSIGNED option for integer columns.
ZEROFILL option for integer columns.
AUTO_INCREMENT option for integer columns that are a
PRIMARY KEY.
See section 20.4.29  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
CREATE TABLE
statement.
mSQL
CREATE INDEX statements.
To insert a unique identifier into a table
MySQL
AUTO_INCREMENT as a column type
specifier.
See section 20.4.29  mysql_insert_id().
mSQL
SEQUENCE on a table and select the _seq column.
To obtain a unique identifier for a row
MySQL
PRIMARY KEY or UNIQUE key to the table.
mSQL
_rowid column. Observe that _rowid may change over time
depending on many factors.
To get the time a column was last modified
MySQL
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
_timestamp column.
NULL value comparisons
MySQL
NULL is always NULL.
mSQL
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
BINARY attribute, which causes comparisons to be done according to the
ASCII order used on the MySQL server host.
mSQL
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
CLIKE.
Handling of trailing spaces
MySQL
CHAR and VARCHAR
columns. Use a TEXT column if this behavior is not desired.
mSQL
WHERE clauses
MySQL
AND is evaluated
before OR). To get mSQL behavior in MySQL, use
parentheses (as shown below).
mSQL
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
mSQL
PostgreSQL has some more advanced features like user-defined
types, triggers, rules and some transaction support. However, PostgreSQL lacks
many of the standard types and functions from ANSI SQL and ODBC. See the
 crash-me web page
for a complete list of limits and which types and functions are supported
or unsupported.
Normally, PostgreSQL is a magnitude slower than
MySQL. See section 11  The MySQL benchmark suite.  This is due largely to their
transactions system. If you really need transactions or the rich type
system PostgreSQL offers and you can afford the speed penalty, you
should take a look at PostgreSQL.
Go to the first, previous, next, last section, table of contents.