mSQL
This 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 mSQL
2 and the WHERE
is
simple and uses index columns, the join will be relatively fast!
See section 11.7 Using your own benchmarks.
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.4 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 21.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 21.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 and use this.
New in 3.23.11: If the PRIMARY
or UNIQUE
key consists of only one
column and this is of type integer, one can also refer to it as
_rowid
.
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.7 Using your own benchmarks. 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.