Mysql
PostgreSQL 是否支持線上模式修改 (DDL)?
MySQL 的最新版本(使用 InnoDB)支持許多不獨占鎖定表的更改表查詢。
PostgreSQL 是否支持任何級別?也就是說,我可以在同時讀取/寫入行的同時從表中添加/刪除列(即使性能下降)?
TL;DR:不,除了一些基本情況。
PostgreSQL 9.5 增加了一些 ALTER TABLE 的鎖定強度降低。但是,在 9.5 或更低版本中,您無法在沒有排他鎖的情況下執行任何需要全表重寫的操作。
即使在舊版本中,也可以使用非常短的獨占鎖來完成某些操作,例如
ALTER TABLE ... DROP COLUMN
或ALTER TABLE ... ADD COLUMN ...
不使用 aDEFAULT
和。NOT NULL
查詢不執行時需要短暫的時間,但這幾乎是瞬時的,因為不需要表重寫。有一些事情可以優化,例如
ALTER TABLE ... ADD COLUMN ... DEFAULT ... NOT NULL
,通過將舊行的預設值儲存在表元數據中並在讀取舊行時查找它。這還沒有在 PostgreSQL 中實現。理論上,PostgreSQL 可以使用它的 MVCC 目錄來支持你描述的內容,方法是在後台將新版本的行寫入表中,同時繼續使用舊版本進行查詢。我不知道有人試圖這樣做,並且需要一些特殊處理,因為 PostgreSQL 的程式碼目前假定表行在任何給定時間只有一種可能的結構。