# PostgreSQL 9 從零開始學
- 作者:劉增杰、張少軍
- 出版社:清華大學出版社
- ISBN:9787302316732
# 第二章
# UNLOGGED
不寫 write-ahead log 所以速度很快,但是有以下的特性:
- 如果 DB crash or unclean shutdown 裡面的資料會被刪除。
- 資料不會複製到 standby DB。
建立方式在 CREATE TABLE 語法加上 UNLOGGED 參數。
# 參考資料
- PostgreSQL: Documentation: 14: CREATE TABLE (opens new window)
- 渡鴉之丘: Postgres 的 UNLOGGED Table 功能 (opens new window)
# 第五章
# CHAR 與 VARCHAR 之間的特型與選擇
CHAR 是固定長度,VARCHAR 是可固定 or 不固定長度,另外還有 TEXT 是不固定長度。
CHAR 會將不足的部分補空白,VARCHAR 不會。
VARCHAR 可以設定 length 限制長度,TEXT 不能。
效能上因為 CHAR 要填充空白,所以會比較慢。
PostgreSQL 官方文件說明,大部分的狀況下使用 VARCHAR 或 TEXT 就可以了。
# 參考資料
# 第九章
# 索引 Index
Hash type index 在書上是寫說效能比 B-tree 慢,而且也沒有寫入到 WAL log 裡面,建議是不要用 Hash type index。
不過在 PostgreSQL 10 之後 Hash type index 已經改良為 crash-safe 效能也增加不少,如果有需要可以考慮使用。
# 第十五章
# 最佳化資料庫
# 拆表
這裡有提到如果一個 table 內的 columns 太多可能會影響效能,可以把不常用的 cloumns 拆到另外一個表去。
# 刪除索引
一個 table 上 index 數量會影響 insert 的速度,可以透過 Index Maintenance - PostgreSQL wiki (opens new window) 官方 wiki 裡面 Index size/usage statistics 這條 SQL 找出沒用到的 index ,用 Duplicate indexes 這條 SQL 找出重複的 index 。
# Batch insert
要插入多筆資料可以使用 batch insert
INSERT INTO fruits VALUES('x1', '101', 'mongo2', '5.5');
INSERT INTO fruits VALUES('x2', '101', 'mongo3', '5.5');
INSERT INTO fruits VALUES('x3', '101', 'mongo4', '5.5');
下面這條比較有效率
INSERT INTO fruits VALUES
('x1', '101', 'mongo2', '5.5'),
('x2', '101', 'mongo3', '5.5'),
('x3', '101', 'mongo4', '5.5');
對應 knex 則是要傳一個 array 進入,這樣就會輸出 batch insert 的語法。
knex('fruits').insert(array)
# 使用 copy
如果要 insert 超多資料,像是匯入 cvs 之類的可以用 COPY
語法,使用說明可以看官方文件 (opens new window)。
Node.js 可以用 pg-copy-streams (opens new window) 這個套件來做 COPY 。
# 最佳化資料庫 server 參數
PostgreSQL 可以調整 postgresql.coonf
內的參數來最佳化性能,不過這些參數是有互相關聯的,亂調可是會翻車的,這邊建議使用 PGTune (opens new window) 這個線上小工具來產生設定參數。