怎样对比MySQL与其他数据库.docx
- 文档编号:10949998
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:9
- 大小:20.54KB
怎样对比MySQL与其他数据库.docx
《怎样对比MySQL与其他数据库.docx》由会员分享,可在线阅读,更多相关《怎样对比MySQL与其他数据库.docx(9页珍藏版)》请在冰点文库上搜索。
怎样对比MySQL与其他数据库
怎样对比MySQL与其他数据库
1怎样对比MySQL与mSQL
这一节由MySQL开发者编写,因此应该理智地阅读它,但是没有我们听说的事实错误。
对于所有支持的限制、函数和类型的一个列表,看crash-me网页。
性能
对于速度的真实比较,请教不断成熟的MySQL基准套件。
见10.8使用你自己的基准。
因为没有线程创建开销、一个较小的语法分析器、较少功能和简单的安全性,mSQL应该在下列方面更快些:
∙执行重复的连接和断开的测试,在每个连接期间运行一个非常简单的查询。
∙有很少的列和键的插入很简单的表的INSERT操作。
∙CREATETABLE和DROPTABLE。
∙在不是一个索引的一些东西上SELECT。
(一个表扫描是很容易的。
)
因为这些操作是如此简单,当你有更高的启动开销时,很难在这些方面变得更好。
在连接被建立以后,MySQL应该性能好一些。
在另一方面,MySQL比mSQL(以及大多数其他的SQL实现)在下列方面更好些:
∙复杂的SELECT操作。
∙检索较大的结果(MySQL有一个更好、更快并且更安全的协议)。
∙有变长字符串的表,因为MySQL有更有效的并可在VARCHAR列上索引。
∙有很多列的表的处理。
∙由长记录的表的处理。
∙有很多许多表达式的SELECT。
∙在大表上的SELECT。
∙同时处理很多连接。
MySQL充分是完全多线程化的,每个连接有它自己的线程,这意味着没有线程必须等待另一个线程(除非一个线程正在修改一张表,另外的线程想要存取)在mSQL中,一旦一个连接被建立了,所有其它线程必须等到第一个线程完成,不管连接正在运行的查询是短的或是长的。
当第一个连接终止时,下一个才能工作,而此时所有其它线程再次等待,等等。
∙联结。
如果你改变一个SELECT中的表的顺序,mSQL可能变得异常地慢。
在基准套件中,比MySQL要慢超过15000倍的时间。
这是由于mSQL缺乏一个联结优化器以便以最佳的顺序排定表。
然而,如果你把表按完全正确的顺序放在mSQL2中并且WHERE是很简单的并使用索引列,联结将相对快些!
见10.8使用你自己的基准。
∙ORDERBY和GROUPBY。
∙DISTINCT。
∙使用TEXT或BLOB列。
SQL功能
∙GROUPBY和HAVING。
mSQL根本不支持GROUPBY。
MySQL支持一个有两个HAVING和下列函数:
COUNT()、AVG()、MIN()、MAX()、SUM()和STD()的完整的GROUPBY。
如果SELECT从一张表中检索,没有其他列被检索并且没有WHERE子句,COUNT(*)被优化以很快地返回。
MIN()和MAX()可以取字符串参数。
∙带计算的INSERT和UPDATE。
MySQL能在一个INSERT或UPDATE中做计算。
例如:
∙mysql>UPDATESETx=x*10+yWHEREx<20;
∙别名。
MySQL有列的别名。
∙限制列名。
在MySQL中,如果一个列名在用于查询的表之间唯一的,你不必须使用完整的合格者。
∙带函数的SELECT。
MySQL有很多函数(太多不能在这里列出;见7.4用在SELECT和WHERE子句中的函数)。
磁盘空间效率
即,你能使你的表有多小?
MySQL有很精确的类型,因此你可以创建占据很小空间的表。
一个有用的MySQL数据类型的例子是MEDIUMINT,它是3个字节长。
如果你有100,000,000个记录,每个记录节省甚至一个字节也是很重要的。
mSQL2有一个较有限的列类型集合,因此更难于使表更小。
稳定性
这较难客观地评价。
对于MySQL稳定性的讨论,见1.5MySQL有多么稳定?
。
我们没有mSQL稳定性的经验,因此我们对此不能说任何东西。
价格
另一个重要的问题是许可证。
MySQL有一个比mSQL更灵活的许可证,并且也不比mSQL昂贵。
无论你选择使用哪个产品,记得要至少考虑支付一个许可证或电子邮件支持的费用。
(当然如果你把你出售的一个产品包括在MySQL中,你将被要求获得一个许可证。
)
Perl接口
MySQL有与mSQL基本相同Perl接口,当有一些增加的功能。
JDBC(Java)
MySQL目前有4个JDBC驱动程序:
∙gwe驱动程序:
由GWEtechnologies开发的一个Java接口(不再支持)。
∙jms驱动程序:
由XiaokunKelvinZHU的开发的一个改进的gwe驱动程序。
∙twz驱动程序:
由TerrenceW.Zellers开发的一个type4JDBC驱动程序并用于学习目的。
∙mm驱动程序:
由MarkMatthews开发的一个type4JDBC驱动程序。
推荐的驱动程序是twz或mm驱动程序。
两者均被报导工作出色。
我们知道mSQL有一个JDBC驱动程序,但是我们对它有太少的经验不能进行比较。
开发速度
MySQL有一个非常小的开发者队伍,但是我们是非常习惯于用C和C++编码,非常快速。
因为线程、函数、GROUPBY等在mSQL中仍未实现,它有很多追赶工作要做。
要想得到关于它的一些前景,你可以查看mSQL最后一年的“HISTIRY”文件,并将它与MySQL参考书手册的新功能小节比较(见DMySQL变迁历史)。
哪个快开发得最快应该是相当明显的。
实用程序
mSQL和MySQL都有许多有趣的第三方工具。
因为向上移植(从mSQL到MySQL)是很容易的,几乎所有mSQL可用的有趣的应用程序也可被MySQL使用。
MySQL带有一个简单的msql2mysql程序修正在mSQL和MySQL使用的大多数CAPI函数之间拼写差别。
例如,它将msqlConnect()实例改变为mysql_connect()。
变换一个客户程序从mSQL到MySQL通常花几分钟时间。
1.1怎样将mSQL的工具转换到MySQL
根据我们的经验,转换诸如使用mSQLCAPI的msql-tcl和msqljava工具将只花不大一小时时间,使得他们用MySQLCAPI工作。
转换过程是:
1.在源代码上运行外壳脚本msql2mysql。
这需要replace程序,它与MySQL一起散发。
2.编译。
3.修正所有编译器错误。
mSQLCAPI与MySQLCAPI之间差别是:
∙MySQL使用一个MYSQL结构作为一种连接类型(mSQL使用一个int)。
∙mysql_connect()取一个指向一个MYSQL结构的指针作为一个参数。
很容易定义全局性定义一个或使用malloc()获得一个。
mysql_connect()也取两个参数指定用户和口令。
你可以为了缺省使用将这些设置为NULL,NULL。
∙mysql_error()取MYSQL结构作为一个参数。
如果你正在移植老的代码,只是把参数加到你的老的msql_error()编码中。
∙MySQL对所有错误返回一个错误号和一条文本错误消息。
mSQL仅返回一条文字错误消息。
∙存在某些不兼容性,因为MySQL支持从同一个进程的到服务器多个连接。
1.2mSQL和MySQL的客户机/服务器通讯协议有何不同
有足够的差别使得不可能(或至少不容易)支持两者。
它MySQL协议不同于mSQL协议的最重要的方面列在下面:
∙一个消息缓冲区可以包含很多结果行。
∙如果查询或结果比当前缓冲区大,消息缓冲区动态地被扩大,直到一个可配置的服务器和客户上限。
∙所有的包被编号以捕捉重复或丢失的包。
∙所有的列值以ASCII码发送。
列和行的长度以紧凑的二进制编码(1、2或3个字节)发送。
∙MySQL能在未缓冲得结果中读取(不必在客户端存储完整的集合)。
∙如果一个单独写/读花了超过30秒时间,服务器关闭连接。
∙如果一个连接空闲8个小时,服务器关闭连接。
1.3mSQL2.0的SQL句法与MySQL有何不同
列类型
MySQL
有下列额外的类型(比较其他的;见7.7CREATETABLE句法):
、
∙对于一个字符串集中之一的ENUM类型。
∙对于一个字符串集中多个的SET类型。
∙对于64位整数的BIGINT类型。
MySQL也支持下列额外的类型属性:
∙UNSIGNED选项。
∙对于整数列的ZEROFILL选项。
∙对于是一个PRIMARYKEY的整数列的AUTO_INCREMENT选项。
见20.4.29mysql_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
INTUNSIGNED
DATE
DATE,使用ANSISQL格式而非mSQL自己的。
TIME
TIME
MONEY
DECIMAL(12,2),有2个小数位的定点值。
索引创建
MySQL
索引可以在表创建时用CREATETABLE语句指定。
mSQL
在表被创建了以后,索引必须被创建,用单独的CREATEINDEX语句。
把一个唯一标识符插入到一张表中
MySQL
使用AUTO_INCREMENT作为列类型修饰符。
见20.4.29mysql_insert_id()。
mSQL
在一张表上创建一个SEQUENCE并且选择_seq列。
为行获得一个唯一标识符
MySQL
向表中增加一个PRIMARYKEY或UNIQUE键。
mSQL
使用_rowid列。
注意_rowid可以将来改变,取决于很多因素。
得到列最后被修改的时间
MySQL
在表中增加一个TIMESTAMP列。
如果你不给出列值或如果你给它一个NULL值,该列自动为INSERT或UPDATE语句设置为当前的日期和时间。
mSQL
使用_timestamp列。
NULL值的比较
MySQL
MySQL遵从ANSISQL且与NULL的比较总是NULL。
mSQL
在mSQL中,NULL=NULL是TRUE(真)。
当从mSQL到MySQL移植老的代码时,你必须将=NULL改委ISNULL,并将<>NULL改为ISNOTNULL。
字符串的比较
MySQL
通常,字符串比较以大小写无关方式按当前字符集(缺省为ISO-8859-1Latin1)决定的排序次序实施。
如果你不喜欢这样,声明你的列有BINARY属性,它使得比较根据用在MySQL服务器主机上的ASCII顺序进行。
mSQL
所有的字符串比较以大小写敏感的方式以ASCII顺序排序来进行。
大小写不敏感的搜索
MySQL
LIKE是一个大小写不敏感或大小写敏感的运算符,这取决于涉及的列。
如果LIKE参数不以一个通配符字符开始,如有可能,MySQL则使用索引。
mSQL
使用CLIKE。
尾部空格的处理
MySQL
剥去CHAR和VARCHAR列尾部的空格。
如果不希望这种行为,使用一个TEXT行列。
mSQL
保留尾部的空格。
WHERE子句
MySQL
MySQL正确地优先化任何东西(AND在OR前计算)。
要想在MySQL里得到mSQL的行为,使用括号(如下所示)。
mSQL
从左到右计算任何东西。
这意味着超过3个参数的一些逻辑运算不能以任何方式表示,它也意味着当你升级到MySQL时,你必须改变一些查询。
你通过增加括号很容易做到这点。
假定你有下列mSQL查询:
mysql>SELECT*FROMtableWHEREa=1ANDb=2ORa=3ANDb=4;
为了使MySQL像mSQL那样计算它,你必须增加括号:
mysql>SELECT*FROMtableWHERE(a=1AND(b=2OR(a=3AND(b=4))));
存取控制
MySQL
有表来存储对每个用户、主机和数据库的授权(许可)选项。
见6.6权限系统如何工作。
mSQL
有一个文件“mSQL.acl”,在哪里你能为用户授权读/写权限。
2怎样对比MySQL与PostgreSQL
PostgreSQL有一些更高级的功能如定义用户类型、触发器、规则和一些事务支持。
然而,PostgreSQL缺乏很多来自ANSISQL和ODBC的很多标准类型和函数。
对于一个完整的限制列表及其支持或不支持哪一个类型和函数,见crash-me网页。
通常,PostgreSQL是比MySQL慢很多。
这大部分是由于他们的事务系统。
如果你确实需要事务或PostgreSQL提供的丰富的类型体系并且你能承受速度的损失,你应该看看PostgreSQL。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 怎样 对比 MySQL 与其 数据库