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

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

postgresql對比的簡單介紹

如何實現(xiàn)postgresql兩張表數(shù)據(jù)的對比更新

1、通過命令行查詢 \d 數(shù)據(jù)庫 —— 得到所有表的名字 \d 表名 —— 得到表結(jié)構(gòu) 2、通過SQL語句查詢 "select * from pg_tables" —— 得到當前db中所有表的信息(這里pg_tables是系統(tǒng)視圖) "select tablename from pg_tables where schemaname='public...

創(chuàng)新互聯(lián)建站于2013年開始,先為大化等服務建站,大化等地企業(yè),進行企業(yè)商務咨詢服務。為大化企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務解決您的所有建站問題。

討論PostgreSQL 和其他數(shù)據(jù)庫的差異在哪里

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

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

三、PG 多年來在 GIS 領域處于優(yōu)勢地位,因為它有豐富的幾何類型,實際上不止幾何類型,PG有大量字典、數(shù)組、bitmap 等數(shù)據(jù)類型,相比之下mysql就差很多,instagram就是因為PG的空間數(shù)據(jù)庫擴展POSTGIS遠遠強于MYSQL的my spatial而采用PGSQL的。

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

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

PostgreSql和Sqlserver有什么不同?

我接觸postgreSQL時間不多,但是很早就接觸了,

給我的感覺是要比mysql配置復雜

我認為postgresql配置稍微復雜的原因是因為功能比較強大的事情。

只有搞定一些配置后,才可能比較好的運行。

sun最初是支持postgreSql的

但是現(xiàn)在看來,sun還是主推MYSql,原因我感覺比較重要的一點就是商業(yè)利益作祟,

其實相對各項比較的數(shù)據(jù)來說,mysql整體還是稍微落后于postgresql,個人感覺,不要當作什么拍磚的理由。

sun之所以現(xiàn)在對mysql推崇備至,是因為mysql的市場占有率。

其實好多人也知道,在mysql被sun收購后,好多國外客戶投入postgresql的懷抱。

而且sun為了市場急于發(fā)布新版的mysql,結(jié)果導致了比較嚴重的bug發(fā)生,我感覺sun如果這樣下去會毀掉mysql的。

我如果有時間會好好學習并對比postgresql和mysql的,希望為一些入門者提供參考。

MySQL與PostgreSQL比較 哪個數(shù)據(jù)庫更好

特性 MySQL PostgreSQL

實例 通過執(zhí)行 MySQL 命令(mysqld)啟動實例。一個實例可以管理一個或多個數(shù)據(jù)庫。一臺服務器可以運行多個 mysqld 實例。一個實例管理器可以監(jiān)視 mysqld 的各個實例。

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

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

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

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

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

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

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

查詢解釋 使用 EXPLAIN 命令查看查詢的解釋計劃。 使用 EXPLAIN 命令查看查詢的解釋計劃。

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

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

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

索引類型 取決于存儲引擎。MyISAM:BTREE,InnoDB:BTREE。 支持 B-樹、哈希、R-樹和 Gist 索引。

約束 支持主鍵、外鍵、惟一和非空約束。對檢查約束進行解析,但是不強制實施。 支持主鍵、外鍵、惟一、非空和檢查約束。

