内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

關(guān)于postgresql分片的信息

「PostgreSQL架構(gòu)」為什么RDBMS是分布式數(shù)據(jù)庫(kù)的未來(lái)

大約10年前,我加入了Amazon Web Services,在那里我第一次看到了在分布式系統(tǒng)中進(jìn)行權(quán)衡的重要性。在大學(xué)里,我已經(jīng)了解了一致性和可用性之間的權(quán)衡(CAP定理),但實(shí)際上,頻譜要比這深得多。任何設(shè)計(jì)決策都可能涉及延遲,并發(fā)性,可伸縮性,耐用性,可維護(hù)性,功能性,操作簡(jiǎn)便性以及系統(tǒng)其他方面之間的權(quán)衡,而這些權(quán)衡會(huì)對(duì)應(yīng)用程序的功能和用戶體驗(yàn)產(chǎn)生有意義的影響,并且即使是業(yè)務(wù)本身的有效性。

創(chuàng)新互聯(lián)-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比托克遜網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式托克遜網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋托克遜地區(qū)。費(fèi)用合理售后完善,十年實(shí)體公司更值得信賴。

也許在權(quán)衡需求最明顯的分布式系統(tǒng)中最具挑戰(zhàn)性的問(wèn)題是構(gòu)建分布式數(shù)據(jù)庫(kù)。當(dāng)應(yīng)用程序開(kāi)始需要可以在許多服務(wù)器上擴(kuò)展的數(shù)據(jù)庫(kù)時(shí),數(shù)據(jù)庫(kù)開(kāi)發(fā)人員開(kāi)始做出極端的權(quán)衡。為了在許多節(jié)點(diǎn)上實(shí)現(xiàn)可伸縮性,分布式鍵值存儲(chǔ)(NoSQL)拋棄了傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(RDBMS)提供的豐富功能集,包括SQL,聯(lián)接,外鍵和ACID保證。由于每個(gè)人都想要可伸縮性,因此RDBMS消失只是時(shí)間問(wèn)題,對(duì)嗎?實(shí)際上,關(guān)系數(shù)據(jù)庫(kù)繼續(xù)主導(dǎo)著數(shù)據(jù)庫(kù)領(lǐng)域。這就是為什么:

在分布式系統(tǒng)(或任何系統(tǒng))中進(jìn)行權(quán)衡時(shí),要考慮的最重要方面是開(kāi)發(fā)成本。

數(shù)據(jù)庫(kù)軟件所做出的權(quán)衡將對(duì)應(yīng)用程序的開(kāi)發(fā)成本產(chǎn)生重大影響。在高級(jí)應(yīng)用程序中處理需要可用性,可靠性和性能的數(shù)據(jù)是一個(gè)固有地需要解決的問(wèn)題。成功解決每個(gè)小問(wèn)題所需的工時(shí)數(shù)量可能很大。幸運(yùn)的是,數(shù)據(jù)庫(kù)可以解決許多這些子問(wèn)題,但是數(shù)據(jù)庫(kù)開(kāi)發(fā)人員也面臨成本問(wèn)題。實(shí)際上,要使數(shù)據(jù)庫(kù)足以滿足大多數(shù)應(yīng)用程序的功能,保證和性能,就需要數(shù)十年的時(shí)間。那就是建立關(guān)系數(shù)據(jù)庫(kù)如PostgreSQL和MySQL的地方。

在Citus Data,我們從不同角度解決了數(shù)據(jù)庫(kù)可伸縮性的需求。我和我的團(tuán)隊(duì)在過(guò)去的幾年中花費(fèi)了很多時(shí)間將已建立的RDBMS轉(zhuǎn)換為分布式數(shù)據(jù)庫(kù),而又不會(huì)失去其強(qiáng)大功能或從基礎(chǔ)項(xiàng)目中分叉。通過(guò)這樣做,我們發(fā)現(xiàn)RDBMS是構(gòu)建分布式數(shù)據(jù)庫(kù)的理想基礎(chǔ)。

使RDBMS對(duì)開(kāi)發(fā)應(yīng)用程序(尤其是開(kāi)源RDBMS,尤其是云RDBMS)如此吸引人的原因在于,您可以有效地利用數(shù)十年來(lái)對(duì)RDBMS進(jìn)行的工程投資,并利用這些RDBMS功能。您的應(yīng)用,降低了開(kāi)發(fā)成本。

RDBMS為您提供:

這些功能幾乎對(duì)任何非平凡的應(yīng)用都很重要,但是要花很長(zhǎng)時(shí)間才能開(kāi)發(fā)。另一方面,某些應(yīng)用程序的工作量對(duì)于單臺(tái)計(jì)算機(jī)來(lái)說(shuō)太過(guò)苛刻,因此需要水平可伸縮性。

許多新的分布式數(shù)據(jù)庫(kù)正在開(kāi)發(fā)中,并且正在分布式鍵值存儲(chǔ)(“ NewSQL”)之上實(shí)現(xiàn)RDBMS功能,例如SQL。盡管這些較新的數(shù)據(jù)庫(kù)可以使用多臺(tái)計(jì)算機(jī)的資源,但是在SQL支持,查詢性能,并發(fā)性,索引,外鍵,事務(wù),存儲(chǔ)過(guò)程等方面,它們?nèi)赃h(yuǎn)未建立在關(guān)系數(shù)據(jù)庫(kù)系統(tǒng)上。您遇到許多要在應(yīng)用程序中解決的復(fù)雜問(wèn)題。

許多大型互聯(lián)網(wǎng)公司采用的替代方法是RDBMS的手動(dòng),應(yīng)用程序?qū)臃制ㄍǔJ荘ostgreSQL或MySQL)。手動(dòng)分片意味著有許多RDBMS節(jié)點(diǎn),并且應(yīng)用程序會(huì)根據(jù)某種條件(例如,用戶ID)決定連接到哪個(gè)節(jié)點(diǎn)。應(yīng)用程序本身負(fù)責(zé)如何處理數(shù)據(jù)放置,架構(gòu)更改,查詢多個(gè)節(jié)點(diǎn),復(fù)制表等,因此,如果執(zhí)行手動(dòng)分片,最終將在應(yīng)用程序中實(shí)現(xiàn)自己的分布式數(shù)據(jù)庫(kù),這可能甚至更多。昂貴。

幸運(yùn)的是,有一種方法可以解決開(kāi)發(fā)成本難題。

PostgreSQL已有數(shù)十年的發(fā)展 歷史 ,其令人難以置信的重點(diǎn)是代碼質(zhì)量,模塊化和可擴(kuò)展性。這種可擴(kuò)展性提供了一個(gè)獨(dú)特的機(jī)會(huì):無(wú)需分叉就可以將PostgreSQL轉(zhuǎn)換為分布式數(shù)據(jù)庫(kù)。這就是我們構(gòu)建Citus的方式。

