轉(zhuǎn)帖|行業(yè)資訊|編輯:王香|2017-02-06 11:17:49.000|閱讀 426 次
概述:MySQL體積小,速度快,功能豐富,總體擁有成本低。它還是一個開源的關(guān)聯(lián)式數(shù)據(jù)庫管理系統(tǒng),它的偉大成就說明了一個成功的公司是可以建立在開源之上的。雖然用過mysql的人都曾對其出現(xiàn)的問題而抓狂,但只要是機(jī)器,總避免不了出問題的,更何況是一種每秒能保存成千上萬行互聯(lián)網(wǎng)數(shù)據(jù),你怎么保證它一點錯誤都沒有呢?
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
以下列舉了8個開源關(guān)系型數(shù)據(jù)庫的缺陷,其中不僅限于MySQL,還有是針對關(guān)系型數(shù)據(jù)庫的。只有明白了關(guān)系型數(shù)據(jù)庫和MySQL,才能更好地避免在使用MySQL中盡量少地遇到一些意外。
1、無法避免的bugs
任何一個軟件包都有bug。但稍微深入了解一下,就會發(fā)現(xiàn)和Mysql相關(guān)的bugs自成體系。突然你就需要留心,因為NULL并不是以同樣的方式出現(xiàn),外鍵約束也沒有像你想像的那樣執(zhí)行,連主鍵自動增長也會出錯。
到處都避免不了小問題,而且并不總是可以修復(fù)的,這就是為什么一些人保持一個列表。還好MySQL維護(hù)著一個非常好的bug報告系統(tǒng),讓我們可以知道我些我們無法想像的事情,知道其他人也在經(jīng)受同樣的磨難。
2、關(guān)系表的不靈活性
關(guān)系表具有條理性是好的,但這迫使程序員要編造或把一些數(shù)據(jù)塞到已經(jīng)定義好模式的列中。NoSQL之所以越來越受歡迎,其中一個原因就是它為程序員提供了足夠的靈活性,以加速數(shù)據(jù)庫的使用。如果一個街道地址需要增加一行,那么,你可以將它很容易地插入到一個NoSQL文檔中。如果你想添加一個完整的新的數(shù)據(jù)塊,無論它包含什么內(nèi)容,文檔模型也可以原封不動地接受你的數(shù)據(jù),而不必改為它要求的數(shù)據(jù)格式。
假設(shè)你用整數(shù)格式建立了一個全部是郵編的表格。這個表十分高效,執(zhí)行規(guī)則也很好。可是有一次,有人上傳了一個使用了連字符的九位數(shù)郵編。或者說你得到了一位來自他國的客戶的信件,上面寫有郵政編碼。這時,你會感到一切都亂了。老板要求網(wǎng)站要在幾小時內(nèi)恢復(fù)正常工作。然而,你已經(jīng)沒有時間重建數(shù)據(jù)庫。程序員可以做什么?使用黑客手段把這位客戶的郵政編碼由base 64的數(shù)字格式改為base 10格式?或者設(shè)置一個使用轉(zhuǎn)義編碼的輔助表格,用來說明真正的郵政編碼或者其他?危險的黑客無處不在,但你沒有時間來搞定它。
MySQL的關(guān)聯(lián)規(guī)則讓每個人都誠實和謹(jǐn)慎,但它能強(qiáng)制我們避開易受攻擊和欺騙的麻煩。
3、存儲引擎混亂
總體來說,Mysql的存儲引擎接口定義還算良好的。MySQL不是實際上的同一的數(shù)據(jù)庫。它是由幾個數(shù)據(jù)庫組成,它們的大多數(shù)細(xì)節(jié)都被統(tǒng)一的表面掩蓋了。開始時有一個MyISAM引擎,它很快但在前后一致上不能做到完備。有時你需要速度并且可以接受不一致的結(jié)果時是很好的。
當(dāng)人們需要更多時,具備完整事務(wù)支持的Inno DB出現(xiàn)了。但這還不夠。現(xiàn)在,它可能有20種存儲引擎的選擇——這足以使一個數(shù)據(jù)庫管理員瘋狂。當(dāng)然,有時在不同的存儲引擎之間切換而不必重寫你的SQL是很好的,但是切換后總會帶來混亂。這個表格我選擇的引擎是MyISAM還是innoDB呢?或者,我決定輸出的數(shù)據(jù)是CSV格式的嗎?
4、JOIN聯(lián)合查詢
曾經(jīng),將數(shù)據(jù)分表保存是計算機(jī)科學(xué)史上的偉大創(chuàng)新。分開后的表不僅結(jié)構(gòu)簡單,使用上也簡化了許多。但它卻需要使用join語句來進(jìn)行查詢。
sql通過一系列join構(gòu)建的復(fù)雜查詢將開發(fā)者推入了困惑與絕望的深淵。而且存儲引擎也需要以最優(yōu)的方式來高效地解析join語句。開發(fā)者需要絞盡腦汁編寫查詢語句,然后數(shù)據(jù)庫對其進(jìn)行解析。
這就是很多注重運行速度的開發(fā)者放棄數(shù)據(jù)分表轉(zhuǎn)而使用不規(guī)范數(shù)據(jù)表的原因。不區(qū)分?jǐn)?shù)據(jù)實體,將所有數(shù)據(jù)保存到一個大表中——以避免復(fù)雜的查詢。這樣確實很快,并且服務(wù)器也不會耗盡內(nèi)存。
現(xiàn)在的磁盤空間很廉價。8TB的磁盤已經(jīng)在售,更大容量的也將上市。我們不再需要為使用join而絞盡腦汁了。
5、分支的混亂
毋庸置疑,一個可靠的、得到良好支持的MySQL分支,可以帶來競爭和選擇,但是它也引起困惑和混亂。更糟糕的是,一個稱為MariaDB的MySQL分支,由Monty Widenius維護(hù)著。他同樣也在參與編寫MySQL。那么,Maria DB是真正獨立的值得我們擁護(hù)的嗎?或者它是MySQL?我們是否應(yīng)該堅持使用由創(chuàng)建原始mysql數(shù)據(jù)庫的組織運營的核心代碼?或者我們應(yīng)該加入那些被認(rèn)為更聰明的,往往很酷的背叛者?
如何獲取關(guān)于兼容性的信息?雖然Maria DB和MySQL十分相似,但它們之間也有差異。這就是大家一直都在爭論它的原因。在性能方面,在我們查詢的范圍內(nèi),在兩個陣營中,也許它們的工作方式相同,但也許不同,也許將來會不同。
6、開發(fā)MySQL的動機(jī)
雖然MySQL是一款成功的開源產(chǎn)品,但它仍屬于商業(yè)中的一款產(chǎn)品,專業(yè)開發(fā)者需要靠它來獲得利益,當(dāng)然,最直接的利益就是薪資。當(dāng)大多數(shù)用戶在持續(xù)地享受開源許可證帶來的最佳體驗時,毫無疑問這家公司還在為賺取足夠的錢來維持運營而努力。這導(dǎo)致自由代碼在“社區(qū)版”和出售給企業(yè)的完整產(chǎn)品之間產(chǎn)生了奇怪的分岐。
我們應(yīng)該對這款產(chǎn)品付錢嗎?這種在社區(qū)版開展經(jīng)營的行為是否公平?企業(yè)版中額外的功能是不是一個噱頭,以引誘我們不斷付費的呢?這至少說明一點,它是另一些需要回答的問題:選用哪個版本?遵照哪種許可證?選用它的哪個功能集?
7、原生JSON支持的缺乏
通過安裝MySQL查看其年齡,然后你就知道需要添加哪些驅(qū)動程序使它變得可用。MySQL通常在3306端口上通信,一般輸出的是它本身難以理解的格式化數(shù)據(jù)。如果要讓你的代碼和它通信,你必須添加另一層代碼,將MySQL的語言轉(zhuǎn)換成有用的東西。這些層的代碼,以庫的形式分發(fā),經(jīng)常需要人們購買一個商業(yè)許可證。
現(xiàn)代數(shù)據(jù)存儲層通常直接以JSON通信。雖然MySQL和Maria DB現(xiàn)在有能力解析SQL中的JSON部分,但這還遠(yuǎn)遠(yuǎn)不夠,原生的JSON接口已經(jīng)被廣泛使用于CouchDB、MongoDB,或任何最新的工具中。
8、封閉源和專有模塊的興起
雖然MySQL是開源的,但除了一些在”開源核心“周邊開發(fā)的一些較新的、非開源的代碼和專有模塊。程序員也需要賺錢、需要生活,Oracle需要拿它的辛苦成果來換錢,這是一種現(xiàn)實,也是商業(yè)的性質(zhì)。使用MySQL你也不可以免費得到任何東西。
要求MySQL始終堅持在一個很高的標(biāo)準(zhǔn)上,這有點不公平,因為開源的成功可能是一個圈套。它開始可以免費,但并不意味著它可以始終免費。如果企業(yè)需要更多新的功能,他們就要通過各種方式付費來獲取。有時向Oracle付費,比自己來編寫代碼要便宜得多。有時商業(yè)的、不開源的代碼是有意義的。
MySQL雖然作為一個成功的開源系統(tǒng),但以上這些問題也總不可避免地出現(xiàn),這就需要我們在它們發(fā)生之前有個深刻的認(rèn)識,才能在今后的應(yīng)用中避免不必要的麻煩。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn