翻译:晏子(yanzi) 主页:http://linuxdb.yeah.net
mSQL
这一节由MySQL开发者编写,因此应该理智地阅读它,但是没有我们听说的事实错误。
对于所有支持的限制、函数和类型的一个列表,看crash-me
网页。
mSQL
应该在下列方面更快些:INSERT
操作。 CREATE TABLE
和DROP TABLE
。 SELECT
。(一个表扫描是很容易的。)因为这些操作是如此简单,当你有更高的启动开销时,很难在这些方面变得更好。在连接被建立以后,MySQL应该性能好一些。在另一方面,MySQL比mSQL
(以及大多数其他的SQL实现)在下列方面更好些:
SELECT
操作。 VARCHAR
列上索引。SELECT
。 SELECT
。 mSQL
中,一旦一个连接被建立了,所有其它线程必须等到第一个线程完成,不管连接正在运行的查询是短的或是长的。当第一个连接终止时,下一个才能工作,而此时所有其它线程再次等待,等等。SELECT
中的表的顺序,mSQL
可能变得异常地慢。在基准套件中,比MySQL要慢超过15000倍的时间。这是由于mSQL
缺乏一个联结优化器以便以最佳的顺序排定表。然而,如果你把表按完全正确的顺序放在mSQL
2中并且WHERE
是很简单的并使用索引列,联结将相对快些!见10.8 使用你自己的基准。ORDER BY
和GROUP BY
。DISTINCT
。TEXT
或BLOB
列。GROUP BY
和HAVING
。mSQL
根本不支持GROUP
BY
。MySQL支持一个有两个HAVING
和下列函数:
COUNT()
、AVG()
、MIN()
、MAX()
、SUM()
和STD()
的完整的GROUP
BY
。如果SELECT
从一张表中检索,没有其他列被检索并且没有WHERE
子句,COUNT(*)
被优化以很快地返回。
MIN()
和MAX()
可以取字符串参数。 INSERT
和UPDATE
。MySQL能在一个INSERT
或UPDATE
中做计算。例如:mysql> UPDATE SET x=x*10+y WHERE x<20;
SELECT
。MySQL有很多函数(太多不能在这里列出;见7.4 用在SELECT
和WHERE
子句中的函数)。MEDIUMINT
,它是3个字节长。如果你有100,000,000个记录,每个记录节省甚至一个字节也是很重要的。mSQL2
有一个较有限的列类型集合,因此更难于使表更小。mSQL
稳定性的经验,因此我们对此不能说任何东西。mSQL
更灵活的许可证,并且也不比mSQL
昂贵。无论你选择使用哪个产品,记得要至少考虑支付一个许可证或电子邮件支持的费用。(当然如果你把你出售的一个产品包括在MySQL中,你将被要求获得一个许可证。)mSQL
基本相同Perl接口,当有一些增加的功能。推荐的驱动程序是twz或mm驱动程序。两者均被报导工作出色。我们知道mSQL
有一个
JDBC 驱动程序,但是我们对它有太少的经验不能进行比较。
GROUP
BY
等在mSQL
中仍未实现,它有很多追赶工作要做。要想得到关于它的一些前景,你可以查看mSQL
最后一年的
“HISTIRY”文件,并将它与MySQL参考书手册的新功能小节比较(见D MySQL变迁历史)。哪个快开发得最快应该是相当明显的。mSQL
和MySQL都有许多有趣的第三方工具。因为向上移植(从mSQL
到MySQL)是很容易的,几乎所有mSQL
可用的有趣的应用程序也可被MySQL使用。MySQL带有一个简单的msql2mysql
程序修正在mSQL
和MySQL使用的大多数C
API函数之间拼写差别。例如,它将msqlConnect()
实例改变为mysql_connect()
。变换一个客户程序从mSQL
到MySQL通常花几分钟时间。mSQL
的工具转换到MySQL根据我们的经验,转换诸如使用mSQL
C API的msql-tcl
和msqljava
工具将只花不大一小时时间,使得他们用MySQL
C API工作。
转换过程是:
msql2mysql
。这需要replace
程序,它与MySQL一起散发。mSQL
C API与MySQL C API 之间差别是:
MYSQL
结构作为一种连接类型(mSQL
使用一个int
)。mysql_connect()
取一个指向一个MYSQL
结构的指针作为一个参数。很容易定义全局性定义一个或使用malloc()
获得一个。mysql_connect()
也取两个参数指定用户和口令。你可以为了缺省使用将这些设置为NULL,NULL
。mysql_error()
取MYSQL
结构作为一个参数。如果你正在移植老的代码,只是把参数加到你的老的msql_error()
编码中。
mSQL
仅返回一条文字错误消息。
mSQL
和MySQL的客户机/服务器通讯协议有何不同有足够的差别使得不可能(或至少不容易)支持两者。
它MySQL协议不同于mSQL
协议的最重要的方面列在下面:
mSQL
2.0的SQL句法与MySQL有何不同列类型
MySQL
CREATE TABLE
句法): 、ENUM
类型。SET
类型。 BIGINT
类型。UNSIGNED
选项。ZEROFILL
选项。PRIMARY KEY
的整数列的AUTO_INCREMENT
选项。见20.4.29 mysql_insert_id()
。DEFAULT
值。 mSQL2
mSQL
列类型对应于MySQL类型显示在下面:mSQL 类型 |
相应的MySQL类型 |
CHAR(len) |
CHAR(len) |
TEXT(len) |
TEXT(len) ,len 是最大长度。并且LIKE 可运用。 |
INT |
INT ,有很多的选项! |
REAL |
REAL ,或FLOAT 。有4和8字节版本。 |
UINT |
INT UNSIGNED |
DATE |
DATE ,使用 ANSI SQL 格式而非mSQL 自己的。 |
TIME |
TIME |
MONEY |
DECIMAL(12,2) ,有2个小数位的定点值。 |
索引创建
MySQL
CREATE TABLE
语句指定。 mSQL
CREATE INDEX
语句。把一个唯一标识符插入到一张表中
MySQL
AUTO_INCREMENT
作为列类型修饰符。见20.4.29 mysql_insert_id()
。mSQL
SEQUENCE
并且选择_seq
列。为行获得一个唯一标识符
MySQL
PRIMARY KEY
或UNIQUE
键。 mSQL
_rowid
列。注意_rowid
可以将来改变,取决于很多因素。得到列最后被修改的时间
MySQL
TIMESTAMP
列。如果你不给出列值或如果你给它一个NULL
值,该列自动为INSERT
或UPDATE
语句设置为当前的日期和时间。mSQL
_timestamp
列。NULL
值的比较
MySQL
NULL
的比较总是NULL
。mSQL
mSQL
中,NULL = NULL
是TRUE(真)。当从mSQL
到MySQL移植老的代码时,你必须将=NULL
改委IS
NULL
,并将<>NULL
改为IS NOT NULL
。字符串的比较
MySQL
BINARY
属性,它使得比较根据用在MySQL服务器主机上的ASCII顺序进行。mSQL
大小写不敏感的搜索
MySQL
LIKE
是一个大小写不敏感或大小写敏感的运算符,这取决于涉及的列。如果LIKE
参数不以一个通配符字符开始,如有可能,MySQL则使用索引。mSQL
CLIKE
。尾部空格的处理
MySQL
CHAR
和VARCHAR
列尾部的空格。如果不希望这种行为,使用一个TEXT
行列。mSQL
WHERE
子句
MySQL
AND
在OR
前计算)。要想在MySQL里得到mSQL
的行为,使用括号(如下所示)。mSQL
mSQL
查询:mysql> SELECT * FROM table WHERE a=1 AND b=2 OR a=3 AND b=4;
为了使MySQL像mSQL
那样计算它,你必须增加括号:
mysql> SELECT * FROM table WHERE (a=1 AND (b=2 OR (a=3 AND (b=4))));
存取控制
MySQL
mSQL
PostgreSQL
有一些更高级的功能如定义用户类型、触发器、规则和一些事务支持。然而,PostgreSQL
缺乏很多来自 ANSI SQL和ODBC的很多标准类型和函数。对于一个完整的限制列表及其支持或不支持哪一个类型和函数,见crash-me
网页。
通常,PostgreSQL
是比MySQL慢很多。见10.8 使用你自己的基准。这大部分是由于他们的事务系统。如果你确实需要事务或PostgreSQL提供的丰富的类型体系并且你能承受速度的损失,你应该看看
PostgreSQL。