大約5年前,當(dāng)我加入一家名為Citus Data的初創(chuàng)公司時(shí),我為在競(jìng)爭(zhēng)激烈的市場(chǎng)中建立高級(jí)分布式數(shù)據(jù)庫(kù)而無(wú)任何現(xiàn)有基礎(chǔ)架構(gòu),品牌知名度,進(jìn)入市場(chǎng),資本或大量工程師的挑戰(zhàn)感到沮喪 。 僅開(kāi)發(fā)成本就似乎是無(wú)法克服的。 但是,就像應(yīng)用程序開(kāi)發(fā)人員利用PostgreSQL來(lái)構(gòu)建復(fù)雜的應(yīng)用程序一樣,我們利用PostgreSQL來(lái)構(gòu)建……分布式PostgreSQL。

我們創(chuàng)建了Citus,這是開(kāi)源的PostgreSQL擴(kuò)展,而不是從頭開(kāi)始創(chuàng)建分布式數(shù)據(jù)庫(kù),它以提供水平擴(kuò)展的方式透明地分發(fā)表和查詢,但是應(yīng)用程序開(kāi)發(fā)人員需要具備所有PostgreSQL功能才能成功。

通過(guò)使用在計(jì)劃查詢時(shí)Postgres調(diào)用的內(nèi)部掛鉤,我們能夠?qū)⒎植际奖淼母拍钐砑拥絇ostgres。

分布式表的分片存儲(chǔ)在具有所有現(xiàn)有功能的常規(guī)PostgreSQL節(jié)點(diǎn)中,Citus發(fā)送常規(guī)SQL命令以查詢分片,然后合并結(jié)果。 我們還添加了參考表的概念,該參考表可在所有節(jié)點(diǎn)上復(fù)制,因此可以通過(guò)任何列與分布式表連接。 通過(guò)進(jìn)一步增加對(duì)分布式事務(wù),查詢路由,分布式子查詢和CTE,序列,更新等的支持,我們達(dá)到了最先進(jìn)的PostgreSQL功能可以使用的規(guī)模,但現(xiàn)在已經(jīng)可以大規(guī)模使用。

Citus相對(duì)來(lái)說(shuō)還很年輕,但是已經(jīng)建立在PostgreSQL之上,已經(jīng)成為世界上最先進(jìn)的分布式數(shù)據(jù)庫(kù)之一。與PostgreSQL的完整功能集相比,這令人毛骨悚然,還有許多工作要做,Citus現(xiàn)在提供的功能及其擴(kuò)展方式使其在分布式數(shù)據(jù)庫(kù)環(huán)境中具有很大的獨(dú)特性。許多當(dāng)前的Citus用戶最初使用Postgres中的許多高級(jí)功能在單節(jié)點(diǎn)PostgreSQL服務(wù)器上建立業(yè)務(wù),然后僅用幾周的開(kāi)發(fā)工作就遷移到Citus,以將其數(shù)據(jù)庫(kù)模式轉(zhuǎn)換為分布式表和引用表。對(duì)于任何其他數(shù)據(jù)庫(kù),從單節(jié)點(diǎn)數(shù)據(jù)庫(kù)到分布式數(shù)據(jù)庫(kù)的這種遷移可能要花費(fèi)數(shù)月甚至數(shù)年的時(shí)間。

像PostgreSQL這樣的RDBMS具有幾乎無(wú)限的功能和成熟的SQL引擎,可讓您以多種方式查詢數(shù)據(jù)。當(dāng)然,這些功能只有在速度很快時(shí)才對(duì)應(yīng)用程序有用。幸運(yùn)的是,PostgreSQL很快,并且通過(guò)諸如實(shí)時(shí)查詢編譯之類的新功能不斷提高,但是當(dāng)您擁有大量數(shù)據(jù)或流量以至于一臺(tái)機(jī)器速度太慢時(shí),那些強(qiáng)大的功能就不再那么有用了……除非您可以結(jié)合許多計(jì)算機(jī)的計(jì)算能力。這就是功能成為超級(jí)大國(guó)的地方。

通過(guò)采用PostgreSQL功能并進(jìn)行擴(kuò)展,Citus具有許多超級(jí)功能,這些功能使用戶可以將數(shù)據(jù)庫(kù)擴(kuò)展到任意大小,同時(shí)保持高性能及其所有功能。

盡管大多數(shù)這些功能對(duì)于開(kāi)發(fā)需要擴(kuò)展的復(fù)雜應(yīng)用程序來(lái)說(shuō)似乎都是必不可少的,但并不是所有分布式數(shù)據(jù)庫(kù)都支持它們。下面我們根據(jù)公開(kāi)提供的文檔對(duì)一些流行的分布式數(shù)據(jù)庫(kù)進(jìn)行比較。

與在分布式數(shù)據(jù)庫(kù)中擁有超級(jí)功能相比,更重要的是能夠組合數(shù)據(jù)庫(kù)超級(jí)功能來(lái)解決復(fù)雜的用例。

由于支持查詢路由,參考表,索引,分布式事務(wù)和存儲(chǔ)過(guò)程,因此即使最先進(jìn)的多租戶OLTP應(yīng)用程序(例如Copper)也可以使用Citus擴(kuò)展到單個(gè)PostgreSQL節(jié)點(diǎn)之外,而不會(huì)在應(yīng)用程序中做出任何犧牲。

如果將子查詢下推與并行的分布式DML結(jié)合使用,則可以在數(shù)據(jù)庫(kù)內(nèi)部轉(zhuǎn)換大量數(shù)據(jù)。一個(gè)常見(jiàn)的示例是使用INSERT…SELECT構(gòu)建匯總表,該表可以并行化以適應(yīng)任何類型的數(shù)據(jù)量。結(jié)合通過(guò)COPY,索引,聯(lián)接和分區(qū)進(jìn)行的批量加載,您將擁有一個(gè)非常適合時(shí)間序列數(shù)據(jù)和實(shí)時(shí)分析應(yīng)用程序(如Algolia儀表板)的數(shù)據(jù)庫(kù)。

正如Microsoft的Min Wei在談到Microsoft如何使用Citus和PostgreSQL分析Windows數(shù)據(jù)時(shí)指出的那樣:Citus使您能夠使用分布式OLTP解決大規(guī)模OLAP問(wèn)題。

Citus與其他分布式數(shù)據(jù)庫(kù)有些不同,后者通常是從頭開(kāi)始開(kāi)發(fā)的。 Citus沒(méi)有引入PostgreSQL中尚未提供的任何功能。 Citus數(shù)據(jù)庫(kù)以滿足需要擴(kuò)展的用例的方式擴(kuò)展了現(xiàn)有功能。重要的是,大多數(shù)PostgreSQL功能已經(jīng)針對(duì)各種用例進(jìn)行了數(shù)十年的開(kāi)發(fā)和測(cè)試,而當(dāng)今用例的功能要求最終并沒(méi)有太大不同;主要是數(shù)據(jù)的規(guī)模和大小不同。因此,在構(gòu)建現(xiàn)代應(yīng)用程序時(shí),基于世界上最先進(jìn)的開(kāi)源RDBMS(PostgreSQL?。?gòu)建的分布式數(shù)據(jù)庫(kù)(如Citus)可以成為您的武器庫(kù)中最強(qiáng)大的工具。

