性能
对于速度的真实比较请教不断成熟的MySQL基准套件见 使用你自己的基准因为没有线程创建开销一个较小的语法分析器较少功能和简单的安全性mSQL应该在下列方面更快些
执行重复的连接和断开的测试在每个连接期间运行一个非常简单的查询
有很少的列和键的插入很简单的表的INSERT操作
CREATE TABLE和DROP TABLE
在不是一个索引的一些东西上SELECT(一个表扫描是很容易的)
因为这些操作是如此简单当你有更高的启动开销时很难在这些方面变得更好在连接被建立以后MySQL应该性能好一些在另一方面MySQL比mSQL(以及大多数其他的SQL实现)在下列方面更好些
复杂的SELECT操作
检索较大的结果(MySQL有一个更好更快并且更安全的协议)
有变长字符串的表因为MySQL有更有效的并可在VARCHAR列上索引
有很多列的表的处理
由长记录的表的处理
有很多许多表达式的SELECT
在大表上的SELECT
同时处理很多连接MySQL充分是完全多线程化的每个连接有它自己的线程这意味着没有线程必须等待另一个线程(除非一个线程正在修改一张表另外的线程想要存取)在mSQL中一旦一个连接被建立了所有其它线程必须等到第一个线程完成不管连接正在运行的查询是短的或是长的当第一个连接终止时下一个才能工作而此时所有其它线程再次等待等等
联结如果你改变一个SELECT中的表的顺序mSQL可能变得异常地慢在基准套件中比MySQL要慢超过倍的时间这是由于mSQL缺乏一个联结优化器以便以最佳的顺序排定表然而如果你把表按完全正确的顺序放在mSQL中并且WHERE是很简单的并使用索引列联结将相对快些!见 使用你自己的基准
ORDER BY和GROUP BY
DISTINCT
使用TEXT或BLOB列
SQL功能
GROUP BY和HAVINGmSQL根本不支持GROUP BYMySQL支持一个有两个HAVING和下列函数 COUNT()AVG()MIN()MAX()SUM()和STD()的完整的GROUP BY如果SELECT从一张表中检索没有其他列被检索并且没有WHERE子句COUNT(*)被优化以很快地返回 MIN()和MAX()可以取字符串参数
带计算的INSERT和UPDATEMySQL能在一个INSERT或UPDATE中做计算例如
mysql> UPDATE SET x=x*+y WHERE x<;
别名MySQL有列的别名
限制列名在MySQL中如果一个列名在用于查询的表之间唯一的你不必须使用完整的 合格者
带函数的SELECTMySQL有很多函数(太多不能在这里列出见 用在SELECT和WHERE子句中的函数)
磁盘空间效率
即你能使你的表有多小?MySQL有很精确的类型因此你可以创建占据很小空间的表一个有用的MySQL数据类型的例子是MEDIUMINT它是个字节长如果你有个记录每个记录节省甚至一个字节也是很重要的mSQL有一个较有限的列类型集合因此更难于使表更小
稳定性
这较难客观地评价对于MySQL稳定性的讨论见 MySQL有多么稳定?我们没有mSQL稳定性的经验因此我们对此不能说任何东西
价格
另一个重要的问题是许可证MySQL有一个比mSQL更灵活的许可证并且也不比mSQL昂贵无论你选择使用哪个产品记得要至少考虑支付一个许可证或电子邮件支持的费用(当然如果你把你出售的一个产品包括在MySQL中你将被要求获得一个许可证)
Perl接口
MySQL有与mSQL基本相同Perl接口当有一些增加的功能
JDBC ( Java )
MySQL目前有个JDBC驱动程序
gwe 驱动程序由GWE technologies 开发的一个Java接口(不再支持)
jms 驱动程序由Xiaokun Kelvin ZHU的开发的一个改进的gwe驱动程序
twz 驱动程序由Terrence W Zellers 开发的一个type JDBC驱动程序并用于学习目的
mm 驱动程序由Mark Matthews 开发的一个type JDBC驱动程序
推荐的驱动程序是twz或mm驱动程序两者均被报导工作出色我们知道mSQL有一个 JDBC 驱动程序但是我们对它有太少的经验不能进行比较
开发速度
MySQL有一个非常小的开发者队伍但是我们是非常习惯于用C和C++编码非常快速因为线程函数GROUP BY等在mSQL中仍未实现它有很多追赶工作要做要想得到关于它的一些前景你可以查看mSQL最后一年的 HISTIRY文件并将它与MySQL参考书手册的新功能小节比较(见D MySQL变迁历史)哪个快开发得最快应该是相当明显的
实用程序
mSQL和MySQL都有许多有趣的第三方工具因为向上移植(从mSQL到MySQL)是很容易的几乎所有mSQL可用的有趣的应用程序也可被MySQL使用MySQL带有一个简单的msqlmysql程序修正在mSQL和MySQL使用的大多数C API函数之间拼写差别例如它将msqlConnect()实例改变为mysql_connect()变换一个客户程序从mSQL到MySQL通常花几分钟时间
怎样将mSQL的工具转换到MySQL
根据我们的经验转换诸如使用mSQL C API的msqltcl和msqljava工具将只花不大一小时时间使得他们用MySQL C API工作
转换过程是
在源代码上运行外壳脚本msqlmysql这需要replace程序它与MySQL一起散发
编译
修正所有编译器错误
mSQL C API与MySQL C API 之间差别是
MySQL使用一个MYSQL结构作为一种连接类型(mSQL使用一个int)
mysql_connect()取一个指向一个MYSQL结构的指针作为一个参数很容易定义全局性定义一个或使用malloc()获得一个mysql_connect()也取两个参数指定用户和口令你可以为了缺省使用将这些设置为NULLNULL
mysql_error()取MYSQL结构作为一个参数如果你正在移植老的代码只是把参数加到你的老的msql_error()编码中
MySQL对所有错误返回一个错误号和一条文本错误消息mSQL仅返回一条文字错误消息
存在某些不兼容性因为MySQL支持从同一个进程的到服务器多个连接
mSQL和MySQL的客户机/服务器通讯协议有何不同
有足够的差别使得不可能(或至少不容易)支持两者
它MySQL协议不同于mSQL协议的最重要的方面列在下面
一个消息缓沖区可以包含很多结果行
如果查询或结果比当前缓沖区大消息缓沖区动态地被扩大直到一个可配置的服务器和客户上限
所有的包被编号以捕捉重复或丢失的包
所有的列值以ASCII码发送列和行的长度以紧凑的二进制编码(或个字节)发送
MySQL能在未缓沖得结果中读取(不必在客户端存储完整的集合)
如果一个单独写/读花了超过秒时间服务器关闭连接
如果一个连接空闲个小时服务器关闭连接
mSQL 的SQL句法与MySQL有何不同
列类型
MySQL
有下列额外的类型(比较其他的见 CREATE TABLE句法)
对于一个字符串集中之一的ENUM类型
对于一个字符串集中多个的SET类型
对于位整数的BIGINT类型
MySQL也支持下列额外的类型属性
UNSIGNED选项
对于整数列的ZEROFILL选项
对于是一个PRIMARY KEY的整数列的AUTO_INCREMENT选项见 mysql_insert_id()
对所有列的DEFAULT值
mSQL
mSQL列类型对应于MySQL类型显示在下面mSQL类型相应的MySQL类型
CHAR(len)CHAR(len)
TEXT(len)TEXT(len)len是最大长度并且LIKE可运用
INTINT有很多的选项!
REALREAL或FLOAT有和字节版本
UINTINT UNSIGNED
DATEDATE使用 ANSI SQL 格式而非mSQL自己的
TIMETIME
MONEYDECIMAL()有个小数位的定点值
索引创建
MySQL
索引可以在表创建时用CREATE TABLE语句指定
mSQL
在表被创建了以后索引必须被创建用单独的CREATE INDEX语句
把一个唯一标识符插入到一张表中
MySQL 使用AUTO_INCREMENT作为列类型修饰符见 mysql_insert_id()
mSQL
在一张表上创建一个SEQUENCE并且选择_seq列
为行获得一个唯一标识符
MySQL 向表中增加一个PRIMARY KEY或UNIQUE键
mSQL 使用_rowid列注意_rowid可以将来改变取决于很多因素
得到列最后被修改的时间
MySQL 在表中增加一个TIMESTAMP列如果你不给出列值或如果你给它一个NULL值该列自动为INSERT或UPDATE语句设置为当前的日期和时间
mSQL 使用_timestamp列
NULL值的比较
MySQL MySQL遵从ANSI SQL且与NULL的比较总是NULL
mSQL 在mSQL中NULL = NULL是TRUE(真)当从mSQL到MySQL移植老的代码时你必须将=NULL改委IS NULL并将<>NULL改为IS NOT NULL
字符串的比较
MySQL
通常字符串比较以大小写无关方式按当前字符集(缺省为ISO Latin)决定的排序次序实施如果你不喜欢这样声明你的列有BINARY属性它使得比较根据用在MySQL服务器主机上的ASCII顺序进行
mSQL
所有的字符串比较以大小写敏感的方式以ASCII顺