数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

MySQL高级特性----对比与其他数据库


发布日期:2019年11月26日
 
MySQL高级特性----对比与其他数据库

性能

对于速度的真实比较请教不断成熟的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顺

上一篇:proftpd+mysql+quota整合

下一篇:MySQL截取字符串函数方法