原文:

本文:

討論:請(qǐng)加入知識(shí)星球或者微信圈子【首席架構(gòu)師圈】

什么是一個(gè)好辦法,在PostgreSQL的水平片段

PostgreSQL允許劃分兩種不同的方式.a個(gè)是由范圍,而另一個(gè)是由列表。表繼承做分區(qū)。 通過(guò)分區(qū)范圍,通常一個(gè)日期范圍,是但通過(guò)分區(qū)列表可以的,如果是這樣的分區(qū)變量是靜態(tài)的,沒(méi)有歪斜。 分區(qū)是通過(guò)表繼承這樣做的優(yōu)先件事就是建立新的子表。

CREATE TABLE measurement (

x int not null,

y date not null,

z int

);

CREATE TABLE measurement_y2006 (

CHECK ( logdate = DATE '2006-01-01' AND logdate DATE '2007-01-01' )

) INHERITS (measurement);

CREATE TABLE measurement_y2007 (

CHECK ( logdate = DATE '2007-01-01' AND logdate DATE '2008-01-01' )

) INHERITS (measurement);

那么無(wú)論是規(guī)則或觸發(fā)器需要?jiǎng)h除該數(shù)據(jù)在正確的表格。 規(guī)則是更快的批量更新,單觸發(fā)更新 CodeGo.net,以及更易于維護(hù)。下面是一個(gè)示例觸發(fā)。

CREATE TRIGGER insert_measurement_trigger

BEFORE INSERT ON measurement

FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();

和觸發(fā)函數(shù)來(lái)進(jìn)行插入

CREATE OR REPLACE FUNCTION measurement_insert_trigger()

RETURNS TRIGGER AS $$

BEGIN

IF ( NEW.logdate = DATE '2006-01-01'

AND NEW.logdate DATE '2007-01-01' ) THEN

INSERT INTO measurement_y2006 VALUES (NEW.*);

ELSIF ( NEW.logdate = DATE '2007-01-01'

AND NEW.logdate DATE '2008-01-01' ) THEN

INSERT INTO measurement_y2006m03 VALUES (NEW.*);

ELSE

RAISE EXCEPTION 'Date out of range.';

END IF;

RETURN NULL;

END;

$$

LANGUAGE plpgsql;

這些例子是簡(jiǎn)化了的PostgreSQL版本,以便于閱讀。 我不熟悉pgpool2,但gridsql是專為EnterpriseDB公司,這是建立在PostgreSQL的頂部數(shù)據(jù)庫(kù)的產(chǎn)品。他們的產(chǎn)品是非常好的,但我不認(rèn)為它會(huì)工作在標(biāo)準(zhǔn)postgresl。

2. 那么,如果問(wèn)題是關(guān)于分片,那么的pgpool和PostgreSQL的分區(qū)函數(shù)是無(wú)效的答案。 分區(qū)的分區(qū)是在服務(wù)器上。 分片是更通用,使用時(shí)數(shù)據(jù)庫(kù)被分割在幾個(gè)服務(wù)器上。分片分區(qū)的時(shí)候是不可能的更多,比如對(duì)于不適合在單個(gè)磁盤(pán)上的大型數(shù)據(jù)庫(kù)。 對(duì)于真正的分片那么Skype的PL /代理可能是最好的。

3. PL /代理(通過(guò)Skype等)是一個(gè)很好的解決方案。它需要你的訪問(wèn)是通過(guò)一個(gè)函數(shù)的API,但一旦你有,它可以讓它非常透明。

postgresql的語(yǔ)法與mysql有什么區(qū)別

一、 PostgreSQL 的穩(wěn)定性極強(qiáng), Innodb 等引擎在崩潰、斷電之類的災(zāi)難場(chǎng)景下抗打擊能力有了長(zhǎng)足進(jìn)步,然而很多 MySQL 用戶都遇到過(guò)Server級(jí)的數(shù)據(jù)庫(kù)丟失的場(chǎng)景——mysql系統(tǒng)庫(kù)是MyISAM的,相比之下,PG數(shù)據(jù)庫(kù)這方面要好一些。

二、任何系統(tǒng)都有它的性能極限,在高并發(fā)讀寫(xiě),負(fù)載逼近極限下,PG的性能指標(biāo)仍可以維持雙曲線甚至對(duì)數(shù)曲線,到頂峰之后不再下降,而 MySQL 明顯出現(xiàn)一個(gè)波峰后下滑(5.5版本之后,在企業(yè)級(jí)版本中有個(gè)插件可以改善很多,不過(guò)需要付費(fèi))。

三、PG 多年來(lái)在 GIS 領(lǐng)域處于優(yōu)勢(shì)地位,因?yàn)樗胸S富的幾何類型,實(shí)際上不止幾何類型,PG有大量字典、數(shù)組、bitmap 等數(shù)據(jù)類型,相比之下mysql就差很多,instagram就是因?yàn)镻G的空間數(shù)據(jù)庫(kù)擴(kuò)展POSTGIS遠(yuǎn)遠(yuǎn)強(qiáng)于MYSQL的my spatial而采用PGSQL的。

四、PG 的“無(wú)鎖定”特性非常突出,甚至包括 vacuum 這樣的整理數(shù)據(jù)空間的操作,這個(gè)和PGSQL的MVCC實(shí)現(xiàn)有關(guān)系。

五、PG 的可以使用函數(shù)和條件索引,這使得PG數(shù)據(jù)庫(kù)的調(diào)優(yōu)非常靈活,mysql就沒(méi)有這個(gè)功能,條件索引在web應(yīng)用中很重要。

六、PG有極其強(qiáng)悍的 SQL 編程能力(9.x 圖靈完備,支持遞歸!),有非常豐富的統(tǒng)計(jì)函數(shù)和統(tǒng)計(jì)語(yǔ)法支持,比如分析函數(shù)(ORACLE的叫法,PG里叫window函數(shù)),還可以用多種語(yǔ)言來(lái)寫(xiě)存儲(chǔ)過(guò)程,對(duì)于R的支持也很好。這一點(diǎn)上MYSQL就差的很遠(yuǎn),很多分析功能都不支持,騰訊內(nèi)部數(shù)據(jù)存儲(chǔ)主要是MYSQL,但是數(shù)據(jù)分析主要是HADOOP+PGSQL(聽(tīng)李元佳說(shuō)過(guò),但是沒(méi)有驗(yàn)證過(guò))。

七、PG 的有多種集群架構(gòu)可以選擇,plproxy 可以支持語(yǔ)句級(jí)的鏡像或分片,slony 可以進(jìn)行字段級(jí)的同步設(shè)置,standby 可以構(gòu)建WAL文件級(jí)或流式的讀寫(xiě)分離集群,同步頻率和集群策略調(diào)整方便,操作非常簡(jiǎn)單。

八、一般關(guān)系型數(shù)據(jù)庫(kù)的字符串有限定長(zhǎng)度8k左右,無(wú)限長(zhǎng) TEXT 類型的功能受限,只能作為外部大數(shù)據(jù)訪問(wèn)。而 PG 的 TEXT 類型可以直接訪問(wèn),SQL語(yǔ)法內(nèi)置正則表達(dá)式,可以索引,還可以全文檢索,或使用xml xpath。用PG的話,文檔數(shù)據(jù)庫(kù)都可以省了。

九,對(duì)于WEB應(yīng)用來(lái)說(shuō),復(fù)制的特性很重要,mysql到現(xiàn)在也是異步復(fù)制,pgsql可以做到同步,異步,半同步復(fù)制。還有mysql的同步是基于binlog復(fù)制,類似oracle golden gate,是基于stream的復(fù)制,做到同步很困難,這種方式更加適合異地復(fù)制,pgsql的復(fù)制基于wal,可以做到同步復(fù)制。同時(shí),pgsql還提供stream復(fù)制。

十,pgsql對(duì)于numa架構(gòu)的支持比mysql強(qiáng)一些,比MYSQL對(duì)于讀的性能更好一些,pgsql提交可以完全異步,而mysql的內(nèi)存表不夠?qū)嵱茫ㄒ驗(yàn)楸礞i的原因)

最后說(shuō)一下我感覺(jué) PG 不如 MySQL 的地方。

第一,MySQL有一些實(shí)用的運(yùn)維支持,如 slow-query.log ,這個(gè)pg肯定可以定制出來(lái),但是如果可以配置使用就更好了。

第二是mysql的innodb引擎,可以充分優(yōu)化利用系統(tǒng)所有內(nèi)存,超大內(nèi)存下PG對(duì)內(nèi)存使用的不那么充分,

第三點(diǎn),MySQL的復(fù)制可以用多級(jí)從庫(kù),但是在9.2之前,PGSQL不能用從庫(kù)帶從庫(kù)。

第四點(diǎn),從測(cè)試結(jié)果上看,mysql 5.5的性能提升很大,單機(jī)性能強(qiáng)于pgsql,5.6應(yīng)該會(huì)強(qiáng)更多.

第五點(diǎn),對(duì)于web應(yīng)用來(lái)說(shuō),mysql 5.6 的內(nèi)置MC API功能很好用,PGSQL差一些。

另外一些:

pgsql和mysql都是背后有商業(yè)公司,而且都不是一個(gè)公司。大部分開(kāi)發(fā)者,都是拿工資的。

說(shuō)mysql的執(zhí)行速度比pgsql快很多是不對(duì)的,速度接近,而且很多時(shí)候取決于你的配置。

對(duì)于存儲(chǔ)過(guò)程,函數(shù),視圖之類的功能,現(xiàn)在兩個(gè)數(shù)據(jù)庫(kù)都可以支持了。

另外多線程架構(gòu)和多進(jìn)程架構(gòu)之間沒(méi)有絕對(duì)的好壞,oracle在unix上是多進(jìn)程架構(gòu),在windows上是多線程架構(gòu)。

很多pg應(yīng)用也是24/7的應(yīng)用,比如skype. 最近幾個(gè)版本VACUUM基本不影響PGSQL 運(yùn)行,8.0之后的PGSQL不需要cygwin就可以在windows上運(yùn)行。

至于說(shuō)對(duì)于事務(wù)的支持,mysql和pgsql都沒(méi)有問(wèn)題。

MySQL與PostgreSQL相比哪個(gè)更好

MySQL

MySQL聲稱自己是最流行的開(kāi)源數(shù)據(jù)庫(kù)。LAMP中的M指的就是MySQL。構(gòu)建在LAMP上的應(yīng)用都會(huì)使用MySQL,如WordPress、Drupal等大多數(shù)php開(kāi)源程序。MySQL最初是由MySQL AB開(kāi)發(fā)的,然后在2008年以10億美金的價(jià)格賣(mài)給了Sun公司,Sun公司又在2010年被Oracle收購(gòu)。Oracle支持MySQL的多個(gè)版本:Standard、Enterprise、Classic、Cluster、Embedded與Community。其中有一些是免費(fèi)下載的,另外一些則是收費(fèi)的。其核心代碼基于GPL許可,由于MySQL被控制在Oracle,社區(qū)擔(dān)心會(huì)對(duì)MySQL的開(kāi)源會(huì)有影響,所以開(kāi)發(fā)了一些分支,比如: MariaDB和Percona。

PostgreSQL

PostgreSQL標(biāo)榜自己是世界上最先進(jìn)的開(kāi)源數(shù)據(jù)庫(kù)。PostgreSQL的一些粉絲說(shuō)它能與Oracle相媲美,而且沒(méi)有那么昂貴的價(jià)格和傲慢的客服。最初是1985年在加利福尼亞大學(xué)伯克利分校開(kāi)發(fā)的,作為Ingres數(shù)據(jù)庫(kù)的后繼。PostgreSQL是完全由社區(qū)驅(qū)動(dòng)的開(kāi)源項(xiàng)目。它提供了單個(gè)完整功能的版本,而不像MySQL那樣提供了多個(gè)不同的社區(qū)版、商業(yè)版與企業(yè)版。PostgreSQL基于自由的BSD/MIT許可,組織可以使用、復(fù)制、修改和重新分發(fā)代碼,只需要提供一個(gè)版權(quán)聲明即可。

MySQL與PostgreSQL的對(duì)比

MySQL的背后是一個(gè)成熟的商業(yè)公司,而PostgreSQL的背后是一個(gè)龐大的志愿開(kāi)發(fā)組。這使得MySQL的開(kāi)發(fā)過(guò)程更為慎重,而PostgreSQL的反應(yīng)更為迅速。這樣的兩種背景直接導(dǎo)致了各自固有的優(yōu)點(diǎn)和缺點(diǎn)。

PostgreSQL相對(duì)于MySQL的優(yōu)勢(shì)

1)不僅僅是關(guān)系型數(shù)據(jù)庫(kù)

除了存儲(chǔ)正常的數(shù)據(jù)類型外,還支持存儲(chǔ):

array,不管是一位數(shù)組還是多為數(shù)組均支持

json(hStore)和jsonb,相比使用text存儲(chǔ)接送要高效很多

json和jsonb之間的區(qū)別

jsonb和json在更高的層面上看起來(lái)幾乎是一樣的,但在存儲(chǔ)實(shí)現(xiàn)上是不同的。

json存儲(chǔ)完的文本,json列會(huì)每次都解析存儲(chǔ)的值,它不支持索引,但你可以為查詢創(chuàng)建表達(dá)式索引。

jsonb存儲(chǔ)的二進(jìn)制格式,避免了重新解析數(shù)據(jù)結(jié)構(gòu)。它支持索引,這意味著你可以不使用指定的索引就能查詢?nèi)魏温窂健?/p>

