MySQL從開發人員手中的“玩具”變為如今的“世界上最流行的開源數據庫”,其中的過程伴隨著產品版本升級,以及一些新功能(特別是企業數據庫功能)的增加。現在,隨著MySQL 5.0被完美地開發出來,已經很少有人將MySQL稱為“玩具數據庫”了。MySQL的豐富功能滿足了許多用戶的需求,Oracle最近的動作表明了他們對待MySQL非常重視——Oracle曾幾次三番的表示有意收購MySQL。
MySQL的產品路線圖
讓我們先從MySQL的較有影響的版本產品開始,看一下MySQL的更新換代。
MySQL 4.0
MySQL 4.0是在2003年3月發布的,該版本使新的基於MySQL的應用程序獲得了更廣泛的應用。但是在4.0版中,MySQL不支持存儲過程、觸發程序、服務器端指針或視圖。MySQL 4.0是從3.23發展而來,較之3.23版本有了很大的提高,主要適用於Web站點,這時候的MySQL還不是一個企業級數據庫。
以下是MySQL 4.0的主要新特性:
FULLTEXT索引:最值得用戶期待的可能就是FULLTEXT索引。
FULLTEXT在文本字段創建索引,為對該索引執行布爾搜索提供了一個強大而靈活的機制。依照一般的開發經驗,開發人員通常必須創建索引並訪問文本數據,而FULLTEXT索引比想象中的還要好得多。
許多解決方案僅限於全字索引,FULLTEXT索引沒有這種限制,允許開發人員添加或拆分詞組。
ANSI SQL UNION:支持ANSI SQL UNION語句,該語句將詢問結果匯集到一個結果集。
多表操作:可以執行多表UPDATE和DELETE。
新語句:增加了其他DBMS用戶所熟悉的一些非標准的新語句(如IDENTITY和TRUNCATE TABLE),以及FOUND_ROWS()等新功能,這些功能可以返回無需LIMIT子句就能返回的紀錄的編號。
InnoDB存儲引擎:InnoDB存儲引擎在當時作為服務器的標准特性,在4.0版本中成為一個附加選項。InnoDb是允許ACID兼容事務的表類型,而非默認的MyISAM表類型,它可以加快一般性使用的速度,但對於關鍵操作不是十分有用。
InnoDB表使用行級別鎖定特性,這意味著對一個記錄的更新只鎖定該記錄,而不是整個表。當選擇訪問大量的數據庫時(對於大多數Web站點而言),鎖定整個表相當快,但是當插入和更新的數量接近於選項的數量時,則速度較慢。長期以來,對MySQL的批評一直集中在MyISAM表的安全性和一致性問題,兼容ACID的InnoDB表在解決這些問題上走過了很長一段路。
查詢緩存:MySQL 4.0在某些情況下可以更快捷。這主要通過查詢緩存得以實現,它將重復的查詢結果存儲起來,使速度得以提高,盡管許多成熟的應用程序在某個代碼級別上執行自己的查詢緩存功能。某些語句在速度上也有所提高。
Embededded Server:MySQL 4.0附帶了一個Embededded Server庫,允許應用程序以MySQL作為底層數據庫。
latin1_de :MySQL 4.0支持一個額外字符集latin1_de,它可確保正確存儲德語單詞。
MyISAM:MySQL 4.0中的MyISAM表目前在表級別上支持符號鏈接,所以Windows用戶可以在表級別上創建符號鏈接(這對於Unix用戶始終有效)。
安全模型:MySQL 4.0的安全模型得到了增強,允許管理員更加細致地授權許可。新的權限允許用戶創建臨時表、鎖定表、執行某些復制任務、查看所有現有的數據庫,甚至在達到最大連接限度時還能進行連接——對於DBA執行緊急任務非常有用,甚至允許運行存儲過程(在MySQL 5中實現了此功能)。DBA依靠增強的安全模式也可以限制用戶每小時的連接、更新或查詢次數。
MySQL 4設計運行在Novell Netware 6.0之上。另外,MySQL服務器變量中有不少可以在不重新啟動服務器的情況下進行更改,由於重新啟動會恢復舊的設置,因此這個特性非常有用。
MySQL 4.1
MySQL 4.1推出之後,對於某些用戶而言,4.1比MySQL 4.0具有更激動人心的升級可能:
MySQL 4.1支持子查詢。
不使用子查詢時,許多查詢可以更有效地編寫,但是會有例外。子查詢是標准ANSI SQL特性。
支持Unicode (UTF-8),允許更廣泛地進行國際化。
每個列、表或數據庫都可以設置不同的字符集,如果以多種語言存儲數據,這就很有必要了。
支持地理數據(OpenGIS)。
增強的警告發送。如果一個不夠,MySQL 4.1可以將多個警告發送到客戶端,這樣就對於整體數據處理十分有用。
提高了一些速度。但這些速度提高可能被MySQL 4.1所承擔的所有額外部分抵消。
盡管MySQL手冊是發布的最好手冊之一,MySQL 4.1還是附帶了僅適用於該版本的HELP命令。
支持派生表,例如: SELECT table1.field1 FROM table, (SELECT * FROM table2) table3 WHERE table1.field1=table3.fIEld1
支持多行查詢,允許運行多個查詢,然後讀取最終結果。
各種維護語句將存入二進制日志中,在復制時您可以簡化維護任務。
CREATE...LIKE允許開發人員按現有表的精確結構輕松地創建新表。另外,MySQL 4.1的三個顯著功能包括:穩定的OpenSSL支持、更多的測試准備語句、更多的測試一個表的多個字符集。
MySQL 4.1或許是第一個實際“長大成人”的MySQL版本。由於4.1版本中一些新增加的特性和功能(例如地理數據、子選擇語句、派生表),Oracle第一次開始真正關注MySQL。
MySQL 5.0
支持存儲過程。存儲過程是一個開發人員在其他數據庫環境最常用的ANSI SQL標准,對於MySQL來說,這已經姗姗來遲了。MySQL 5.0所支持的存儲過程的語法類似於Oracle PL/SQL和T-SQL。
觸發程序(發生某個事件時所稱的存儲過程)
支持指針
真正支持VARCHAR數據類型,解決了一個長期存在的MySQL VARCHAR bug。
在MyISAM表中對RTREE索引的支持,將使訪問地理數據變得很容易。
MySQL 5.1
相對於5.0版本,MySQL 5.1實現了一些新的功能:
聯機備份(允許添加replication slave,而不必關閉主服務器)。
BIT類型,實際占用1位,而不是1個字符。
失敗保護(failsafe)復制
列級別約束
全外連接(Full outer join),將來自表A的紀錄(包括表B中沒有匹配的返回記錄)和來自表B的記錄連接在一起(包括表A中沒有匹配的記錄)。
內部文件接口的更改將使文件處理更加普通,使它更容易添加擴展,如RAID。
RENAME DATABASE語句。
獲得長期運行命令的進程報告。
基於行的復制,該功能允許精確復制非確定性語句。
將日志文件寫入表格而不是文件(因此可使用SQL語句查詢)。
通過分區,從物理上加強對表存儲的控制。
更好地復制MySQL集群。
靈活的API插件,允許在運行服務器時加載和卸載組件。
負載仿真程序MySQLslap。
使用MySQLdump轉儲表空間。
事件調度程序(event scheduler),提供按時間運行語句的能力。
更大更好的元數據數據庫。
多個XML功能。
MySQL_upgrade腳本,允許用戶輕松升級到新版本。
未知實例管理器的新功能,允許用戶列出所有日志文件,返回某一日志文件的一部分,提供配置選項。
編寫包含按名稱對表進行直接引用的觸發程序。
MySQL 5.2
到目前為止,有關MySQL 5.2的文檔更多是描述其不足之處,並沒有介紹將來會如何發展。下面列出了不少可能會遭到批評或被取消的語句或結構(其中一些已經遭到批評),它們包括:
table_type變量、TYPE定義和SHOW TABLE TYPES語句,它們曾經稱為表類型現在已改稱存儲引擎。
log_bin_trust_routine_creators在TIMESTAMP(n)中定義(n)的能力。TIMESTAMP字段更願意總是存儲和返回完整的DATETIME。
BACKUP TABLE和RESTORE TABLE語句。在行之間讀取,這並不表示MySQL在硬驅動面前顯得無能為力。相反地,它更接近於一個正確的聯機備份設備,盡管具體計劃還未完備。目前,這些語句只針對MyISAM表而工作,並且每次鎖定一個表。獲得多個表的干淨的備份需要使用LOCK語句,該語句對大型或正在操作的表具有很大影響。現在推薦MySQLhotcopy腳本作為該語句的代替。
SHOW LOGS和SHOW BDB LOGS語句。優先選擇更加特定的同義詞SHOW ENGINE BDB LOGS。
LOAD TABLE FROM MASTER語句。該語句不是非常有用(一般更多的是使用LOAD DATA FROM MASTER),事實上,該語句通常用於調試LOAD DATA,如果用於現有的從屬語句,很可能導致災難。
SHOW INNODB和SHOW MUTEX語句。現在優先選擇的是更清晰的SHOW ENGINE INNODB STATUS和SHOW ENGINE INNODB MUTEX語句。
對於外鍵,從MySQL 3.23開始,InnoDB存儲引擎一直支持外鍵,其它存儲引擎曾經暫時支持過該語法,因此很多開發人員沒有注意到外鍵的缺失。但是,從版本5.2開始所有的存儲引擎,包括MyISAM引擎將完全支持外鍵。MyISAM最初設計是一個輕量級的快速存儲引擎。該引擎一開始性能很簡單,隨著新功能的日漸加入,人們開始對它的性能表現出了興趣。
MySQL目前打算在版本5.2中對所有存儲引擎提供外鍵支持,同時考慮平穩地拿掉適當的聯機備份功能。不過,還有一個增加的部分是視圖功能的添加,這個一直要求的功能本來打算只添加到MySQL 6中的。
MySQL某些領域的進展令人失望。筆者認為MaxDB和MySQL之間的互操作性應該有所改進,以便用戶使用標准MySQL工具,如與MaxDB交互的mysql和mysqldump,但過去了整整兩年,這一點並未實現。這是自從與Oracle斷絕關系以來,MySQL最令人失望的一點。
盡管MySQL集群在取得跳躍式進步,並使其成為MySQL DBA全套功能的重要組成部分。它現在還良好地集成了一般復制。
MySQL新開發特性
除去在每次的版本升級中增加新的功能之外,My還具有不針對某一具體版本的新開發特性,例如MySQL集群、MaxDB、MySQL Administrator。
MySQL集群
集群是一個很有意義的特性。MySQL的復制功能從未提供過失敗保護,使用它來提高可用性和冗余存在一些問題。集群解決方案通過並行地運行多台機器,很好地解決了這個問題,任何一台機器發生故障,其他的機器就能立刻分擔它。
2003年10月,MySQL AB收購了Alzato,這是一家由愛立信出資創建的公司。Alzato為電信市場開發了一款集群產品,MySQL將在第三季度發布以該產品為基礎的MySQL Cluster。
MySQL集群的基本特性是:
高度可用性。如果一台服務器發生故障,其他服務器會分擔負載。不存在單點故障。
高度可伸縮性。只是根據需要添加更多的服務器。
高性能。MySQL聲稱在四雙CPU節點標准設置下,解決方案每秒可以復制100 000個事務。
MaxDB
SAP為MySQL提供了他們的SAPDB數據庫,該數據庫現在改稱為MaxDB。這是一個在企業ERP環境中使用的成熟數據庫,具有用戶抱怨MySQL還不能可靠支持的所有特性,如存儲過程、視圖以及主要服務器發生故障時自動切換到備份服務器的功能。
現有MySQL用戶的問題在於,這是一個完全不同的產品,用戶可能會認為它可以很好地轉換到另一個產品。MaxDB目前不能與MySQL實現很好地互操作。不過,這種情況肯定會有所改觀,用戶將能夠使用標准MySQL工具,如與MaxDB交互的mysql和MySQLdump。
從另一方面,MaxDB減輕了MySQL AB宣布MySQL准備應用於企業的壓力。有了全功能的企業級就緒產品的支持,並且為公司帶來了收益,對MySQL數據庫的開發就能按自己的節奏進行了。一旦MySQL數據可以容易地導入到MaxDB中,MySQL還不能支持所有必要的企業特性這一事實已變得無關緊要。
MySQL中不支持的主要MaxDB特性:
視圖
服務器端指針
存儲過程和觸發程序
自動失敗恢復(到備用服務器)
警報的調度和自動消息傳遞
快照
存檔表
同義詞
MySQL Administrator
MySQL Administrator很快將能滿足Windows用戶的需求,這是一個執行定期管理任務的圖形工具。管理MySQL已經相當容易了,MySQL Administrator能使其更加容易。磁盤空間、大量詢問、內存使用、備份、服務器狀態和日志的集中查看,這些功能都可以從圖形界面輕松獲取,這很有用。盡管其他一些功能吸引著企業市場,但還是有很多Windows用戶不滿意命令行,這個工具將滿足他們的要求。其略微巧妙之處在於可以將圖標分配給用戶!這樣一來,甚至連有經驗的用戶也感覺處理一般任務更加容易了。
MySQL難以進行類型轉換(Typecast)的原因在於,控制著MySQL的MySQL AB在其混合產品中添加了MaxDB和其他產品。雖然MySQL的開發繼續保持高速,按現在的標准,產品達到了完全功能性,作為一個企業級就緒的數據庫管理系統(DBMS),MaxDB的到來意味著MySQL可以更加從容光地進行開發,希望代碼能夠因此而更加完美。作為一個開發人員,我知道當最終期限壓力來臨時什麼都會發生,我希望這兩種產品可以在一種健康的方式下慢慢地融合。MySQL AB對於商業化DBMS市場的預測不會遙遙無期,Oracle、IBM和Microsoft應該擔心他們產品的未來生存能力。正如甘地以前的格言所描述,“一開始他們不理你,接著嘲笑你,然後和你戰斗,最終你贏了”。現在MySQL開始戰斗了。
MySQL還缺少什麼?
將要發布的MySQL版本中添加的新功能和兩三年前添加的功能的一個很大的差異是,剛接手MySQL的富有經驗的數據庫管理員(DBA)驚訝於功能不足的可能性相對會小一些。以前,視圖、觸發程序、子查詢和存儲過程等重大功能都沒有。所有這些必要功能現在都具備了,從多多益善的角度來說,新的功能對於大多數開發人員來說已經足夠了。如果您對此持強烈反對意見,並聲稱絕對需要如事件調度程序之類的功能,環顧四周,您會看到自己是一個例外,這從反面證明了我所持的觀點是正確的。
現在MySQL在功能方面幾乎沒什麼不足了。相反,作為競爭者,MySQL現在更要依靠第三方支持,在集成到企業應用程序方面,它還很落後。不過,現在門被打開了,MySQL的廣泛采用在技術上幾乎不成問題。市場營銷和處理事務方面的不足將影響MySQL在競技舞台上的前途。
MySQL成為誰的競爭者?
深刻認識到MySQL已經來到(確切地說是即將到來)的是Oracle。公認的領先數據庫供應商Oracle,收購了Innobase OY,該公司負責MySQL的最高級存儲引擎InnoDB。之後不久,又收購了Sleepycat,該公司負責BDB存儲引擎。這些存儲引擎增加了很多需要的功能,缺少了這些功能,MySQL又會回到玩具數據庫狀態。此外,最能說明問題的是,Oracle提出了收購MySQL的報價——當然遭到了拒絕。
不過,MySQL的反應出乎意料。他們購買Jim Starkey的Netfrastructure並保護Jim Starkey的服務,使構建事務性存儲引擎的專業知識得以保護。Starkey被公認為是Interbase之父,後來致力於Firebird。MySQL重新制定了他們的InnoDB授權許可,確保與Oracle的多年關系暫時得到穩定。
MySQL現在發展勢頭良好。一些公司因支持MySQL而獲得了良好的收益,它的技術開發確保了它足以滿足巨大的市場需求,並有豐富的專業知識對其進行持續開發。MySQL對自己進行了定位,即使遭到了Oracle的打壓,它也能順利發展。將來最大的危險或許在於,如果MySQL AB接受Oracle的收購,並且MySQL繼續侵襲Oracle的數據庫市場,Oracle則會以收購MySQL來解決問題(Oracle早已在嘗試這麼做了),Oracle對自己的定位沒有限定在數據庫公司這一塊,這方面他們做得比較成功。