注意:這篇文檔寫于2000年5月。因此,它并不能說明MySQL的最新特性。但從中我們仍然可以了解RDBMS的一些基本概念、原理,從而在實踐中更好地應用數據庫,同時也才能對一些不實的炒作保持必要的警惕。
為何不用MySQL?
作者:Ben Adida 譯者:馬維達
幾乎每周、有時甚至更為頻繁,總有人會問我們為何不采用MySQL作為OpenACS的RDBMS(關系式數據庫管理系統)。ACS Classic team(ArsDigita)也一再地在他們的論壇上遇到同樣的提問。如果MySQL對于Slashdot來說足夠好的話,它也一定能夠用于OpenACS,不是嗎?
不對。 這篇簡短的論文將嘗試解釋為何MySQL不僅對OpenACS來說是錯誤的選擇,它也不應被用于任何處理關鍵數據的系統。
RDBMS的目的
RDBMS的目的是提供一種可靠的永久存儲機制,在ACID測試中具體表述了這種機制的非常嚴格的特性。我將直接引用Philip Greenspun的精彩解釋(以Oracle作為RDBMS的代表):
原子性(Atomicity)
事務的執行結果或者被全部提交、或者被全部回滾(roll back)。要么所有的變動都生效,要么就沒有變動生效。假定一個用戶正在編輯一條注釋,Web腳本告訴數據庫“將舊注釋值拷貝到審計表中,并用新文本更新活動表”。如果在拷貝之后、更新之前硬盤變滿的話,審計表插入就將被回滾。
一致性(Consistency)
數據庫從一種有效狀態轉換到另一種有效狀態。僅在服從用戶定義的完整性約束時,一個事務才是合法的。不允許非法的事務,而且,如果不能滿足某完整性約束的話,該事務會被回滾。例如,假定你定義了一條規則:論壇表中的帖子必須與有效的用戶ID相關聯。然后你雇用了Joe Novice來編寫管理頁面。Joe編寫了一個刪除用戶頁面,它不會檢查刪除是否會產生一些無主的論壇帖子。然而像Oracle這樣的RDBMS將會進行檢查,并中止任何事務,如果它產生的論壇帖子為已被刪除的用戶所擁有的話。
隔離性(Isolation)
一個事務的結果對于其他事務是不可見的,直到該事務完成為止。例如,假定你有一個顯示新用戶和他們的照片的頁面。按照出版者的要求,在頁面中每個用戶都有一張面部照片,如果用戶沒有照片的話就顯示一幅表示無照片的圖像。在新用戶Jane在你的站點注冊的同時,老用戶Bill正在查看新用戶頁面。處理Jane的注冊的腳本會對若干表進行插入:users、mugshots、users_demographics。如果Jane的面部照片很大的話,上述插入可能會需要一些時間。如果Bill的查詢在Jane的事務提交之前開始的話,Bill根本不會在他的新用戶頁面上看到Jane,即使在Jane的事務中,對某些表的插入已經完成。
持久性(Durability)
一旦提交(完成),事務的結果將是永久性的,并能免于未來的系統和介質故障。假設你的電子商務系統將來自某消費者的定單插入數據庫表中,并指示CyberCash收取該消費者500美元的費用。突然間,在你的服務器收到CyberCash的回復之前,有人絆掉了機器的電源線。在這樣的情況下,Oracle將不會忘記該定單。而且,如果有程序員將咖啡灑進了磁盤驅動器中,安裝一個新磁盤,并將事務回復到咖啡潑灑時為止是可能的;數據將顯示你曾試圖收取某人500美元,并且還不清楚在CyberCash那里發生了什么。
如果你所要的是快速的裸存儲,去使用文件系統。如果你想要在多臺機器間進行共享,去使用NFS。如果你想要簡單的可靠性,以對付過于簡單的故障,去使用鏡像。想要給它們加上SQL接口?去使用MySQL。
現在,如果你所要的是這樣的數據存儲,它能夠使你的數據集的若干方面保持恒定,能夠對這些數據進行復雜的操作、而永不違反上述的那些約束,能夠將多個用戶同時進行的局部工作彼此隔離開來,并且能夠從任何種類的故障中進行平穩的恢復,那就給你自己找一個真正的RDBMS。是的,它會比MySQL文件系統慢,就像TCP比UDP慢一樣,但它們卻提供了更好的服務擔保。
MySQL的現狀與未來
構建真正的 RDBMS是一項艱巨的任務,也許比任何其他系統問題都要艱巨。市場上的大多數產品(Oracle、Sybase、PostgreSQL、Interbase)已經進行了多年的開發,有些還超過了10或15年。
MySQL的開發人員聲稱他們犧牲了某些特性,以保證更好的性能。盡管這或許是一種追蹤非關鍵數據(比如點擊率追蹤)的有趣方法,在處理關鍵數據時,犧牲完全的數據完整性是不可接受的,即使是為了速度也同樣如此。
當MySQL成熟時,OpenACS團隊很高興對其進行距離更近的考察。但是,MySQL團隊似乎并不理解真正的ACID能力的概念和重要性:MySQL Todo在一個很長的列表中提到了“事務”,其中包括了諸如“睡眠進程占用CPU嗎”這樣的問題。此外,MySQL手冊聲稱MySQL將很快通過表鎖的使用來實現“原子操作”,但卻“沒有回滾”。這是對術語“原子的”明目張膽的誤用:“原子操作”意味著或者所有操作都完成,或者沒有操作完成。如果沒有回滾能力的話,在一組語句的中間發生的硬件或電力故障將破壞塊的原子性。
回滾不只是一種便利的特性,它是可靠的數據存儲的關鍵性基礎。
有許多很好的理由使用MySQL,但對可靠的、順從ACID的數據存儲的需求卻并非是其中之一。
更多的細節
l MySQL沒有子查詢。
對于復雜的查詢, MySQL用戶必須執行兩次或更多的系列查詢,每一次都需要在應用和數據庫間進行進程間通信或網絡通信。這顯著地降低了MySQL的速度優勢。
l MySQL沒有存儲過程。
l MySQL沒有觸發器或外鍵約束。
l MySQL只有表級鎖定。
結語
企業級系統不會為了速度而犧牲特定的特性。RDBMS的ACID屬性對于任何關鍵數據來說都是絕對必需品。在非 ACID順從的系統上運行的關鍵網站是在自找麻煩。
OpenACS項目拒絕打破ACID測試的重要法則。我們要構建的是企業級的開放源碼 Web工具包。PostgreSQL、很快還有InterBase將成為這一項目合適的候選RDBMS。而MySQL只是一個有著SQL接口的被美化的文件系統。
新聞熱點
疑難解答