當(dāng)我們比較寫(xiě)入數(shù)據(jù)速度時(shí),由于數(shù)據(jù)存儲(chǔ)的方式的原因,jsonb會(huì)比json稍微的慢一點(diǎn)。json列會(huì)每次都解析存儲(chǔ)的值,這意味著鍵的順序要和輸入的時(shí)候一樣。但jsonb不同,以二進(jìn)制格式存儲(chǔ)且不保證鍵的順序。因此,如果你有軟件需要依賴鍵的順序,jsonb可能不是你的應(yīng)用的最佳選擇。使用jsonb的優(yōu)勢(shì)還在于你可以輕易的整合關(guān)系型數(shù)據(jù)和非關(guān)系型數(shù)據(jù), PostgreSQL對(duì)于mongodb這類的基于文檔的數(shù)據(jù)庫(kù)是個(gè)不小的威脅,畢竟如果一個(gè)表中只有一列數(shù)據(jù)的類型是半結(jié)構(gòu)化的,沒(méi)有必要為了遷就它而整個(gè)表的設(shè)計(jì)采用schemaless的結(jié)構(gòu)。

2)支持地理信息處理擴(kuò)展

PostGIS 為PostgreSQL提供了存儲(chǔ)空間地理數(shù)據(jù)的支持,使PostgreSQL成為了一個(gè)空間數(shù)據(jù)庫(kù),能夠進(jìn)行空間數(shù)據(jù)管理、數(shù)量測(cè)量與幾何拓?fù)浞治?。在功能上,和MYSQL對(duì)比,PostGIS具有下列優(yōu)勢(shì):

O2O業(yè)務(wù)場(chǎng)景中的LBS業(yè)務(wù)使用PostgreSQL + PostGIS有無(wú)法比擬的優(yōu)勢(shì)。

3)可以快速構(gòu)建REST API

PostgREST 可以方便的為任何 PostgreSQL 數(shù)據(jù)庫(kù)提供完全的 RESTful API 服務(wù)。

4)支持樹(shù)狀結(jié)構(gòu)

支持R-trees這樣可擴(kuò)展的索引類型,可以更方便地處理一些特殊數(shù)據(jù)。MySQL 處理樹(shù)狀的設(shè)計(jì)會(huì)很復(fù)雜, 而且需要寫(xiě)很多代碼, 而 PostgreSQL 可以高效處理樹(shù)結(jié)構(gòu)。

5)有極其強(qiáng)悍的 SQL 編程能力

支持遞歸,有非常豐富的統(tǒng)計(jì)函數(shù)和統(tǒng)計(jì)語(yǔ)法支持。

MySQL:支持 CREATE PROCEDURE 和 CREATE FUNCTION 語(yǔ)句。存儲(chǔ)過(guò)程可以用 SQL 和 C++ 編寫(xiě)。用戶定義函數(shù)可以用 SQL、C 和 C++ 編寫(xiě)。

PostgreSQL:沒(méi)有單獨(dú)的存儲(chǔ)過(guò)程,都是通過(guò)函數(shù)實(shí)現(xiàn)的。用戶定義函數(shù)可以用 PL/pgSQL(專用的過(guò)程語(yǔ)言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 編寫(xiě)。

6)外部數(shù)據(jù)源支持

可以把 70 種外部數(shù)據(jù)源 (包括 Mysql, Oracle, CSV, hadoop …) 當(dāng)成自己數(shù)據(jù)庫(kù)中的表來(lái)查詢。Postgres有一個(gè)針對(duì)這一難題的解決方案:一個(gè)名為“外部數(shù)據(jù)封裝器(Foreign Data Wrapper,F(xiàn)DW)”的特性。該特性最初由PostgreSQL社區(qū)領(lǐng)袖Dave Page四年前根據(jù)SQL標(biāo)準(zhǔn)SQL/MED(SQL Management of External Data)開(kāi)發(fā)。FDW提供了一個(gè)SQL接口,用于訪問(wèn)遠(yuǎn)程數(shù)據(jù)存儲(chǔ)中的遠(yuǎn)程大數(shù)據(jù)對(duì)象,使DBA可以整合來(lái)自不相關(guān)數(shù)據(jù)源的數(shù)據(jù),將它們存入Postgres數(shù)據(jù)庫(kù)中的一個(gè)公共模型。這樣,DBA就可以訪問(wèn)和操作其它系統(tǒng)管理的數(shù)據(jù),就像在本地Postgres表中一樣。例如,使用FDW for MongoDB,數(shù)據(jù)庫(kù)管理員可以查詢來(lái)自文檔數(shù)據(jù)庫(kù)的數(shù)據(jù),并使用SQL將它與來(lái)自本地Postgres表的數(shù)據(jù)相關(guān)聯(lián)。借助這種方法,用戶可以將數(shù)據(jù)作為行、列或JSON文檔進(jìn)行查看、排序和分組。他們甚至可以直接從Postgres向源文檔數(shù)據(jù)庫(kù)寫(xiě)入(插入、更細(xì)或刪除)數(shù)據(jù),就像一個(gè)一體的無(wú)縫部署。也可以對(duì)Hadoop集群或MySQL部署做同樣的事。FDW使Postgres可以充當(dāng)企業(yè)的中央聯(lián)合數(shù)據(jù)庫(kù)或“Hub”。

7)沒(méi)有字符串長(zhǎng)度限制

一般關(guān)系型數(shù)據(jù)庫(kù)的字符串有限定長(zhǎng)度8k左右,無(wú)限長(zhǎng) TEXT 類型的功能受限,只能作為外部大數(shù)據(jù)訪問(wèn)。而PostgreSQL的 TEXT 類型可以直接訪問(wèn),SQL語(yǔ)法內(nèi)置正則表達(dá)式,可以索引,還可以全文檢索,或使用xml xpath。MySQL 的各種text字段有不同的限制,要手動(dòng)區(qū)分 small text, middle text, large text… PostgreSQL 沒(méi)有這個(gè)限制,text 能支持各種大小。

8)支持圖結(jié)構(gòu)數(shù)據(jù)存儲(chǔ)

沒(méi)有具體使用過(guò),具體可以自己搜索下。參考鏈接:

9)支持窗口函數(shù)

窗口函數(shù)提供跨行相關(guān)的當(dāng)前查詢行集執(zhí)行計(jì)算的能力。僅當(dāng)調(diào)用跟著OVER子句的聚集函數(shù),作為窗口函數(shù);否則它們作為常規(guī)的聚合函數(shù)。窗口也是一種分組,但和 group by 的分組不同。窗口,可以提供分組之外,還可以執(zhí)行對(duì)每個(gè)窗口進(jìn)行計(jì)算??梢韵嘞癯墒莋roup by 后,然后對(duì)每個(gè)分組進(jìn)行計(jì)算,而不像Group by ,只是單純地分組。MySQL 不支持 OVER 子句, 而PostgreSQL支持。OVER 子句能簡(jiǎn)單的解決 “每組取 top 5” 的這類問(wèn)題。MySQL支持的SQL語(yǔ)法(ANSI SQL標(biāo)準(zhǔn))的很小一部分。不支持遞歸查詢、通用表表達(dá)式(Oracle的with 語(yǔ)句)或者窗口函數(shù)(分析函數(shù))。

