MYSQL,DB2,SQLSERVER數據庫不同點淺探(一)


     簡單地比較一下MYSQL,DB2,SQLSERVER數據庫設計不同點,為日后看MYSQL源代碼先打打底,今天先比較數據庫對象吧:

     1.DB2上關於表有一個表空間的概念,簡單地說, 表空間是數據庫系統中數據庫邏輯結構與操作系統物理結構之間建立映射的重要存儲結構,一般來說一個表空間對應一個表.DB2在表空間上分配表空間對應表的一切物理屬性,比如首次分配大小,擴展大小,頁面每頁初始空閑空間,空閑頁面占總頁面百分比等.因此,DB2上的系統DBA對表的操作更多是基於表空間上.比如因為表上的刪改查不可避免地會造成表頁面的碎片,DBA要定期對這些碎片進行清理,DBA實際操作的是重組表空間(同時順帶重組索引). DBA對表的備份實際也是通過對表空間的備份實現. 所以DB2上表的恢復可以通過恢復表空間文件或日志文件實現單表恢復,在這一點上DB2優於SQLSERVER.

    SQLSERVER上關於表並沒有比表空間的概念,物理信息是通過數據庫所在文件或者文件組實現.SQLSERVER上也有索引碎片和定期重組/重建索引的需求.SQLSERVER DBA 可通過DMV視圖去查詢當前索引的碎片量,一般高於30%的索引則必須重建索引;低於30%的索引則可通過重組來處理.(基准一般由項目而定).所以SQLSERVER上定期對索引的維護一般是重建索引

    MYSQL存儲上也有碎片的概念,但據官方文檔,這種碎片並不是因為一般數據刪改查而造成,而是因為MYSQL內部中使用VARCHAR,TEXT,BLOB等可變長度的數據類型刪改查造成.(-_-!刪改查中的霸主,也是刪改查),MYSQL上使用OPTIMIZE TABLE進行碎片整理,主要使用在MYISAM上.

其他DB2,SQLSERVER,MYISAM上面的管理維護在下一篇文章討論.

    2. 關於聚集索引和非聚集索引:

        SQLSERVER與DB2中存在聚集索引概念,你可以使用語句顯式創建聚集索引(加參數CLUSTERED);MYSQL中不存在顯式的聚集索引和非聚集索引, INNODB引擎下主鍵索引即為聚集索引,MYISAM下面沒有聚集索引.

        MYSQL中除了與SQLSERVER,DB2中類似的普通索引,單列索引,組合索引(后兩者在SQLSERVER與DB2中並不叫此稱謂但用法類似),全文索引(僅使用在MYISAM引擎)外,還存在特殊的空間索引.空間索引主要利用在GIS,幾何數學計算等方面. DB2中沒有空間索引,SQLSERVER中存在空間索引,但用法上跟MYSQL略有不同.

    3. 視圖,系統表.

應用視圖沒什么可說的,三者創建語句都基本一致.系統表也差不多,每個數據庫基本都提供系統表去查詢當前數據庫中應用數據庫的系統信息,比如表結構,表名,表的物理信息,SCHEMA信息,用戶信息,約束信息,存儲過程信息等等. SQLSERVER還提供了動態管理視圖(DMV), DBA可利用DMV查詢當前運行的QUERY,當前TASK利用CPU信息,當前運行最慢的SQL,當前的死鎖或阻塞等. DMV對SQLSERVER DBA非常重要,每個DBA都要掌握.

    4. 在系統內置函數上,MYSQL,SQLSERVER,DB2基本差不多,常用字符處理函數CONCAT,STRCMP,SUBSTRING,REVERSE,LTRIM,RTRIM,REPLACE等均存在或存在類似功能於MYSQL,SQLSERVER,DB2平台上.

    5. 觸發器和存儲過程:

      MYSQL,DB2中觸發器上均有對舊表和新表的標識和操作,SQLSERVER上沒有.

      SQLSERVER上觸發器語法中可涉及對列的監控,比如 ‘IF UPDATE(A1)’ 標明如果A1列被更新,則做相應的操作;MYSQL, DB2上沒有,只能通過,NEW,OLD比較來實現.

      MYSQL觸發器的觸發級別包括AFTER和BEFORE,SQLSERVER包括 AFTER和INSTEAR OF,DB2則包含這三種.

      MYSQL觸發器語法中包含’FOR EACH ROW‘這種顯示觸發器顆粒度語句,SQLSERVER觸發器語法上沒有,但實際執行也是遵循’FOR EACH ROW’. DB2 上還有’FOR EACH STATEMENT’選項,不過僅適用於激活級別是AFTER的時候.

      存儲過程創建語法,調用目的,編譯基本都差不多,只不過調用方法SQLSERVER 用’EXEC‘,MYSQL和DB2上用’CALL’而已. 目前據知乎消息,阿里這種國內頂尖互聯網公司已經內部禁止使用存儲過程了(我沒有親見,爭取過幾年進阿里感受感受).

    6. 數據類型:

        MYSQL中數據類型INT,SMALLINT等整型后面可加數字,該數字表示顯示的寬度,但該寬度並不影響實際取值范圍.比如INT(4),如果輸入不到4位的,會用空格填充;大於4位的,大於4的,顯示其實際數值. DB2,SQLSERVER中沒有這種所謂數據類型寬度的設計.

        MYSQL 的日期時間類型比SQLSERVER,DB2都豐富.

        SQLSERVER中的日期時間類型有: DATA,TIME,DATATIME;

        DB2中的日期時間類型有: DATA,TIME,TIMESTAMP;

        MYSQL中的相關日期時間類型有: YEAR,DATE,TIME,DATETIME,TIMESTAMP

        另外 : YEAR類型上 MYSQL 對4位數字或字符,2位數字,2位字符的處理方式不同,具體可參照說明文檔.

    7.  MYSQL中可以使用語句手動更改數據引擎;SQLSERVER,DB2中沒有這一設置. (SQLSERVER針對不同的服務提供不同的引擎,比如對分析服務提供的引擎就與基本管理服務中不一樣. DB2統一使用默認的引擎)

    8. 其他一些SQL查詢的細節:

        MYSQL 插入新列支持將新列插入到最前面(參數FIRST)或某指定字段的后面(AFTER), SQLSERVER,DB2默認只允許新列插入到最后. SQLSERVER中允許使用設計圖形界面將新列插入到某列后面,實際原理是先生成一個和修改后的表一樣的臨時表,將原來的表中的數據放到臨時表中,再將原來的表刪掉.(辛苦了,SQLSERVER-_-!)

        MYSQL中支持RENAME語句直接將表名改為另一個名字,語法如下:

ALTER TABLE OLDANAME RENAME newname;允許用ALTER TABLE … CHANGE的方式修改列名. CHANGE同樣可以修改新列的數據類型.

        SQLSERVER中不支持直接用語句修改,允許調用存儲過程 ‘sp_rename’去修改表名,同樣用該存儲過程可以用來修改列名.

        DB2中可以用RENAME … TO來修改表名,用ALTER TABLE語句修改表中列名屬性,但不允許直接修改列名,只允許刪除后添加不同列名的方式.

        MYSQL中使用LIMIT關鍵字查詢表中開頭或從m行開始的n行數據,SQLSERVER中支持TOP關鍵字以查詢開頭多少行的數據,DB2中使用’FETCH FIRST n rows only’來查詢開頭多少行的數據. 后兩者並不支持簡單用QUERY 語句去查詢m行開始的n行數據(目前的個人看法)

    9. 其他一些設置,如運算符,約束,系統函數大致一樣.

   

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM