真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

包含postgresql堆表的詞條

PostGresql 分區(qū)表

插入數(shù)據(jù)的時(shí)候,會(huì)根據(jù)address_id算出它的hashcode值,然后落入到對(duì)應(yīng)的分區(qū)表上。查詢(xún)數(shù)據(jù)的時(shí)候,只要帶入這個(gè)address_id作為查詢(xún)條件,就會(huì)算出對(duì)應(yīng)的hashcode的值,然后就可以直接去指定的分區(qū)表中查詢(xún)檢索數(shù)據(jù),避免大表掃描,提升查詢(xún)效率。

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),陽(yáng)曲企業(yè)網(wǎng)站建設(shè),陽(yáng)曲品牌網(wǎng)站建設(shè),網(wǎng)站定制,陽(yáng)曲網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷(xiāo),網(wǎng)絡(luò)優(yōu)化,陽(yáng)曲網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M(mǎn)足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專(zhuān)業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶(hù)成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

舉個(gè)例子,有2000萬(wàn)的數(shù)據(jù),做了hash分區(qū),分出來(lái)20張表,在插入數(shù)據(jù)的時(shí)候把2000萬(wàn)的數(shù)據(jù)均勻分布到這20張表中,平均每張表的數(shù)據(jù)只有100萬(wàn),那么查詢(xún)某個(gè)數(shù)據(jù)的時(shí)候,就可以只查詢(xún)其中的一個(gè)分區(qū)表,因?yàn)閿?shù)據(jù)只有100萬(wàn),遠(yuǎn)遠(yuǎn)比2000萬(wàn)小,所以速度更快

如何查PostgreSQL 數(shù)據(jù)庫(kù)中所有的表

1、通過(guò)命令行查詢(xún)

\d 數(shù)據(jù)庫(kù) —— 得到所有表的名字

\d 表名 —— 得到表結(jié)構(gòu)

2、通過(guò)SQL語(yǔ)句查詢(xún)

"select * from pg_tables" —— 得到當(dāng)前db中所有表的信息(這里pg_tables是系統(tǒng)視圖)

"select tablename from pg_tables where schemaname='public'" —— 得到所有用戶(hù)自定義表的名字(這里"tablename"字段是表的名字,"schemaname"是schema的名字。用戶(hù)自定義的表,如果未經(jīng)特殊處理,默認(rèn)都是放在名為public的schema下)

為什么postgrelsql的性能沒(méi)有mysql好

一、 PostgreSQL 的穩(wěn)定性極強(qiáng), Innodb 等引擎在崩潰、斷電之類(lèi)的災(zāi)難場(chǎng)景下抗打擊能力有了長(zhǎng)足進(jìn)步,然而很多 MySQL 用戶(hù)都遇到過(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)仍可以維持雙曲線(xiàn)甚至對(duì)數(shù)曲線(xiàn),到頂峰之后不再下降,而 MySQL 明顯出現(xiàn)一個(gè)波峰后下滑(5.5版本之后,在企業(yè)級(jí)版本中有個(gè)插件可以改善很多,不過(guò)需要付費(fèi))。

三、PG 多年來(lái)在 GIS 領(lǐng)域處于優(yōu)勢(shì)地位,因?yàn)樗胸S富的幾何類(lèi)型,實(shí)際上不止幾何類(lèi)型,PG有大量字典、數(shù)組、bitmap 等數(shù)據(jù)類(lèi)型,相比之下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 圖靈完備,支持遞歸?。蟹浅XS富的統(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。

七、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 類(lèi)型的功能受限,只能作為外部大數(shù)據(jù)訪(fǎng)問(wèn)。而 PG 的 TEXT 類(lèi)型可以直接訪(fǎng)問(wèn),SQL語(yǔ)法內(nèi)置正則表達(dá)式,可以索引,還可以全文檢索,或使用xml xpath。用PG的話(huà),文檔數(shù)據(jù)庫(kù)都可以省了。

九,對(duì)于WEB應(yīng)用來(lái)說(shuō),復(fù)制的特性很重要,mysql到現(xiàn)在也是異步復(fù)制,pgsql可以做到同步,異步,半同步復(fù)制。還有mysql的同步是基于binlog復(fù)制,類(lèi)似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ù),視圖之類(lèi)的功能,現(xiàn)在兩個(gè)數(shù)據(jù)庫(kù)都可以支持了。

另外多線(xiàn)程架構(gòu)和多進(jìn)程架構(gòu)之間沒(méi)有絕對(duì)的好壞,oracle在unix上是多進(jìn)程架構(gòu),在windows上是多線(xiàn)程架構(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聲稱(chēng)自己是最流行的開(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ù)類(lèi)型外,還支持存儲(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ǔ)的值,它不支持索引,但你可以為查詢(xún)創(chuàng)建表達(dá)式索引。

jsonb存儲(chǔ)的二進(jìn)制格式,避免了重新解析數(shù)據(jù)結(jié)構(gòu)。它支持索引,這意味著你可以不使用指定的索引就能查詢(xún)?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ǔ)且不保證鍵的順序。因此,如果你有軟件需要依賴(lài)鍵的順序,jsonb可能不是你的應(yīng)用的最佳選擇。使用jsonb的優(yōu)勢(shì)還在于你可以輕易的整合關(guān)系型數(shù)據(jù)和非關(guān)系型數(shù)據(jù), PostgreSQL對(duì)于mongodb這類(lèi)的基于文檔的數(shù)據(jù)庫(kù)是個(gè)不小的威脅,畢竟如果一個(gè)表中只有一列數(shù)據(jù)的類(lèi)型是半結(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ò)展的索引類(lèi)型,可以更方便地處理一些特殊數(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ě)。用戶(hù)定義函數(shù)可以用 SQL、C 和 C++ 編寫(xiě)。

PostgreSQL:沒(méi)有單獨(dú)的存儲(chǔ)過(guò)程,都是通過(guò)函數(shù)實(shí)現(xiàn)的。用戶(hù)定義函數(shù)可以用 PL/pgSQL(專(zhuān)用的過(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)查詢(xún)。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接口,用于訪(fǎng)問(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就可以訪(fǎng)問(wèn)和操作其它系統(tǒng)管理的數(shù)據(jù),就像在本地Postgres表中一樣。例如,使用FDW for MongoDB,數(shù)據(jù)庫(kù)管理員可以查詢(xún)來(lái)自文檔數(shù)據(jù)庫(kù)的數(shù)據(jù),并使用SQL將它與來(lái)自本地Postgres表的數(shù)據(jù)相關(guān)聯(lián)。借助這種方法,用戶(hù)可以將數(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 類(lèi)型的功能受限,只能作為外部大數(shù)據(jù)訪(fǎng)問(wèn)。而PostgreSQL的 TEXT 類(lèi)型可以直接訪(fǎng)問(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)前查詢(xún)行集執(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” 的這類(lèi)問(wèn)題。MySQL支持的SQL語(yǔ)法(ANSI SQL標(biāo)準(zhǔn))的很小一部分。不支持遞歸查詢(xú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ì)于索引類(lèi)型:

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

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

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

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

11)集群支持更好

Mysql Cluster可能與你的想象有較大差異。開(kāi)源的cluster軟件較少。復(fù)制(Replication)功能是異步的并且有很大的局限性。例如,它是單線(xiàn)程的(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ù)制,類(lèi)似oracle golden gate,是基于stream的復(fù)制,做到同步很困難,這種方式更加適合異地復(fù)制,pgsql的復(fù)制基于wal,可以做到同步復(fù)制。同時(shí),pgsql還提供stream復(fù)制。

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

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

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

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

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

對(duì)表連接支持較完整,MySQL只有一種表連接類(lèi)型:嵌套循環(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í)間類(lèi)型沒(méi)有秒以下級(jí)別的存儲(chǔ)類(lèi)型,而PostgreSQL可以精確到秒以下。

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

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

PostgreSQL很強(qiáng)大的查詢(xún)優(yōu)化器,支持很復(fù)雜的查詢(xún)處理。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ì)子查詢(xún)支持更好

對(duì)子查詢(xún)的支持。雖然在很多情況下在SQL語(yǔ)句中使用子查詢(xún)效率低下,而且絕大多數(shù)情況下可以使用帶條件的多表連接來(lái)替代子查詢(xún),但是子查詢(xún)的存在在很多時(shí)候仍然不可避免。而且使用子查詢(xún)的SQL語(yǔ)句與使用帶條件的多表連接相比具有更高的程序可讀性。幾乎任何數(shù)據(jù)庫(kù)的子查詢(xún) (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),流行意味著更多的用戶(hù),意味著經(jīng)受了更多的考驗(yàn),意味著更好的商業(yè)支持、意味著更多、更完善的文檔資料。易用,很容易安裝。第三方工具,包括可視化工具,讓用戶(hù)能夠很容易入門(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)線(xiàn)程模式相比進(jìn)程模式的優(yōu)勢(shì)

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

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

線(xià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è)用戶(hù)在一個(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ù)的查詢(xún)場(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)訪(fǎng)問(wèn),那么訪(fǎng)問(wèn)數(shù)據(jù)比較快。而堆表,按主鍵訪(fǎng)問(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ù),一般它訪(fǎng)問(wèn)數(shù)據(jù)塊必須按數(shù)據(jù)塊之間的關(guān)系進(jìn)行訪(fǎng)問(wèn),而不是按物理塊的訪(fǎng)問(wèn)數(shù)據(jù)的,所以當(dāng)做全表掃描時(shí)要比堆表慢很多,這可能在OLTP中不明顯,但在數(shù)據(jù)倉(cāng)庫(kù)的應(yīng)用中可能是一個(gè)問(wèn)題。

總結(jié)

MySQL從一開(kāi)始就沒(méi)有打算做所有事情,因而它在功能方面有一定的局限性,并不能滿(mǎn)足一些先進(jìn)應(yīng)用程序的要求。MySQL對(duì)某些功能(例如引用、事務(wù)、審計(jì)等)的實(shí)現(xiàn)方式使得它與其他的關(guān)系型數(shù)據(jù)庫(kù)相比缺少了一些可靠性。對(duì)于簡(jiǎn)單繁重的讀取操作,使用PostgreSQL可能有點(diǎn)小題大做,同時(shí)性能也比MySQL這樣的同類(lèi)產(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。

有用PostgreSQL的嗎,哪個(gè)package好用一些

特性 MySQL PostgreSQL

實(shí)例 通過(guò)執(zhí)行 MySQL 命令(mysqld)啟動(dòng)實(shí)例。一個(gè)實(shí)例可以管理一個(gè)或多個(gè)數(shù)據(jù)庫(kù)。一臺(tái)服務(wù)器可以運(yùn)行多個(gè) mysqld 實(shí)例。一個(gè)實(shí)例管理器可以監(jiān)視 mysqld 的各個(gè)實(shí)例。

通過(guò)執(zhí)行 Postmaster 進(jìn)程(pg_ctl)啟動(dòng)實(shí)例。一個(gè)實(shí)例可以管理一個(gè)或多個(gè)數(shù)據(jù)庫(kù),這些數(shù)據(jù)庫(kù)組成一個(gè)集群。集群是磁盤(pán)上的一個(gè)區(qū)域,這個(gè)區(qū)域在安裝時(shí)初始化并由一個(gè)目錄組成,所有數(shù)據(jù)都存儲(chǔ)在這個(gè)目錄中。使用 initdb 創(chuàng)建第一個(gè)數(shù)據(jù)庫(kù)。一臺(tái)機(jī)器上可以啟動(dòng)多個(gè)實(shí)例。

數(shù)據(jù)庫(kù) 數(shù)據(jù)庫(kù)是命名的對(duì)象集合,是與實(shí)例中的其他數(shù)據(jù)庫(kù)分離的實(shí)體。一個(gè) MySQL 實(shí)例中的所有數(shù)據(jù)庫(kù)共享同一個(gè)系統(tǒng)編目。 數(shù)據(jù)庫(kù)是命名的對(duì)象集合,每個(gè)數(shù)據(jù)庫(kù)是與其他數(shù)據(jù)庫(kù)分離的實(shí)體。每個(gè)數(shù)據(jù)庫(kù)有自己的系統(tǒng)編目,但是所有數(shù)據(jù)庫(kù)共享 pg_databases。

數(shù)據(jù)緩沖區(qū) 通過(guò) innodb_buffer_pool_size 配置參數(shù)設(shè)置數(shù)據(jù)緩沖區(qū)。這個(gè)參數(shù)是內(nèi)存緩沖區(qū)的字節(jié)數(shù),InnoDB 使用這個(gè)緩沖區(qū)來(lái)緩存表的數(shù)據(jù)和索引。在專(zhuān)用的數(shù)據(jù)庫(kù)服務(wù)器上,這個(gè)參數(shù)最高可以設(shè)置為機(jī)器物理內(nèi)存量的 80%。 Shared_buffers 緩存。在默認(rèn)情況下分配 64 個(gè)緩沖區(qū)。默認(rèn)的塊大小是 8K??梢酝ㄟ^(guò)設(shè)置 postgresql.conf 文件中的 shared_buffers 參數(shù)來(lái)更新緩沖區(qū)緩存。

數(shù)據(jù)庫(kù)連接 客戶(hù)機(jī)使用 CONNECT 或 USE 語(yǔ)句連接數(shù)據(jù)庫(kù),這時(shí)要指定數(shù)據(jù)庫(kù)名,還可以指定用戶(hù) id 和密碼。使用角色管理數(shù)據(jù)庫(kù)中的用戶(hù)和用戶(hù)組。 客戶(hù)機(jī)使用 connect 語(yǔ)句連接數(shù)據(jù)庫(kù),這時(shí)要指定數(shù)據(jù)庫(kù)名,還可以指定用戶(hù) id 和密碼。使用角色管理數(shù)據(jù)庫(kù)中的用戶(hù)和用戶(hù)組。

身份驗(yàn)證 MySQL 在數(shù)據(jù)庫(kù)級(jí)管理身份驗(yàn)證。 基本只支持密碼認(rèn)證。 PostgreSQL 支持豐富的認(rèn)證方法:信任認(rèn)證、口令認(rèn)證、Kerberos 認(rèn)證、基于 Ident 的認(rèn)證、LDAP 認(rèn)證、PAM 認(rèn)證

加密 可以在表級(jí)指定密碼來(lái)對(duì)數(shù)據(jù)進(jìn)行加密。還可以使用 AES_ENCRYPT 和 AES_DECRYPT 函數(shù)對(duì)列數(shù)據(jù)進(jìn)行加密和解密??梢酝ㄟ^(guò) SSL 連接實(shí)現(xiàn)網(wǎng)絡(luò)加密。 可以使用 pgcrypto 庫(kù)中的函數(shù)對(duì)列進(jìn)行加密/解密??梢酝ㄟ^(guò) SSL 連接實(shí)現(xiàn)網(wǎng)絡(luò)加密。

審計(jì) 可以對(duì) querylog 執(zhí)行 grep。 可以在表上使用 PL/pgSQL 觸發(fā)器來(lái)進(jìn)行審計(jì)。

查詢(xún)解釋 使用 EXPLAIN 命令查看查詢(xún)的解釋計(jì)劃。 使用 EXPLAIN 命令查看查詢(xún)的解釋計(jì)劃。

備份、恢復(fù)和日志 InnoDB 使用寫(xiě)前(write-ahead)日志記錄。支持在線(xiàn)和離線(xiàn)完全備份以及崩潰和事務(wù)恢復(fù)。需要第三方軟件才能支持熱備份。 在數(shù)據(jù)目錄的一個(gè)子目錄中維護(hù)寫(xiě)前日志。支持在線(xiàn)和離線(xiàn)完全備份以及崩潰、時(shí)間點(diǎn)和事務(wù)恢復(fù)。 可以支持熱備份。

JDBC 驅(qū)動(dòng)程序 可以從 參考資料 下載 JDBC 驅(qū)動(dòng)程序。 可以從 參考資料 下載 JDBC 驅(qū)動(dòng)程序。

表類(lèi)型 取決于存儲(chǔ)引擎。例如,NDB 存儲(chǔ)引擎支持分區(qū)表,內(nèi)存引擎支持內(nèi)存表。 支持臨時(shí)表、常規(guī)表以及范圍和列表類(lèi)型的分區(qū)表。不支持哈希分區(qū)表。 由于PostgreSQL的表分區(qū)是通過(guò)表繼承和規(guī)則系統(tǒng)完成了,所以可以實(shí)現(xiàn)更復(fù)雜的分區(qū)方式。

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

約束 支持主鍵、外鍵、惟一和非空約束。對(duì)檢查約束進(jìn)行解析,但是不強(qiáng)制實(shí)施。 支持主鍵、外鍵、惟一、非空和檢查約束。

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

觸發(fā)器 支持行前觸發(fā)器、行后觸發(fā)器和語(yǔ)句觸發(fā)器,觸發(fā)器語(yǔ)句用過(guò)程語(yǔ)言復(fù)合語(yǔ)句編寫(xiě)。 支持行前觸發(fā)器、行后觸發(fā)器和語(yǔ)句觸發(fā)器,觸發(fā)器過(guò)程用 C 編寫(xiě)。

系統(tǒng)配置文件 my.conf Postgresql.conf

數(shù)據(jù)庫(kù)配置 my.conf Postgresql.conf

客戶(hù)機(jī)連接文件 my.conf pg_hba.conf

XML 支持 有限的 XML 支持。 有限的 XML 支持。

數(shù)據(jù)訪(fǎng)問(wèn)和管理服務(wù)器 OPTIMIZE TABLE —— 回收未使用的空間并消除數(shù)據(jù)文件的碎片

myisamchk -analyze —— 更新查詢(xún)優(yōu)化器所使用的統(tǒng)計(jì)數(shù)據(jù)(MyISAM 存儲(chǔ)引擎)

mysql —— 命令行工具

MySQL Administrator —— 客戶(hù)機(jī) GUI 工具 Vacuum —— 回收未使用的空間

Analyze —— 更新查詢(xún)優(yōu)化器所使用的統(tǒng)計(jì)數(shù)據(jù)

psql —— 命令行工具

pgAdmin —— 客戶(hù)機(jī) GUI 工具

并發(fā)控制 支持表級(jí)和行級(jí)鎖。InnoDB 存儲(chǔ)引擎支持 READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ 和 SERIALIZABLE。使用 SET TRANSACTION ISOLATION LEVEL 語(yǔ)句在事務(wù)級(jí)設(shè)置隔離級(jí)別。 支持表級(jí)和行級(jí)鎖。支持的 ANSI 隔離級(jí)別是 Read Committed(默認(rèn) —— 能看到查詢(xún)啟動(dòng)時(shí)數(shù)據(jù)庫(kù)的快照)和 Serialization(與 Repeatable Read 相似 —— 只能看到在事務(wù)啟動(dòng)之前提交的結(jié)果)。使用 SET TRANSACTION 語(yǔ)句在事務(wù)級(jí)設(shè)置隔離級(jí)別。使用 SET SESSION 在會(huì)話(huà)級(jí)進(jìn)行設(shè)置。

MySQL相對(duì)于PostgreSQL的劣勢(shì):

MySQL

PostgreSQL

最重要的引擎InnoDB很早就由Oracle公司控制。目前整個(gè)MySQL數(shù)據(jù)庫(kù)都由Oracle控制。

BSD協(xié)議,沒(méi)有被大公司壟斷。

對(duì)復(fù)雜查詢(xún)的處理較弱,查詢(xún)優(yōu)化器不夠成熟

很強(qiáng)大的查詢(xún)優(yōu)化器,支持很復(fù)雜的查詢(xún)處理。

只有一種表連接類(lèi)型:嵌套循環(huán)連接(nested-loop),不支持排序-合并連接(sort-merge join)與散列連接(hash join)。

都支持

性能優(yōu)化工具與度量信息不足

提供了一些性能視圖,可以方便的看到發(fā)生在一個(gè)表和索引上的select、delete、update、insert統(tǒng)計(jì)信息,也可以看到cache命中率。網(wǎng)上有一個(gè)開(kāi)源的pgstatspack工具。

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

不存在這個(gè)問(wèn)題。

大部分查詢(xún)只能使用表上的單一索引;在某些情況下,會(huì)存在使用多個(gè)索引的查詢(xún),但是查詢(xún)優(yōu)化器通常會(huì)低估其成本,它們常常比表掃描還要慢。

不存在這個(gè)問(wèn)題

表增加列,基本上是重建表和索引,會(huì)花很長(zhǎng)時(shí)間。

表增加列,只是在數(shù)據(jù)字典中增加表定義,不會(huì)重建表

存儲(chǔ)過(guò)程與觸發(fā)器的功能有限??捎脕?lái)編寫(xiě)存儲(chǔ)過(guò)程、觸發(fā)器、計(jì)劃事件以及存儲(chǔ)函數(shù)的語(yǔ)言功能較弱

除支持pl/pgsql寫(xiě)存儲(chǔ)過(guò)程,還支持perl、python、Tcl類(lèi)型的存儲(chǔ)過(guò)程:pl/perl,pl/python,pl/tcl。

也支持用C語(yǔ)言寫(xiě)存儲(chǔ)過(guò)程。

不支持Sequence。

支持

不支持函數(shù)索引,只能在創(chuàng)建基于具體列的索引。

不支持物化視圖。

支持函數(shù)索引,同時(shí)還支持部分?jǐn)?shù)據(jù)索引,通過(guò)規(guī)則系統(tǒng)可以實(shí)現(xiàn)物化視圖的功能。

執(zhí)行計(jì)劃并不是全局共享的, 僅僅在連接內(nèi)部是共享的。

執(zhí)行計(jì)劃共享

MySQL支持的SQL語(yǔ)法(ANSI SQL標(biāo)準(zhǔn))的很小一部分。不支持遞歸查詢(xún)、通用表表達(dá)式(Oracle的with 語(yǔ)句)或者窗口函數(shù)(分析函數(shù))。

都 支持

不支持用戶(hù)自定義類(lèi)型或域(domain)

支持。

對(duì)于時(shí)間、日期、間隔等時(shí)間類(lèi)型沒(méi)有秒以下級(jí)別的存儲(chǔ)類(lèi)型

可以精確到秒以下。

身份驗(yàn)證功能是完全內(nèi)置的,不支持操作系統(tǒng)認(rèn)證、PAM認(rèn)證,不支持LDAP以及其它類(lèi)似的外部身份驗(yàn)證功能。

支持OS認(rèn)證、Kerberos 認(rèn)證 、Ident 的認(rèn)證、LDAP 認(rèn)證、PAM 認(rèn)證

不支持database link。有一種叫做Federated的存儲(chǔ)引擎可以作為一個(gè)中轉(zhuǎn)將查詢(xún)語(yǔ)句傳遞到遠(yuǎn)程服務(wù)器的一個(gè)表上,不過(guò),它功能很粗糙并且漏洞很多

有dblink,同時(shí)還有一個(gè)dbi-link的東西,可以連接到oracle和mysql上。

Mysql Cluster可能與你的想象有較大差異。開(kāi)源的cluster軟件較少。

復(fù)制(Replication)功能是異步的,并且有很大的局限性.例如,它是單線(xiàn)程的(single-threaded),因此一個(gè)處理能力更強(qiáng)的Slave的恢復(fù)速度也很難跟上處理能力相對(duì)較慢的Master.

有豐富的開(kāi)源cluster軟件支持。

explain看執(zhí)行計(jì)劃的結(jié)果簡(jiǎn)單。

explain返回豐富的信息。

類(lèi)似于A(yíng)LTER TABLE或CREATE TABLE一類(lèi)的操作都是非事務(wù)性的.它們會(huì)提交未提交的事務(wù),并且不能回滾也不能做災(zāi)難恢復(fù)

DDL也是有事務(wù)的。

PostgreSQL主要優(yōu)勢(shì):

1. PostgreSQL完全免費(fèi),而且是BSD協(xié)議,如果你把PostgreSQL改一改,然后再拿去賣(mài)錢(qián),也沒(méi)有人管你,這一點(diǎn)很重要,這表明了PostgreSQL數(shù)據(jù)庫(kù)不會(huì)被其它公司控制。oracle數(shù)據(jù)庫(kù)不用說(shuō)了,是商業(yè)數(shù)據(jù)庫(kù),不開(kāi)放。而MySQL數(shù)據(jù)庫(kù)雖然是開(kāi)源的,但現(xiàn)在隨著SUN被oracle公司收購(gòu),現(xiàn)在基本上被oracle公司控制,其實(shí)在SUN被收購(gòu)之前,MySQL中最重要的InnoDB引擎也是被oracle公司控制的,而在MySQL中很多重要的數(shù)據(jù)都是放在InnoDB引擎中的,反正我們公司都是這樣的。所以如果MySQL的市場(chǎng)范圍與oracle數(shù)據(jù)庫(kù)的市場(chǎng)范圍沖突時(shí),oracle公司必定會(huì)犧牲MySQL,這是毫無(wú)疑問(wèn)的。

2. 與PostgreSQl配合的開(kāi)源軟件很多,有很多分布式集群軟件,如pgpool、pgcluster、slony、plploxy等等,很容易做讀寫(xiě)分離、負(fù)載均衡、數(shù)據(jù)水平拆分等方案,而這在MySQL下則比較困難。

3. PostgreSQL源代碼寫(xiě)的很清晰,易讀性比MySQL強(qiáng)太多了,懷疑MySQL的源代碼被混淆過(guò)。所以很多公司都是基本PostgreSQL做二次開(kāi)發(fā)的。

4. PostgreSQL在很多方面都比MySQL強(qiáng),如復(fù)雜SQL的執(zhí)行、存儲(chǔ)過(guò)程、觸發(fā)器、索引。同時(shí)PostgreSQL是多進(jìn)程的,而MySQL是線(xiàn)程的,雖然并發(fā)不高時(shí),MySQL處理速度快,但當(dāng)并發(fā)高的時(shí)候,對(duì)于現(xiàn)在多核的單臺(tái)機(jī)器上,MySQL的總體處理性能不如PostgreSQL,原因是MySQL的線(xiàn)程無(wú)法充分利用CPU的能力。

目前只想到這些,以后想到再添加,歡迎大家拍磚。

PostgreSQL與oracle或InnoDB的多版本實(shí)現(xiàn)的差別