存儲過程和用戶定義函數(shù) 支持 CREATE PROCEDURE 和 CREATE FUNCTION 語句。存儲過程可以用 SQL 和 C++ 編寫。用戶定義函數(shù)可以用 SQL、C 和 C++ 編寫。 沒有單獨的存儲過程,都是通過函數(shù)實現(xiàn)的。用戶定義函數(shù)可以用 PL/pgSQL(專用的過程語言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 編寫。

觸發(fā)器 支持行前觸發(fā)器、行后觸發(fā)器和語句觸發(fā)器,觸發(fā)器語句用過程語言復合語句編寫。 支持行前觸發(fā)器、行后觸發(fā)器和語句觸發(fā)器,觸發(fā)器過程用 C 編寫。

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

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

客戶機連接文件 my.conf pg_hba.conf

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

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

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

mysql —— 命令行工具

MySQL Administrator —— 客戶機 GUI 工具 Vacuum —— 回收未使用的空間

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

psql —— 命令行工具

pgAdmin —— 客戶機 GUI 工具

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

MySQL相對于PostgreSQL的劣勢:

MySQL

PostgreSQL

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

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

對復雜查詢的處理較弱,查詢優(yōu)化器不夠成熟

很強大的查詢優(yōu)化器,支持很復雜的查詢處理。

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

都支持

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

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

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

不存在這個問題。

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

不存在這個問題

表增加列,基本上是重建表和索引,會花很長時間。

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

存儲過程與觸發(fā)器的功能有限??捎脕砭帉懘鎯^程、觸發(fā)器、計劃事件以及存儲函數(shù)的語言功能較弱

除支持pl/pgsql寫存儲過程,還支持perl、python、Tcl類型的存儲過程:pl/perl,pl/python,pl/tcl。

也支持用C語言寫存儲過程。

不支持Sequence。

支持

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

不支持物化視圖。

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

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

執(zhí)行計劃共享

MySQL支持的SQL語法(ANSI SQL標準)的很小一部分。不支持遞歸查詢、通用表表達式(Oracle的with 語句)或者窗口函數(shù)(分析函數(shù))。

都 支持

不支持用戶自定義類型或域(domain)

支持。

對于時間、日期、間隔等時間類型沒有秒以下級別的存儲類型

可以精確到秒以下。

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

支持OS認證、Kerberos 認證 、Ident 的認證、LDAP 認證、PAM 認證

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

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

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

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

有豐富的開源cluster軟件支持。

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

explain返回豐富的信息。

類似于ALTER TABLE或CREATE TABLE一類的操作都是非事務性的.它們會提交未提交的事務,并且不能回滾也不能做災難恢復

DDL也是有事務的。

PostgreSQL主要優(yōu)勢:

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

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

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

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

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

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

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

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

1. PostgreSQL沒有回滾段,而oracle與innodb有回滾段,oracle與Innodb都有回滾段。對于oracle與Innodb來說,回滾段是非常重要的,回滾段損壞,會導致數(shù)據(jù)丟失,甚至數(shù)據(jù)庫無法啟動的嚴重問題。另由于PostgreSQL沒有回滾段,舊數(shù)據(jù)都是記錄在原先的文件中,所以當數(shù)據(jù)庫異常crash后,恢復時,不會象oracle與Innodb數(shù)據(jù)庫那樣進行那么復雜的恢復,因為oracle與Innodb恢復時同步需要redo和undo。所以PostgreSQL數(shù)據(jù)庫在出現(xiàn)異常crash后,數(shù)據(jù)庫起不來的幾率要比oracle和mysql小一些。

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

3. 回滾可以很快完成,因為回滾并不刪除數(shù)據(jù),而oracle與Innodb,回滾時很復雜,在事務回滾時必須清理該事務所進行的修改,插入的記錄要刪除,更新的記錄要更新回來(見row_undo函數(shù)),同時回滾的過程也會再次產(chǎn)生大量的redo日志。

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

PostgreSQL的多版本的主要劣勢在于:

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

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

進程模式與線程模式的對比

PostgreSQL和oracle是進程模式,MySQL是線程模式。

進程模式對多CPU利用率比較高。

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

線程模式對資源消耗比較少。

所以MySQL能支持遠比oracle多的更多的連接。

對于PostgreSQL的來說,如果不使用連接池軟件,也存在這個問題,但PostgreSQL中有優(yōu)秀的連接池軟件軟件,如pgbouncer和pgpool,所以通過連接池也可以支持很多的連接。

MySQL與PostgreSQL相比哪個更好

MySQL

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

PostgreSQL

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

MySQL與PostgreSQL的對比

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

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

1)不僅僅是關系型數(shù)據(jù)庫

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

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

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

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

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

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

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

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

2)支持地理信息處理擴展

PostGIS 為PostgreSQL提供了存儲空間地理數(shù)據(jù)的支持,使PostgreSQL成為了一個空間數(shù)據(jù)庫,能夠進行空間數(shù)據(jù)管理、數(shù)量測量與幾何拓撲分析。在功能上,和MYSQL對比,PostGIS具有下列優(yōu)勢:

O2O業(yè)務場景中的LBS業(yè)務使用PostgreSQL + PostGIS有無法比擬的優(yōu)勢。

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

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

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

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

5)有極其強悍的 SQL 編程能力

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

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

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

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

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

7)沒有字符串長度限制

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

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

沒有具體使用過,具體可以自己搜索下。參考鏈接:

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

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

10)對索引的支持更強

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

MySQL:取決于存儲引擎。MyISAM:BTREE,InnoDB:BTREE。

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

InnoDB的表和索引都是按相同的方式存儲。也就是說表都是索引組織表。這一般要求主鍵不能太長而且插入時的主鍵最好是按順序遞增,否則對性能有很大影響。PostgreSQL不存在這個問題。

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

11)集群支持更好

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

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

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

12)事務隔離做的更好

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

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

MySQL 里需要 utf8mb4 才能顯示 emoji 的坑, PostgreSQL 沒這個坑。

14)對表連接支持較完整

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

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

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

16)時間精度更高

MySQL對于時間、日期、間隔等時間類型沒有秒以下級別的存儲類型,而PostgreSQL可以精確到秒以下。

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

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

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

18)序列支持更好

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

19)對子查詢支持更好

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

20)增加列更加簡單

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

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

1)MySQL比PostgreSQL更流行

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

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

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

3)在Windows上運行更可靠

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

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

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

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

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

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

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

6)存儲引擎插件化機制

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

7)適應24/7運行

MySQL可以適應24/7運行。在絕大多數(shù)情況下,你不需要為MySQL運行任何清除程序。PostgreSQL目前仍不完全適應24/7運行,這是因為你必須每隔一段時間運行一次VACUUM。

8)更加試用于簡單的場景

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

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

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

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

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

總結(jié)

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

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

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

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

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

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

如果你對數(shù)據(jù)庫并不了十分了解,甚至不知道事務、存儲過程等究竟是什么,你應該使用MySQL。


當前名稱:postgresql對比的簡單介紹
當前鏈接:http://weahome.cn/article/dscoedg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部