< 返回新聞公共列表

如何提高PostgreSQL數(shù)據(jù)庫的性能?

發(fā)布時間:2023-08-07 15:07:55

PostgreSQL,也稱為Postgres,是一個功能豐富且功能強大的開源關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。與任何數(shù)據(jù)庫系統(tǒng)一樣,遵循最佳實踐對于實現(xiàn)最佳性能、數(shù)據(jù)完整性和可擴展性至關(guān)重要。那么如何提高PostgreSQL數(shù)據(jù)庫的性能?


如何提高PostgreSQL數(shù)據(jù)庫的性能?.png


以下是提高PostgreSQL數(shù)據(jù)庫性能的一些技巧:

1、適度使用索引

擁有正確的索引可以加快查詢速度,增量維護每個新行的索引需要額外的工作。檢查我們在表上定義的索引數(shù)量(使用psql命令\d table_name),并確定它們的潛在查詢優(yōu)勢是否超過存儲和插入開銷。 由于每個系統(tǒng)都是不同的,因此沒有任何硬性規(guī)定或索引的“神奇數(shù)字”——只要合理即可。


2、重新考慮外鍵約束

有時需要建立從一個表到其他關(guān)系表的外鍵(FK)。當(dāng)我們有FK約束時,每個INSERT通常都需要從引用的表中讀取數(shù)據(jù),這會降低性能。 考慮一下是否可以對數(shù)據(jù)進行非規(guī)范化——我們有時會看到相當(dāng)極端地使用FK約束,這是出于“優(yōu)雅”的感覺而不是工程權(quán)衡。


3、避免不必要的UNIQUE鍵

開發(fā)人員經(jīng)常接受培訓(xùn)以指定數(shù)據(jù)庫表中的主鍵,許多ORM都喜歡它們。然而,許多用例(包括常見的監(jiān)控或時間序列應(yīng)用程序)不需要它們,因為每個事件或傳感器讀數(shù)都可以通過在寫入時將其插入到超表當(dāng)前塊的尾部來簡單地記錄為單獨的事件。

如果以其他方式定義了UNIQUE約束,則該插入可能需要進行索引查找來確定該行是否已存在,這將對INSERT的速度產(chǎn)生不利影響。


4、WAL和數(shù)據(jù)使用單獨的磁盤

雖然這是一種并不總是需要的更高級的優(yōu)化,但如果我們的磁盤成為瓶頸,我們可以通過為數(shù)據(jù)庫的預(yù)寫日志(WAL)和數(shù)據(jù)使用單獨的磁盤(表空間)來進一步提高吞吐量。


5、使用高性能磁盤

有時,開發(fā)人員會將數(shù)據(jù)庫部署在磁盤速度較慢的環(huán)境中,無論是由于HDD、遠(yuǎn)程SAN還是其他類型的配置性能不佳。而且,由于在插入行時,數(shù)據(jù)會在事務(wù)完成之前持久存儲到預(yù)寫日志(WAL),因此緩慢的磁盤會影響插入性能。 


6、使用并行寫入。

在PostgreSQL的每個INSERT或COPY命令都作為單個事務(wù)執(zhí)行,因此以單線程方式運行。為了實現(xiàn)更高的攝取量,我們應(yīng)該并行執(zhí)行多個 INSERTS或COPY命令。


7、批量插入行。

為了實現(xiàn)更高的攝取率,我們應(yīng)該在每個INSERT調(diào)用中插入多行數(shù)據(jù)(或者使用一些批量插入命令,例如COPY或我們的并行復(fù)制工具)。

不要逐行插入數(shù)據(jù)--而是嘗試每次插入至少數(shù)百(或數(shù)千)行。這使得數(shù)據(jù)庫可以花更少的時間在連接管理、事務(wù)開銷、SQL解析等上,而將更多的時間花在數(shù)據(jù)處理上。


8、正確配置shared_buffers

我們通常建議使用25%的可用RAM。如果我們通過運行的方法安裝, 它應(yīng)該自動配置shared_buffers為適合我們的硬件規(guī)格的內(nèi)容。


9、在Linux主機上運行我們的Docker鏡像

如果我們在另一個Linux操作系統(tǒng)之上運行Docker容器(運行Linux),那么我們的狀態(tài)就很好。容器基本上提供進程隔離,并且開銷極小。


10、以松散的時間順序?qū)懭霐?shù)據(jù)

當(dāng)塊的大小適當(dāng)時,最新的塊及其關(guān)聯(lián)的索引自然會保留在內(nèi)存中。插入最近時間戳的新行將被寫入內(nèi)存中已有的這些塊和索引中。

如果插入具有足夠舊時間戳的行(即,這是無序或回填寫入),則需要從磁盤讀入與舊塊(及其索引)相對應(yīng)的磁盤頁面。這將顯著增加寫入延遲并降低插入吞吐量。


11、避免“太大”的塊

為了保持較高的攝取率,我們希望最新的塊及其所有關(guān)聯(lián)的索引保留在內(nèi)存中,以便寫入塊和索引更新僅更新內(nèi)存。(寫入仍然是持久的,因為在更新數(shù)據(jù)庫頁面之前將插入寫入磁盤上的WAL。)

如果我們的塊太大,那么即使是最新的塊的寫入也將開始交換到磁盤。

根據(jù)經(jīng)驗,建議最新的塊及其所有索引都適合數(shù)據(jù)庫的共享緩沖區(qū)。 您可以通過 chunk_relation_size_pretty SQL 命令檢查塊大小。

如果塊太大,可以通過 set_chunk_time_interval 命令更新未來塊的范圍。然而,這不會修改現(xiàn)有塊的范圍(例如,通過將大塊重寫為多個小塊)。


以上就是提高高PostgreSQL數(shù)據(jù)庫性能的一些技巧,希望能幫助到大家!


/template/Home/Zkeys724/PC/Static