您的位置:首页 > 数据库 > MySQL

SQL Server与MySQL数据库对比

2016-04-03 08:56 274 查看
本文旨在帮助DBA评估MS SQL Server和MySQL数据库之间进行移植的挑战,主要对两种数据库的函数进行了对比,以及为了让实现无缝的迁移,你需要做哪些工作。

  函数类别

  函数可以分为三个不同的类别:

  1. 相同函数:可以安全地从一个数据库移植到另一个数据库,无需做任何修改。

  2. 相似函数:此类函数只在一个数据库中有用,移植需要做一些转换工作。

  3. 不支持的函数:由于逻辑/物理组织和安全模型的差异,这些函数不能很方便地移植。

  相同函数

  以下函数在MySQL和SQL Server的查询中不做任何修改即可使用:

  ASCII, LEFT, LOWER, LTRIM, REPLACE, REVERSE, RIGHT, RTRIM, SOUNDEX, SPACE, SUBSTRING, UPPER, ABS, ACOS, ASIN, ATAN, ATAN2, CEILING, COS, COT, DEGREES, EXP, FLOOR, LOG, LOG10, PI, POWER, RADIANS, RAND, ROUND, SIGN, SIN, SQRT, TAN, DAY, MONTH, COALESCE, NULLIF, CAST, CONVERT.

  相似函数

  在迁移过程中的主要工作都集中在这些函数当中:

Transact-SQL的CASE函数:

  CASE WHEN @a > @b

  THEN @a

  ELSE @b - @a

  END

  这可以转换为MySQL的IF(expr1, expr2, expr3) 函数。工作原理是:

  如果表达式expr1是TRUE(expr1 <> 0和expr1 < > NULL),那么IF()函数返回表达式expr2;否则,返回表达式expr3。

  MySQL示例:

  if(@a>@b, @a, @b-@a)

