PostgreSQL,也稱為Postgres,是一個功能豐富且功能強(qiáng)大的開源關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS)。與任何數(shù)據(jù)庫系統(tǒng)一樣,遵循最佳實踐對于實現(xiàn)最佳性能、數(shù)據(jù)完整性和可擴(kuò)展性至關(guān)重要。那么如何提高PostgreSQL數(shù)據(jù)庫的性能?
以下是提高PostgreSQL數(shù)據(jù)庫性能的一些技巧:
1、適度使用索引
擁有正確的索引可以加快查詢速度,增量維護(hù)每個新行的索引需要額外的工作。檢查我們在表上定義的索引數(shù)量(使用psql命令\d table_name),并確定它們的潛在查詢優(yōu)勢是否超過存儲和插入開銷。 由于每個系統(tǒng)都是不同的,因此沒有任何硬性規(guī)定或索引的“神奇數(shù)字”——只要合理即可。
2、重新考慮外鍵約束
有時需要建立從一個表到其他關(guān)系表的外鍵(FK)。當(dāng)我們有FK約束時,每個INSERT通常都需要從引用的表中讀取數(shù)據(jù),這會降低性能。 考慮一下是否可以對數(shù)據(jù)進(jìn)行非規(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)前塊的尾部來簡單地記錄為單獨(dú)的事件。
如果以其他方式定義了UNIQUE約束,則該插入可能需要進(jìn)行索引查找來確定該行是否已存在,這將對INSERT的速度產(chǎn)生不利影響。
4、WAL和數(shù)據(jù)使用單獨(dú)的磁盤
雖然這是一種并不總是需要的更高級的優(yōu)化,但如果我們的磁盤成為瓶頸,我們可以通過為數(shù)據(jù)庫的預(yù)寫日志(WAL)和數(shù)據(jù)使用單獨(dú)的磁盤(表空間)來進(jìn)一步提高吞吐量。
5、使用高性能磁盤
有時,開發(fā)人員會將數(shù)據(jù)庫部署在磁盤速度較慢的環(huán)境中,無論是由于HDD、遠(yuǎn)程SAN還是其他類型的配置性能不佳。而且,由于在插入行時,數(shù)據(jù)會在事務(wù)完成之前持久存儲到預(yù)寫日志(WAL),因此緩慢的磁盤會影響插入性能。
6、使用并行寫入。
在PostgreSQL的每個INSERT或COPY命令都作為單個事務(wù)執(zhí)行,因此以單線程方式運(yùn)行。為了實現(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ùn)行的方法安裝, 它應(yīng)該自動配置shared_buffers為適合我們的硬件規(guī)格的內(nèi)容。
9、在Linux主機(jī)上運(yùn)行我們的Docker鏡像
如果我們在另一個Linux操作系統(tǒng)之上運(yùn)行Docker容器(運(yùn)行Linux),那么我們的狀態(tài)就很好。容器基本上提供進(jìn)程隔離,并且開銷極小。
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ù)庫性能的一些技巧,希望能幫助到大家!
Copyright ? 2013-2020. All Rights Reserved. 恒訊科技 深圳市恒訊科技有限公司 粵ICP備20052954號 IDC證:B1-20230800.移動站