10)對(duì)索引的支持更強(qiáng)

PostgreSQL 的可以使用函數(shù)和條件索引,這使得PostgreSQL數(shù)據(jù)庫(kù)的調(diào)優(yōu)非常靈活,mysql就沒(méi)有這個(gè)功能,條件索引在web應(yīng)用中很重要。對(duì)于索引類型:

MySQL:取決于存儲(chǔ)引擎。MyISAM:BTREE,InnoDB:BTREE。

PostgreSQL:支持 B-樹(shù)、哈希、R-樹(shù)和 Gist 索引。

InnoDB的表和索引都是按相同的方式存儲(chǔ)。也就是說(shuō)表都是索引組織表。這一般要求主鍵不能太長(zhǎng)而且插入時(shí)的主鍵最好是按順序遞增,否則對(duì)性能有很大影響。PostgreSQL不存在這個(gè)問(wèn)題。

索引類型方面,MySQL取決于存儲(chǔ)引擎。MyISAM:BTREE,InnoDB:BTREE。PostgreSQL支持 B-樹(shù)、哈希、R-樹(shù)和 Gist 索引。

11)集群支持更好

Mysql Cluster可能與你的想象有較大差異。開(kāi)源的cluster軟件較少。復(fù)制(Replication)功能是異步的并且有很大的局限性。例如,它是單線程的(single-threaded),因此一個(gè)處理能力更強(qiáng)的Slave的恢復(fù)速度也很難跟上處理能力相對(duì)較慢的Master。

PostgreSQL有豐富的開(kāi)源cluster軟件支持。plproxy 可以支持語(yǔ)句級(jí)的鏡像或分片,slony 可以進(jìn)行字段級(jí)的同步設(shè)置,standby 可以構(gòu)建WAL文件級(jí)或流式的讀寫(xiě)分離集群,同步頻率和集群策略調(diào)整方便,操作非常簡(jiǎn)單。

另外,PostgreSQL的主備復(fù)制屬于物理復(fù)制,相對(duì)于MySQL基于binlog的邏輯復(fù)制,數(shù)據(jù)的一致性更加可靠,復(fù)制性能更高,對(duì)主機(jī)性能的影響也更小。對(duì)于WEB應(yīng)用來(lái)說(shuō),復(fù)制的特性很重要,mysql到現(xiàn)在也是異步復(fù)制,pgsql可以做到同步,異步,半同步復(fù)制。還有mysql的同步是基于binlog復(fù)制,類似oracle golden gate,是基于stream的復(fù)制,做到同步很困難,這種方式更加適合異地復(fù)制,pgsql的復(fù)制基于wal,可以做到同步復(fù)制。同時(shí),pgsql還提供stream復(fù)制。

12)事務(wù)隔離做的更好

MySQL 的事務(wù)隔離級(jí)別 repeatable read 并不能阻止常見(jiàn)的并發(fā)更新, 得加鎖才可以, 但悲觀鎖會(huì)影響性能, 手動(dòng)實(shí)現(xiàn)樂(lè)觀鎖又復(fù)雜. 而 PostgreSQL 的列里有隱藏的樂(lè)觀鎖 version 字段, 默認(rèn)的 repeatable read 級(jí)別就能保證并發(fā)更新的正確性, 并且又有樂(lè)觀鎖的性能。

13)對(duì)于字符支持更好一些

MySQL 里需要 utf8mb4 才能顯示 emoji 的坑, PostgreSQL 沒(méi)這個(gè)坑。

14)對(duì)表連接支持較完整

對(duì)表連接支持較完整,MySQL只有一種表連接類型:嵌套循環(huán)連接(nested-loop),不支持排序-合并連接(sort-merge join)與散列連接(hash join)。PostgreSQL都支持。

15)存儲(chǔ)方式支持更大的數(shù)據(jù)量

PostgreSQL主表采用堆表存放,MySQL采用索引組織表,能夠支持比MySQL更大的數(shù)據(jù)量。

16)時(shí)間精度更高

MySQL對(duì)于時(shí)間、日期、間隔等時(shí)間類型沒(méi)有秒以下級(jí)別的存儲(chǔ)類型,而PostgreSQL可以精確到秒以下。

17)優(yōu)化器的功能較完整

MySQL對(duì)復(fù)雜查詢的處理較弱,查詢優(yōu)化器不夠成熟,explain看執(zhí)行計(jì)劃的結(jié)果簡(jiǎn)單。性能優(yōu)化工具與度量信息不足。

PostgreSQL很強(qiáng)大的查詢優(yōu)化器,支持很復(fù)雜的查詢處理。explain返回豐富的信息。提供了一些性能視圖,可以方便的看到發(fā)生在一個(gè)表和索引上的select、delete、update、insert統(tǒng)計(jì)信息,也可以看到cache命中率。網(wǎng)上有一個(gè)開(kāi)源的pgstatspack工具。

18)序列支持更好

MySQL 不支持多個(gè)表從同一個(gè)序列中取 id, 而 PostgreSQL 可以。

19)對(duì)子查詢支持更好

對(duì)子查詢的支持。雖然在很多情況下在SQL語(yǔ)句中使用子查詢效率低下,而且絕大多數(shù)情況下可以使用帶條件的多表連接來(lái)替代子查詢,但是子查詢的存在在很多時(shí)候仍然不可避免。而且使用子查詢的SQL語(yǔ)句與使用帶條件的多表連接相比具有更高的程序可讀性。幾乎任何數(shù)據(jù)庫(kù)的子查詢 (subquery) 性能都比 MySQL 好。

20)增加列更加簡(jiǎn)單

MySQL表增加列,基本上是重建表和索引,會(huì)花很長(zhǎng)時(shí)間。PostgreSQL表增加列,只是在數(shù)據(jù)字典中增加表定義,不會(huì)重建表.

MySQL相對(duì)于PostgreSQL的優(yōu)勢(shì)

1)MySQL比PostgreSQL更流行

流行對(duì)于一個(gè)商業(yè)軟件來(lái)說(shuō),也是一個(gè)很重要的指標(biāo),流行意味著更多的用戶,意味著經(jīng)受了更多的考驗(yàn),意味著更好的商業(yè)支持、意味著更多、更完善的文檔資料。易用,很容易安裝。第三方工具,包括可視化工具,讓用戶能夠很容易入門(mén)。

2)回滾實(shí)現(xiàn)更優(yōu)

innodb的基于回滾段實(shí)現(xiàn)的MVCC機(jī)制,相對(duì)PG新老數(shù)據(jù)一起存放的基于XID的MVCC機(jī)制,是占優(yōu)的。新老數(shù)據(jù)一起存放,需要定時(shí)觸發(fā)VACUUM,會(huì)帶來(lái)多余的IO和數(shù)據(jù)庫(kù)對(duì)象加鎖開(kāi)銷(xiāo),引起數(shù)據(jù)庫(kù)整體的并發(fā)能力下降。而且VACUUM清理不及時(shí),還可能會(huì)引發(fā)數(shù)據(jù)膨脹。

