為何不用MySQL? (轉)

worldblog發表於2007-12-14
為何不用MySQL? (轉)[@more@]

注意:這篇文件寫於20005月。因此,它並不能說明My的最新特性。但從中我們仍然可以瞭解RMS的一些基本概念、原理,從而在實踐中更好地應用,同時也才能對一些不實的炒作保持必要的警惕。

 為何不用

作者:to:ben@mit.edu">Ben Adida  譯者:

幾乎每週、有時甚至更為頻繁,總有人會問我們為何不採用MySQL作為的(關係式資料庫管理)。ACS Classic team()也一再地在他們的論壇上遇到同樣的提問。如果MySQL對於Slashdot來說足夠好的話,它也一定能夠用於OpenACS,不是嗎?

不對。 這篇簡短的論文將嘗試解釋為何MySQL不僅對OpenACS來說是錯誤的選擇,它也不應被用於任何處理關鍵資料的系統。

RDBMS的目的

RDBMS的目的是提供一種可靠的永久機制,在ACID測試中具體表述了這種機制的非常嚴格的特性。我將直接引用PhilGreenspun的精彩解釋(以作為RDBMS的代表):

原子性(Atomicity

事務的結果或者被全部提交、或者被全部回滾(roll back)。要麼所有的變動都生效,要麼就沒有變動生效。假定一個正在編輯一條註釋,指令碼告訴資料庫“將舊註釋值複製到審計表中,並用新文字活動表”。如果在複製之後、更新之前變滿的話,審計表插入就將被回滾。

一致性(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、、PostgreSQL、Interbase)已經進行了多年的開發,有些還超過了10或15年。

MySQL的開發人員聲稱他們犧牲了某些特性,以保證更好的。儘管這或許是一種追蹤非關鍵資料(比如點選率追蹤)的有趣方法,在處理關鍵資料時,犧牲完全的資料完整性是不可接受的,即使是為了速度也同樣如此。

當MySQL成熟時,OpenACS團隊很高興對其進行距離更近的考察。但是,MySQL團隊似乎並不理解真正的ACID能力的概念和重要性:MySQL Todo在一個很長的列表中提到了“事務”,其中包括了諸如“睡眠程式佔用嗎”這樣的問題。此外,MySQL手冊聲稱MySQL將很快透過表鎖的使用來實現“原子操作”,但卻“沒有回滾”。這是對術語“原子的”明目張膽的誤用:“原子操作”意味著或者所有操作都完成,或者沒有操作完成。如果沒有回滾能力的話,在一組語句的中間發生的或電力故障將破壞塊的原子性。

回滾不只是一種便利的特性,它是可靠的資料儲存的關鍵性基礎。

有許多很好的理由使用MySQL,但對可靠的、順從ACID的資料儲存的需求卻並非是其中之一。

更多的細節

MySQL沒有子查詢。

對於複雜的查詢, MySQL使用者必須執行兩次或更多的系列查詢,每一次都需要在應用和資料庫間進行程式間通訊或通訊。這顯著地降低了MySQL的速度優勢。

MySQL沒有。

MySQL沒有或外來鍵約束。

MySQL只有表級鎖定。

結語

企業級系統不會為了速度而犧牲特定的特性。RDBMS的ACID屬性對於任何關鍵資料來說都是絕對必需品。在非 ACID順從的系統上執行的關鍵網站是在自找麻煩。

OpenACS專案拒絕打破ACID測試的重要法則。我們要構建的是企業級的開放原始碼 Web工具包。PostgreSQL、很快還有InterBase將成為這一專案合適的候選RDBMS。而MySQL只是一個有著SQL介面的被美化的檔案系統。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-993328/,如需轉載,請註明出處,否則將追究法律責任。

相關文章