一、為什么MySQL對(duì)SQL標(biāo)準(zhǔn)中很多基本用法都不支持
因?yàn)楫?dāng)年,在微軟.net技術(shù)棧下開(kāi)發(fā)應(yīng)用,用的就是sql server數(shù)據(jù)庫(kù)。在特性方面,不僅緊跟sql標(biāo)準(zhǔn)的步伐,還有自身特有的功能,用的時(shí)候簡(jiǎn)直爽到飛起來(lái)。 程序的業(yè)務(wù)邏輯, 基本上能在數(shù)據(jù)庫(kù)實(shí)現(xiàn)的就絕不會(huì)寫(xiě)到代碼里面,久而久之,程序代碼基本上已經(jīng)沒(méi)什么東西了,就用來(lái)作為界面和數(shù)據(jù)庫(kù)的中轉(zhuǎn)而已。而且,sql server強(qiáng)大之處在于,盡管邏輯全寫(xiě)在數(shù)據(jù)庫(kù)中,但是只要不瞎胡鬧,性能方面基本沒(méi)什么問(wèn)題出現(xiàn),再加上以visual studio為基礎(chǔ)的 management studio,就覺(jué)得.net和c#根本沒(méi)什么卵用了,直接數(shù)據(jù)庫(kù)可以搞定一切。不光是我,似乎大多數(shù).net系開(kāi)發(fā)者都是這么做的。
后來(lái)跳了槽,從.net系轉(zhuǎn)到了php、java系,用的是mysql數(shù)據(jù)庫(kù),然后我把之前開(kāi)發(fā)sql server應(yīng)用程序的那套思路搬了過(guò)來(lái)開(kāi)發(fā)mysql應(yīng)用,結(jié)果被同事和上級(jí)各種吐槽各種阻攔,他們認(rèn)為存儲(chǔ)過(guò)程、觸發(fā)器、視圖、復(fù)雜查詢之類的程序性能的毒藥,而且還影響代碼的可維護(hù)性,然而卻拿不出充分的理由,但是既然他們都堅(jiān)持, 那我自己特立獨(dú)行也沒(méi)這個(gè)必要,畢竟他們?nèi)硕鄤?shì)眾,我新來(lái)咋到也不能太張楊。另外,mysql沒(méi)有一個(gè)像樣的IDE,類似于navicat for mysql這種客戶端根本沒(méi)法和Microsoft SQL Server Management Studio相比,寫(xiě)起sql代碼來(lái)要多不爽就有多不爽。久而久之,數(shù)據(jù)庫(kù)在我的眼里就只剩增刪查改功能可以用了。
所以 我覺(jué)得mysql對(duì)sql標(biāo)準(zhǔn)支持的不完善的原因在于,因?yàn)檫@些特性本來(lái)就不是必要的,完全可以用程序來(lái)實(shí)現(xiàn),對(duì)于基于mysql程序的開(kāi)發(fā)者說(shuō),完全是可有可無(wú)的,而且還有可能引起某些極端分子的不滿,既然如此,那mysql團(tuán)隊(duì)自然不會(huì)有動(dòng)力去開(kāi)發(fā)這些功能, 因?yàn)殚_(kāi)發(fā)者根本沒(méi)有強(qiáng)烈的需求需要這些功能,這可能就是所謂的mysql文化吧。另外,如果誰(shuí)能開(kāi)發(fā)出一套類似于sql server那樣的數(shù)據(jù)配套工具,那說(shuō)不定能培養(yǎng)出一批像微軟技術(shù)棧那樣開(kāi)發(fā)者, 把sql能發(fā)揮的威力全炸出來(lái),到時(shí)候說(shuō)不定mysql團(tuán)隊(duì)對(duì)于sql標(biāo)準(zhǔn)支持的腳本也會(huì)漸漸跟上了。
延伸閱讀:
二、主要的單機(jī)存儲(chǔ)引擎
1、哈希存儲(chǔ):hash的CRUD是非??斓摹5秉c(diǎn)是不支持順序掃描。bitcask是一個(gè)基于hash表結(jié)構(gòu)的存儲(chǔ)系統(tǒng)。他將寫(xiě)操作(包括刪除標(biāo)識(shí))追加到文件尾。并定期合并新老文件&記錄。
2、B樹(shù):既支持隨機(jī)讀取又支持范圍查找的系統(tǒng)。查找時(shí)間復(fù)雜度為logd(n)(d為每個(gè)節(jié)點(diǎn)的出度)。Mysql的InnoDB的引擎和OS的文件系統(tǒng)使用的就是B+樹(shù)。(為什么選擇使用B樹(shù)的變種B+樹(shù),讀者有興趣可以去探究下。提示:磁盤(pán)讀?。?/p>
3、LSM樹(shù)(Log Structured Merge Tree):由B+數(shù)改進(jìn)而來(lái)。其思想為:將增量寫(xiě)操作保存在內(nèi)存中,超過(guò)閾值時(shí)刷入磁盤(pán),從而減少隨機(jī)寫(xiě)磁盤(pán)操作。讀操作則需要合并磁盤(pán)數(shù)據(jù)和內(nèi)存中的寫(xiě)操作。通過(guò)Memtable/SSTable實(shí)現(xiàn),實(shí)現(xiàn)細(xì)節(jié)在此不做深入探究。比較適合寫(xiě)操作較多的業(yè)務(wù)場(chǎng)景。BigTable/HBase/Cassandra中的列簇的數(shù)據(jù)存儲(chǔ)方式采用的即是LSM樹(shù)。