SQL Server與MySQL數據庫對比

本文旨在幫助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 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的強壯性實在不敢恭維。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章