PostgreSQL與oracle或InnoDB的多版本實(shí)現(xiàn)最大的區(qū)別在于最新版本和歷史版本是否分離存儲(chǔ),PostgreSQL不分,而oracle和InnoDB分,而innodb也只是分離了數(shù)據(jù),索引本身沒(méi)有分開(kāi)。

PostgreSQL的主要優(yōu)勢(shì)在于:

1. PostgreSQL沒(méi)有回滾段,而oracle與innodb有回滾段,oracle與Innodb都有回滾段。對(duì)于oracle與Innodb來(lái)說(shuō),回滾段是非常重要的,回滾段損壞,會(huì)導(dǎo)致數(shù)據(jù)丟失,甚至數(shù)據(jù)庫(kù)無(wú)法啟動(dòng)的嚴(yán)重問(wèn)題。另由于PostgreSQL沒(méi)有回滾段,舊數(shù)據(jù)都是記錄在原先的文件中,所以當(dāng)數(shù)據(jù)庫(kù)異常crash后,恢復(fù)時(shí),不會(huì)象oracle與Innodb數(shù)據(jù)庫(kù)那樣進(jìn)行那么復(fù)雜的恢復(fù),因?yàn)閛racle與Innodb恢復(fù)時(shí)同步需要redo和undo。所以PostgreSQL數(shù)據(jù)庫(kù)在出現(xiàn)異常crash后,數(shù)據(jù)庫(kù)起不來(lái)的幾率要比oracle和mysql小一些。

2. 由于舊的數(shù)據(jù)是直接記錄在數(shù)據(jù)文件中,而不是回滾段中,所以不會(huì)象oracle那樣經(jīng)常報(bào)ora-01555錯(cuò)誤。

3. 回滾可以很快完成,因?yàn)榛貪L并不刪除數(shù)據(jù),而oracle與Innodb,回滾時(shí)很復(fù)雜,在事務(wù)回滾時(shí)必須清理該事務(wù)所進(jìn)行的修改,插入的記錄要?jiǎng)h除,更新的記錄要更新回來(lái)(見(jiàn)row_undo函數(shù)),同時(shí)回滾的過(guò)程也會(huì)再次產(chǎn)生大量的redo日志。

4. WAL日志要比oracle和Innodb簡(jiǎn)單,對(duì)于oracle不僅需要記錄數(shù)據(jù)文件的變化,還要記錄回滾段的變化。

PostgreSQL的多版本的主要劣勢(shì)在于:

1、最新版本和歷史版本不分離存儲(chǔ),導(dǎo)致清理老舊版本需要作更多的掃描,代價(jià)比較大,但一般的數(shù)據(jù)庫(kù)都有高峰期,如果我們合理安排VACUUM,這也不是很大的問(wèn)題,而且在PostgreSQL9.0中VACUUM進(jìn)一步被加強(qiáng)了。

2、由于索引中完全沒(méi)有版本信息,不能實(shí)現(xiàn)Coverage index scan,即查詢(xún)只掃描索引,直接從索引中返回所需的屬性,還需要訪(fǎng)問(wèn)表。而oracle與Innodb則可以;

進(jìn)程模式與線(xiàn)程模式的對(duì)比

PostgreSQL和oracle是進(jìn)程模式,MySQL是線(xiàn)程模式。

進(jìn)程模式對(duì)多CPU利用率比較高。

進(jìn)程模式共享數(shù)據(jù)需要用到共享內(nèi)存,而線(xiàn)程模式數(shù)據(jù)本身就是在進(jìn)程空間內(nèi)都是共享的,不同線(xiàn)程訪(fǎng)問(wèn)只需要控制好線(xiàn)程之間的同步。

線(xiàn)程模式對(duì)資源消耗比較少。

所以MySQL能支持遠(yuǎn)比oracle多的更多的連接。

對(duì)于PostgreSQL的來(lái)說(shuō),如果不使用連接池軟件,也存在這個(gè)問(wèn)題,但PostgreSQL中有優(yōu)秀的連接池軟件軟件,如pgbouncer和pgpool,所以通過(guò)連接池也可以支持很多的連接。

堆表與索引組織表的的對(duì)比

Oracle支持堆表,也支持索引組織表

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

Innodb只支持索引組織表

索引組織表的優(yōu)勢(shì):

表內(nèi)的數(shù)據(jù)就是按索引的方式組織,數(shù)據(jù)是有序的,如果數(shù)據(jù)都是按主鍵來(lái)訪(fǎng)問(wèn),那么訪(fǎng)問(wèn)數(shù)據(jù)比較快。而堆表,按主鍵訪(fǎng)問(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ù),一般它訪(fǎng)問(wèn)數(shù)據(jù)塊必須按數(shù)據(jù)塊之間的關(guān)系進(jìn)行訪(fǎng)問(wèn),而不是按物理塊的訪(fǎng)問(wèn)數(shù)據(jù)的,所以當(dāng)做全表掃描時(shí)要比堆表慢很多,這可能在OLTP中不明顯,但在數(shù)據(jù)倉(cāng)庫(kù)的應(yīng)用中可能是一個(gè)問(wèn)題。

  PostgreSQL9.0中的特色功能:

PostgreSQL中的Hot Standby功能

也就是standby在應(yīng)用日志同步時(shí),還可以提供只讀服務(wù),這對(duì)做讀寫(xiě)分離很有用。這個(gè)功能是oracle11g才有的功能。

PostgreSQL異步提交(Asynchronous Commit)的功能:

  這個(gè)功能oracle中也是到oracle11g R2才有的功能。因?yàn)樵诤芏鄳?yīng)用場(chǎng)景中,當(dāng)宕機(jī)時(shí)是允許丟失少量數(shù)據(jù)的,這個(gè)功能在這樣的場(chǎng)景中就特別合適。在PostgreSQL9.0中把synchronous_commit設(shè)置為false就打開(kāi)了這個(gè)功能。需要注意的是,雖然設(shè)置為了異步提交,當(dāng)主機(jī)宕機(jī)時(shí),PostgreSQL只會(huì)丟失少量數(shù)據(jù),異步提交并不會(huì)導(dǎo)致數(shù)據(jù)損壞而數(shù)據(jù)庫(kù)起不來(lái)的情況。MySQL中沒(méi)有聽(tīng)說(shuō)過(guò)有這個(gè)功能。

PostgreSQL中索引的特色功能:

PostgreSQL中可以有部分索引,也就是只能表中的部分?jǐn)?shù)據(jù)做索引,create index 可以帶where 條件。同時(shí)PostgreSQL中的索引可以反向掃描,所以在PostgreSQL中可以不必建專(zhuān)門(mén)的降序索引了。


分享文章:包含postgresql堆表的詞條
本文路徑:http://weahome.cn/article/dscoeeg.html

其他資訊

在線(xiàn)咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部