3)在Windows上運(yùn)行更可靠

與PostgreSQL相比,MySQL更適宜在Windows環(huán)境下運(yùn)行。MySQL作為一個(gè)本地的Windows應(yīng)用程序運(yùn)行(在 NT/Win2000/WinXP下,是一個(gè)服務(wù)),而PostgreSQL是運(yùn)行在Cygwin模擬環(huán)境下。PostgreSQL在Windows下運(yùn)行沒(méi)有MySQL穩(wěn)定,應(yīng)該是可以想象的。

4)線程模式相比進(jìn)程模式的優(yōu)勢(shì)

MySQL使用了線程,而PostgreSQL使用的是進(jìn)程。在不同線程之間的環(huán)境轉(zhuǎn)換和訪問(wèn)公用的存儲(chǔ)區(qū)域顯然要比在不同的進(jìn)程之間要快得多。

進(jìn)程模式對(duì)多CPU利用率比較高。進(jìn)程模式共享數(shù)據(jù)需要用到共享內(nèi)存,而線程模式數(shù)據(jù)本身就是在進(jìn)程空間內(nèi)都是共享的,不同線程訪問(wèn)只需要控制好線程之間的同步。

線程模式對(duì)資源消耗比較少。所以MySQL能支持遠(yuǎn)比PostgreSQL多的更多的連接。但PostgreSQL中有優(yōu)秀的連接池軟件軟件,如pgbouncer和pgpool,所以通過(guò)連接池也可以支持很多的連接。

5)權(quán)限設(shè)置上更加完善

MySQL在權(quán)限系統(tǒng)上比PostgreSQL某些方面更為完善。PostgreSQL只支持對(duì)于每一個(gè)用戶在一個(gè)數(shù)據(jù)庫(kù)上或一個(gè)數(shù)據(jù)表上的 INSERT、SELECT和UPDATE/DELETE的授權(quán),而MySQL允許你定義一整套的不同的數(shù)據(jù)級(jí)、表級(jí)和列級(jí)的權(quán)限。對(duì)于列級(jí)的權(quán)限, PostgreSQL可以通過(guò)建立視圖,并確定視圖的權(quán)限來(lái)彌補(bǔ)。MySQL還允許你指定基于主機(jī)的權(quán)限,這對(duì)于目前的PostgreSQL是無(wú)法實(shí)現(xiàn)的,但是在很多時(shí)候,這是有用的。

6)存儲(chǔ)引擎插件化機(jī)制

MySQL的存儲(chǔ)引擎插件化機(jī)制,使得它的應(yīng)用場(chǎng)景更加廣泛,比如除了innodb適合事務(wù)處理場(chǎng)景外,myisam適合靜態(tài)數(shù)據(jù)的查詢場(chǎng)景。

7)適應(yīng)24/7運(yùn)行

MySQL可以適應(yīng)24/7運(yùn)行。在絕大多數(shù)情況下,你不需要為MySQL運(yùn)行任何清除程序。PostgreSQL目前仍不完全適應(yīng)24/7運(yùn)行,這是因?yàn)槟惚仨毭扛粢欢螘r(shí)間運(yùn)行一次VACUUM。

8)更加試用于簡(jiǎn)單的場(chǎng)景

PostgreSQL只支持堆表,不支持索引組織表,Innodb只支持索引組織表。

索引組織表的優(yōu)勢(shì):表內(nèi)的數(shù)據(jù)就是按索引的方式組織,數(shù)據(jù)是有序的,如果數(shù)據(jù)都是按主鍵來(lái)訪問(wèn),那么訪問(wèn)數(shù)據(jù)比較快。而堆表,按主鍵訪問(wèn)數(shù)據(jù)時(shí),是需要先按主鍵索引找到數(shù)據(jù)的物理位置。

索引組織表的劣勢(shì):索引組織表中上再加其它的索引時(shí),其它的索引記錄的數(shù)據(jù)位置不再是物理位置,而是主鍵值,所以對(duì)于索引組織表來(lái)說(shuō),主鍵的值不能太大,否則占用的空間比較大。

對(duì)于索引組織表來(lái)說(shuō),如果每次在中間插入數(shù)據(jù),可能會(huì)導(dǎo)致索引分裂,索引分裂會(huì)大大降低插入的性能。所以對(duì)于使用innodb來(lái)說(shuō),我們一般最好讓主鍵是一個(gè)無(wú)意義的序列,這樣插入每次都發(fā)生在最后,以避免這個(gè)問(wèn)題。

由于索引組織表是按一個(gè)索引樹(shù),一般它訪問(wèn)數(shù)據(jù)塊必須按數(shù)據(jù)塊之間的關(guān)系進(jìn)行訪問(wèn),而不是按物理塊的訪問(wèn)數(shù)據(jù)的,所以當(dāng)做全表掃描時(shí)要比堆表慢很多,這可能在OLTP中不明顯,但在數(shù)據(jù)倉(cāng)庫(kù)的應(yīng)用中可能是一個(gè)問(wèn)題。

總結(jié)

MySQL從一開(kāi)始就沒(méi)有打算做所有事情,因而它在功能方面有一定的局限性,并不能滿足一些先進(jìn)應(yīng)用程序的要求。MySQL對(duì)某些功能(例如引用、事務(wù)、審計(jì)等)的實(shí)現(xiàn)方式使得它與其他的關(guān)系型數(shù)據(jù)庫(kù)相比缺少了一些可靠性。對(duì)于簡(jiǎn)單繁重的讀取操作,使用PostgreSQL可能有點(diǎn)小題大做,同時(shí)性能也比MySQL這樣的同類產(chǎn)品要差。除非你需要絕對(duì)的數(shù)據(jù)完整性,ACID遵從性或者設(shè)計(jì)復(fù)雜,否則PostgreSQL對(duì)于簡(jiǎn)單的場(chǎng)景而言有點(diǎn)多余。

如何你確定只在MySQL和PostgreSQL中進(jìn)行選擇,以下規(guī)則總是有效的:

如果你的操作系統(tǒng)是Windows,你應(yīng)該使用MySQL。

當(dāng)絕對(duì)需要可靠性和數(shù)據(jù)完整性的時(shí)候,PostgreSQL是更好的選擇。

如果需要數(shù)據(jù)庫(kù)執(zhí)行定制程序,那么可擴(kuò)展的PostgreSQL是更好的選擇。

你的應(yīng)用處理的是地理數(shù)據(jù),由于R-TREES的存在,你應(yīng)該使用PostgreSQL。

如果你對(duì)數(shù)據(jù)庫(kù)并不了十分了解,甚至不知道事務(wù)、存儲(chǔ)過(guò)程等究竟是什么,你應(yīng)該使用MySQL。

如何評(píng)價(jià) Uber 從 PostgreSQL 改為 MySQL

Uber工程師在官方博客上描述了他們?yōu)槭裁匆獜?Postgres 切換到 MySQL 數(shù)據(jù)庫(kù)。Uber的早期架構(gòu)是由 Python編寫(xiě)的后端應(yīng)用構(gòu)成,使用了 Postgres 數(shù)據(jù)庫(kù)。但此后,Uber的架構(gòu)發(fā)生了顯著的改變,轉(zhuǎn)變到了微服務(wù)模型和新的數(shù)據(jù)平臺(tái)。以前他們使用 Postgres,現(xiàn)在則改用了基于 MySQL 的數(shù)據(jù)庫(kù)分片層。Uber工程師稱他們之所以切換到Schemaless和其它基于 MySQL 的后端服務(wù),最主要的原因是Postgres 數(shù)據(jù)復(fù)制效率低下,Postgres更新已有行的效率低于 MySQL,Postgres需要重寫(xiě)每一個(gè)行索引,而MySQL只更新改變的索引。

看大數(shù)據(jù)最大技術(shù)難關(guān)之模糊檢索,PostgreSQL如何攻克

但是由于“大數(shù)據(jù)”和“Hadoop”這兩個(gè)熱門(mén)詞,即使很多人實(shí)際上不需要Hadoop,他們也愿意穿上“緊身衣”。

一、如果我的數(shù)據(jù)量是幾百兆,Excel可能沒(méi)法加載它

對(duì)于Excel軟件來(lái)說(shuō)的“很大的數(shù)據(jù)”并非大數(shù)據(jù),其實(shí)還有其它極好的工具可以使用——我喜歡的Pandas。Pandas構(gòu)建于Numpy庫(kù) 之上,可以以矢量格式的方式有效地把數(shù)百兆的數(shù)據(jù)載入到內(nèi)存中。在我購(gòu)買(mǎi)已3年的筆記本上,它可以用Numpy在一眨眼的功夫把1億的浮點(diǎn)數(shù)乘在一起。 Matlab和R也是極好的工具。

對(duì)于幾百兆的數(shù)據(jù)量,典型的做法是寫(xiě)一個(gè)簡(jiǎn)單的Python腳本按行讀取文件行,并處理它,向另一個(gè)文件寫(xiě)入。

二、如果我的數(shù)據(jù)是10GB呢

我買(mǎi)了個(gè)新筆記本,它有16GB的內(nèi)存和256GB的SSD。如果你要載入一個(gè)10GB的CSV文件到Pandas,它占用的內(nèi)存實(shí)際上是很小的 ——其結(jié)果是以數(shù)字類型的字符串保存的,如“17284832583”作為4字節(jié)貨8字節(jié)的整數(shù),或存儲(chǔ)“284572452.2435723”字符串作 為8字節(jié)的雙精度浮點(diǎn)數(shù)。

最壞的情況是你或許不能把所有的數(shù)據(jù)都同時(shí)載入到內(nèi)存中。

三、如果我的數(shù)據(jù)是100GB、500GB或1TB呢

買(mǎi)個(gè)2TB或4TB的硬盤(pán),在桌面PC或服務(wù)器上安裝一個(gè)Postgre來(lái)解決它。

四、Hadoop遠(yuǎn)遠(yuǎn)比不上SQL或Python腳本

在計(jì)算的表達(dá)方面,Hadoop弱于SQL,也弱于Python腳本。

SQL是一個(gè)很直接的查詢語(yǔ)言,適合做業(yè)務(wù)分析,SQL的查詢相當(dāng)簡(jiǎn)單,而且還非??臁绻愕臄?shù)據(jù)庫(kù)使用了正確的索引,二級(jí)查詢或多級(jí)查詢另當(dāng)別論。

Hadoop沒(méi)有索引的概念,Hadoop只有全表掃描,Hadoop有高度泄露抽象——我花了很多時(shí)間來(lái)處理Java的內(nèi)存錯(cuò)誤、文件碎片以及集群競(jìng)爭(zhēng),這些時(shí)間遠(yuǎn)大于我花在數(shù)據(jù)分析上的時(shí)間。

如果你的數(shù)據(jù)并不是像SQL表那樣的結(jié)構(gòu)化數(shù)據(jù)(比如純文本、JSON對(duì)象、二進(jìn)制對(duì)象),通常是直接寫(xiě)一個(gè)小的Python腳本來(lái)按行處理你的數(shù)據(jù)。把數(shù)據(jù)存儲(chǔ)于文件,處理每一個(gè)文件,等等。如果換成是Hadoop就很麻煩。

相比于SQL或Python腳本,Hadoop要慢的多。正確的使用索引后,SQL查詢總是非快——PostgreSQL簡(jiǎn)單的查找索引,檢索確 切的鍵值。而Hadoop是全表掃描的,它會(huì)把整個(gè)表進(jìn)行重新排序。通過(guò)把數(shù)據(jù)表分片到多臺(tái)計(jì)算機(jī)上后,重排序是很快的。另一方面,處理二進(jìn)制對(duì) 象,Hadoop需要重復(fù)往返于命名節(jié)點(diǎn),目的是查找和處理數(shù)據(jù)。這適合用Python腳本來(lái)實(shí)現(xiàn)。

五、我的數(shù)據(jù)超過(guò)了5TB

你應(yīng)該考慮使用Hadoop,而無(wú)需做過(guò)多的選擇。

使用Hadoop唯一的好處是可伸縮性非常好。如果你有一個(gè)包含了數(shù)TB數(shù)據(jù)的表,Hadoop有一個(gè)適合全表掃描的選項(xiàng)。如果你沒(méi)有這樣大數(shù)據(jù)量的表,那么你應(yīng)該像躲避瘟疫那樣避免使用Hadoop。這樣使用傳統(tǒng)的方法來(lái)解決問(wèn)題會(huì)更輕松。

六、Hadoop是一個(gè)極好的工具

我并不討厭Hadoop,當(dāng)我用其它工具不能很好處理數(shù)據(jù)時(shí)我會(huì)選擇Hadoop。另外,我推薦使用Scalding,不要使用Hive或Pig。Scalding支持使用Scala語(yǔ)言來(lái)編寫(xiě)Hadoop任務(wù)鏈,隱藏了其下的MapReduce。

本文名稱:關(guān)于postgresql分片的信息
文章網(wǎng)址:http://m.rwnh.cn/article0/dscooio.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司品牌網(wǎng)站建設(shè)、軟件開(kāi)發(fā)外貿(mào)建站、動(dòng)態(tài)網(wǎng)站、標(biāo)簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
望江县| 道孚县| 平定县| 阳城县| 瓮安县| 昌宁县| 会泽县| 砚山县| 西林县| 仙居县| 铜陵市| 玛曲县| 屏南县| 资阳市| 安多县| 克山县| 平顶山市| 团风县| 潼关县| 从化市| 二手房| 林西县| 徐州市| 五指山市| 洪雅县| 江源县| 安龙县| 阿拉善右旗| 昌都县| 南澳县| 泸水县| 页游| 石狮市| 电白县| 淳安县| 上犹县| 盐城市| 宜兰县| 长沙县| 永康市| 察雅县|