将二进制数据转换为Varchar

  在SQL SERVER 2008中CONVERT()函数支持将二进制数据转换成十六进制字符串。用法:

  CONVERT(NVARCHAR(34), 0xc23eed6b65c93e44a41a2818e274194f

  MySQL的BIN(N)函数,返回值为N的二进制值的字符串表示,可利用其来替代CONVERT函数。

Transact-SQL的DATALENGTH函数

  该函数转换较为容易,因为MySQL的BIT_LENGTH函数同样返回字符串的位长度。

字符串合并

  SQL Server不支持ANSI SQL的CONCAT()函数。相反,它使用(+)加号运算符实现字符串合并:

  ‘A’+’B’+’C’, ‘A’+’#’+’B’+’#’+’C’

  在MySQL中,使用CONCAT(str1, str2, ……)或CONCAT_WS(separator, str1, str2, ……)函数返回输入参数的连接串:

  CONCAT(‘A’,’B’,’C’), CONCAT_WS(‘#’,’A’,’B’,’C’)

在不同进制之间转换数值

  有时需要将数值转换为非十进制的字符串。在SQL Server中,这就需要使用CAST函数或编写一个自定义函数。MySQL则不需要,因为ANSI SQL的CONV(N, from_base, to_base)函数可以从一种进制转换为另一种进制。

返回字符串中第一个匹配子字符串的位置

  Transact-SQL的CHARINDEX函数对应的ANSI SQL的LOCATE()函数。

在另一个字符串中插入字符串

  在SQL Server中,REPLACE函数用于替换为一个字符串中的某些部分。例如,下面的示例用字符串“xyz”替换字符串“abcdefghi”中的“def”。

  SELECT REPLACE(‘abcdefghicde’,’def’,’xyz’);

  MySQL的INSERT(str, pos, len, newstr)函数可以返回从位置pos开始用字符串newstr替换len个字符长的字符串str。

从文件中加载数据和声明

  T-SQL批量加载语句、从一个文本文件中加载数据和可执行语句的扩展存储过程可以替换为MySQL中的LOAD_FILE(file_name)。

获取当前日期

  Transact-SQL的NOW函数对应ANSI SQL的GETDATE函数。

生成重复的字符串

  Transact-SQL的REPLICATE函数对应ANSI SQL的REPEAT函数。

测试NULL

  Transact-SQL依赖CASE和IS NULL子句来检查NULL值。在MySQL中,可以只使用ISNULL(expr)函数进行替代。如果表达式expr为NULL,ISNULL ()函数返回1;否则将返回0。

比较两个字符串

  Transact-SQL依赖比较运算符进行字符串比较,而ANSI SQL提供 STRCMP (expr1, expr2)函数。

格式化日期

  Transact-SQL使用日期、字符串和转换函数的组合将日期格式化为字符串,ANSI SQL则具有专门进行日期格式化的函数DATE_FORMAT(date, format)。

添加给定的日期间隔

  Transact-SQL的DATEADD函数在Oracle、DB2和PostgreSQL中都有类似函数。MySQL也有,即DATE_ADD:

  SELECT DATE_ADD(‘2010-12-31 23:59:59’, INTERVAL 1 DAY);

  返回值为’2011-01-01 23:59:59’

秒数和时间的转换

  在Transact-SQL中,秒数和时间之间进行转换,比如12:34:00,则需要将CONVERT和DATEADD函数结合起来使用。例如,下面的示例将时间转换为秒数:

  CONVERT(char(8), DATEADD(second, Diff, ‘0:00:00’), 108)

  MySQL可以使用SEC_TO_TIME(seconds)和 TIME_TO_SEC(time)函数轻松完成秒数与时间之间的转换。

检索最后一个插入的ID值

  Transact-SQL的@@IDENTITY和SCOPE_IDENTITY函数用于检索最后插入的ID值。MySQL提供LAST_INSERT_ID函数完成相同的功能。

连接列值

  要将列的内容连接成一个字符串,在T-SQL中需要分成几个步骤:

  declare @v varchar(max)

  set @v=”

  select @v=@v+’,’+isnull(field_a,”) from table_1

  select substring(@v,2,len(@v))

  在ANSI SQL中使用GROUP_CONCAT函数可以很容易完成。它有支持两种不同类型的格式:

GROUP_CONCAT( Language SEPARATOR ‘-’ ) :使用短划线替代默认的逗号分隔符。

SELECT GROUP_CONCAT( Language ORDER BY Language DESC ):用于更改排序顺序。

  注意:GROUP_CONCAT函数忽略空值。

  不支持的函数

  任何以SQL Server为中心的函数要么删除,要么使用ANSI SQL语句组合进行重写。一旦完成,把新代码保存为用户自定义函数,以方便重复使用。

  转换工具

  一些自动化工具可以转换SQL Server和MySQL之间的存储过程,如Ispirer的SQLWays。它能转换存储过程、函数、包和触发器。但它不是免费的,价格不便宜,DBA也可以考虑自己手动转换。

Microsoft SQL Server 2008作为一个数据库平台在所有重要商业领域都胜过MySQL。它提供了一个大型的资源网络、行业领先的性能和企业级的可扩展性、最高级的安全性、一个广泛的商业智能平台——以一个较低的总体拥有成本(TCO)提供所有这些。

  · 合作伙伴系统

  · 可扩展性

  · 安全性

  · 高有效性

  · 商业智能

  · 总体拥有成本(TCO)

  合作伙伴系统

  SQL Server以一个大型的资源网络和一个广泛的合作伙伴系统来支持你的业务。SQL Server是企业的首选数据库,目前有74.7%的企业使用SQL Server。

  · Microsoft具有世界上最多的开发人员和支持团队。MySQL有大约70个开发人员和50个支持人员。

  · 大约15,000个ISV支持SQL Server。而支持MySQL的ISV不到400个。.

  · 在全球Microsoft合作计划中数据管理资格认证的大约2,000个解决方案合作商是有能力为你的企业提供支持。而MySQL 的较小合作商系统只能提供有限的资源。

  可扩展性

  SQL Server支持行业领先的性能和企业级可扩展性。 SQL Server提供了一个基础构建,它可以与你的企业一起发展, 而且它还被证明可以处理大型的工作负载.

  · 由行业标准基准验证的性能,包括TPC和SAP。MySQL没有行业标准性能基准。MySQL性能要求一般是基于可能不适合你企业的配置。

  · 一个具有丰富特性、高性能和基于成本的查询优化器改进了复杂查询的效率。MySQL只有一个基本的查询优化器,而这个优化器没有优化以提供最好的性能,并因此只提供有限的可扩展性。

  · 分布式分区视图扩展了可扩展性。MySQL没有分布式分区视图。

  安全性

  SQL Server 提供了最高级的安全性。据国家漏洞数据库显示,SQL Server在过去三年里没有出现一个漏洞。而MySQL的用户在同一时期受到很多安全挑战。

  研究机构证实SQL Server的高安全性

  · Security Innovations发现在Windows 上的SQL Server比Linux上的MySQL更加安全,它的漏洞比其减少46%,而风险天数比其减少48%。

  · ESG报告指出,MySQL的漏洞比2004年、2005年和2006年的Microsoft SQL Server、Sybase和IBM DB2的漏洞要多。

  SQL Server提供了:

  · 可靠性:丰富的安全特性保护了数据和网络资源。

  · 第三方评估,安全确认所喜欢的方式: Microsoft服从共同准则(Common Criteria),将其作为一个证明和接受的验证过程。MySQL不包括共同准则证明或C2(NSA)。

  · 隐密性:SQL Server集群支持在一个虚拟机上的Kerberos验证和标准登录的Windows风格策略。这使得这个域内的所有帐户都可以使用一个一致的策略。

  · 完整性:SQL Server支持在数据库中加密的功能,并与密钥管理基础构建相集成。

  · 自动更新:SQL Server与用于安全更新的Microsoft Update集成在一起。MySQL没有自动的更新打补丁。

  高有效性

  SQL Server提供了最高的有效性。Always On(总是联机的)技术提供了全面的企业级选择,使得系统停机时间降低到最少,保护了你的数据免于高昂的人为错误,并将应用程序有效性维护在合适的等级。MySQL不提供以下功能,而所有这些都是包括在SQL Server内的:数据库镜像、故障转移集群、数据库快照和快照隔离、日志传送和防止停机的联机操作。

  可靠的升级满足所需

  · Camstar发现SQL Server 2005企业版(64位)可以升级以满足大多数基础构建的需求。

  · Temenos,一个为全球金融机构提供核心银行解决方案的主要供应商,与Microsoft和Intel一起使用Microsoft SQL Server 2005企业版(64位)和Quad-Core Intel Xeon技术来测试Temenos T24银行模型的性能。

  商业智能

  SQL Server提供了一个全面的即开即用商业智能平台——不需要第三方供应商。SQL Server作为市场上排名第一的联机分析处理(OLAP)服务器,它包含分析服务、ETL和用于建立和管理打印和在线报表的报表服务。MySQL没有提供商业智能功能。

  总体拥有成本(TCO)

  SQL Server以很低的总体拥有成本提供了高质量,它为你的企业提供了一个全面的即开即用数据平台解决方案,而不需要昂贵的插件。

  · 一组世界级的工具和一个集成的调试环境帮助降低了开发成本。

  · SQL Server管理套件,旨在帮助创建自管理系统,帮助降低员工成本。

  · 降低的TCO和更快的开发时间,以及在Windows Server产品间执行的通用工程策略。而且,Microsoft 提供许多SQL Server许可证和价格选择,每一个都提供了强大的支持。

  MySQL免费提供它的Community Server。但是公司警告说,MySQL不提供支持和定期更新。如果你没有技术经验来靠你自己提供这些服务,那么购买这些服务是很昂贵的。

  · 产品支持要求MySQL企业订阅599到599到4,999每服务器每年(MySQL企业选择)。

  在MySQL上建立一个全面的解决方案需要额外的第三方工具,例如备份和商业智能,而其中许多是收费的。

  上面是转载的,讲一些个人的经验吧,我公司的虚拟主机管理系统是我开发的,采用了.Net 和SQL Server的方案,而由于是经营虚拟主机,所以对这两种常见的数据库接触非常多,遇到的问题也多。

  总体来说,性能上,数据量比较小,数据表结构比较简单的时候,比如10万数据,那么MySQL的效率在第一次检索的时候会比SQL Server快,注意,我提到了第一次检索,因为这两种数据库的承载平台是有区别的,Windows系统可能运行一年以后还会显示几个G的空余物理内存,而Linux/Unix启动后可能就会接管所有的物理内存,刚学Unix的时候还因为这个困惑过。所以在Linux/Unix下,进程要使用内存是会比Windows下的进程少等待一个步骤,所以内存页交换的开销会比较小,而Windows要先看剩余物理内存,够用了就拿来,不够用再去写页面文件(实际上在内存管理和调度上两个系统的区别是很大的,这里只是讲个简单的例子),所以Windows的内存调度性能肯定没有Linux/Unix好。SQL Server的运行是很有意思的,做过服务器维护的朋友应该注意到了,需要给SQL Server指定可以调用的物理内存上限,否则在一段时间之后(具体多少时间,要看负载情况,可能几秒钟就上来了)SQL Server就会吃掉所有的物理内存,我公司曾经接手两个日访问量上千万的站点,都是SQL Server数据库,Dell的1950,两颗Xeon 3.0,4G内存跑起来比较吃力的,因为并发太多了。SQL Server是典型的内存换性能,细心的朋友会发现,一个500M的数据库,如果做一次count或者sum或者其他需要检索整个表的操作,那么SQL Server占用的物理内存立马就会蹿升到500多M,这里可以看出他性能来源,是把数据库缓冲在内存中了,内存操作的效率当然要比磁盘高,所以他性能高也就很正常的了,加上他是商业数据库,新版的SQL Server 2008性能已经很夸张了,后面会有详细数据。MySQL的内存占用是令人满意的,占用很小,而且不论我怎么调整,我见到MySQL占用内存的上限只有1.1G,当时也是个很极端的情况,一个用户的站点被人攻击,3万多并发持续请求PHP页面,是个论坛来的,后面挂接MySQL,IIS程序池占用的CPU已经导致一颗处理器核心满载了(四核,他用了25%),而MySQL却用掉了60%,超过两颗核心的负载,MySQL进程占用内存接近1.1G,因为他论坛的帖子较多,印象中是300多万还是800多万帖子,系统负载很高了,MySQL明显的反应迟缓,甚至检索超时。前边提到第一次检索的问题,也讲了原因,SQL Server第一次因为要缓冲到内存中,所以需要读取整个数据库物理文件,所以第一次检索的速度是被磁盘给拖住了,实际上Windows大多数程序第一次启动都会很慢,包括ASP.Net页面也是一样,但是过了第一次,速度就明显提升;而MySQL始终如一,中规中矩的,第一次和第十次速度一样。但是通过监控系统的IO操作可以得知,MySQL始终都要频繁的读写物理文件,所以速度自然没有SQL Server高。当然区别不止是这个,但是我们平时很少涉及到千万数据量以上的检索,能看到的也就这些。

  再谈谈安全性,上面也提到了官方以及第三方数据,说明MySQL没有SQL Server安全,其实包括操作系统也是如此,Windows系统出现高危漏洞的次数远远少于Linux/Unix,而IIS的漏洞能数的过来,Apache的洞却很多很多。所以总有人说Linux怎么安全,我不知道他这样的论点,依据是什么。我从事过信息安全工作,关注漏洞列表是一个习惯,近几年来,Linux/Apache/MySQL的漏洞数量绝对在Windows/IIS/SQL Server的两倍以上。再说一个上面没有提到的安全性问题,就是数据库的物理文件,大家都知道,物理文件的安全性决定一切的,SQL Server的文件操作是很安全的,起码这10多年来我还没遇到过SQL Server莫名其妙的物理文件损坏的情况,而MySQL则遇到很多次了,莫名其妙的索引就坏了,有时候能修复,有时候还不能修复,逼的我们开发了自动备份系统。。。

  最后讲一个自己的事情。因为一些原因,我抓取了sohu一个子站的所有文章,15万多还是16万多,文字数量在1.5G,当时突发奇想对比两种数据库的性能。全部正确插入数据库以后做模糊检索,对比速度(MySQL少了几篇文章,因为转义字符太多,懒得查了)。SQL Server上我先做了一次大规模的模糊检索,让他挂载内存,然后sum(Like)一个几乎每篇文章都有的关键字,运行了三次,最差的一次是49毫秒,也就是0.049秒。然后做MySQL,测试了5次,每次都出不来结果,等了几分钟没响应,杀掉进程重启,再来……最后一次直接进程崩溃了,我也就没心情去研究了。

  根据自己这些年来服务器管理的经验来讲,SQL Server的强壮性、性能以及稳定性都要远远高于MySQL的(还没提到,MySQL有几次莫名其妙崩溃的事情),如果你的应用比较复杂,数据量大,并且是“关键性”应用,那么选择一个商业数据库是没错的,但是如果你实力很强,有自己研发能力,能做到像yahoo和Google那样集群,甚至是自己改造数据库的能力,那么用MySQL是适合你的。如果你的应用比较简单,数据量也不大,并且数据表的结构比较简单,那么MySQL适合你用,但是请你做好备份措施,MySQL的强壮性实在不敢恭维。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: