PostgreSQL是和MySQL類似的關系型數據庫。最近PostgreSQL的關注度正在提升,各種會議、培訓,都在介紹PostgreSQL。本章按照關系型數據的一般性結構進行講解,即安裝→建庫→建表→查詢→索引→視圖→觸發器→權限管理→備份→事務→優化。具體章安排如下:第1章 初識PostgreSQL;第2章 安裝及啟動PostgreSQL;第3章 創建數據庫并輸入數據;第4章 數據類型及其運算符;第5章 函數;第6章 查詢和修改數據;第7章 索引;第8章 視圖;第9章 觸發器第10章 表繼承和表分區;第11章 管理用戶權限和模式;第12章 配置和管理數據庫服務器;第13章 備份和恢復數據;第14章 事務;第15章 優化SQL語句;第16章 優化數據庫服務端性能;第17章 PL/PgSQL服務端編程;第18章 高可用方案;第19章 設計一個商品管理數據庫;
屠要峰研究員、中興通訊數據庫技術專家委員會主任、研究院副院長、CCF信息存儲委員會常委、中國開源軟件聯盟理事。擁有二十多年大型軟件系統研發實踐經驗,主持過大數據、云計算、云存儲及分布式數據庫等多個大型分布式系統的研發。負責中興通訊數據智能方向的研發及應用,獲省級科技進步一等獎兩次。主要研究方向為大數據、云計算、數據庫及存儲。陳河堆現任中興通訊數據庫平臺首席專家,PostgreSQL中文社區核心組成員,擁有十幾年數據庫研發工作經驗,曾參與公司自研高性能內存數據庫、分布式數據庫和分布式緩存等系統的設計和開發,近年來醉心于鉆研開源數據庫技術,熱心推動PostgreSQL在中國地區的推廣和應用,積極參與PostgreSQL中文社區系列活動。
------------------第1篇 準備
--第1章 初識PostgreSQL /2
1.1 PostgreSQL的起源 /2
1.2 PostgreSQL簡介 /3
∣1.2.1 基本概念 /3
∣1.2.2 存儲體系結構 /4
∣1.2.3 進程體系架構 /6
1.3 PostgreSQL 10版本的新特性 /6
1.4 小結 /7
-
-第2章 安裝和啟動PostgreSQL /8
2.1 安裝PostgreSQL /8
∣2.1.1 在Windows中安裝PostgreSQL /8
∣2.1.2 在Linux中安裝PostgreSQL /12
∣2.1.3 源碼安裝PostgreSQL /14
2.2 初始化數據庫 /17
2.3 數據庫的基本配置 /18
∣2.3.1 配置數據庫監聽IP和端口 /18
∣2.3.2 配置數據庫錯誤日志 /18
2.4 啟動、停止、查看數據庫 /18
∣2.4.1 啟動數據庫 /18
∣2.4.2 停止數據庫 /19
∣2.4.3 查看數據庫狀態 /19
2.5 小結 /19
-
------------------第2篇 入門
-
第3章 創建數據庫和表 /21
3.1 認識SQL語言 /21
∣3.1.1 SQL語句類型 /21
∣3.1.2 SQL數據類型 /21
3.2 使用交互式終端psql /22
∣3.2.1 連接數據庫 /22
∣3.2.2 常用命令 /23
∣3.2.3 使用技巧 /26
3.3 表空間的創建、修改和刪除 /27
∣3.3.1 實例1:創建表空間 /27
∣3.3.2 實例2:修改表空間 /29
∣3.3.3 實例3:刪除表空間 /29
3.4 數據庫的創建、修改和刪除 /30
∣3.4.1 實例4:創建數據庫 /30
∣3.4.2 實例5:修改數據庫 /31
∣3.4.3 實例6:刪除數據庫 /32
3.5 創建數據表 /32
∣3.5.1 創建表的語法格式 /32
∣3.5.2 使用CHECK約束 /35
∣3.5.3 使用非空約束 /36
∣3.5.4 使用唯一性約束 /36
∣3.5.5 使用主鍵約束 /37
∣3.5.6 使用默認約束 /38
∣3.5.7 使用外鍵約束 /38
∣3.5.8 實例7:設置表的屬性值自動增加 /40
∣3.5.9 實例8:查看表結構 /41
3.6 修改數據表 /42
∣3.6.1 實例9:修改表名 /42
∣3.6.2 實例10:修改字段名 /43
∣3.6.3 實例11:添加字段 /43
∣3.6.4 實例12:刪除字段 /44
∣3.6.5 實例13:刪除表的外鍵約束 /44
3.7 刪除數據表 /46
∣3.7.1 實例14:刪除沒有被關聯的表 /46
∣3.7.2 實例15:刪除被其他表關聯的主表 /46
3.8 數據的插入、修改和刪除 /47
∣3.8.1 實例16:向表中插入數據 /47
∣3.8.2 實例17:修改表中的數據 /48
∣3.8.3 實例18:刪除表中的數據 /49
3.9 數據的簡單查詢 /50
∣3.9.1 實例19:創建最簡單的單表查詢 /50
∣3.9.2 實例20:創建帶過濾條件的查詢 /50
3.10 小結 /51
-
第4章 數據類型及其運算符 /52
4.1 數值類型 /52
∣4.1.1 整數類型 /52
∣4.1.2 任意精度數字類型 /53
∣4.1.3 浮點類型 /53
∣4.1.4 序列類型 /54
∣4.1.5 貨幣類型 /55
∣4.1.6 實例21:使用數學運算符 /55
4.2 字符串類型 /56
∣4.2.1 字符串類型分類 /57
∣4.2.2 使用連接運算符 /57
∣4.2.3 使用模式匹配運算符 /58
4.3 二進制數據類型 /60
∣4.3.1 二進制數據類型簡介 /60
∣4.3.2 二進制數據的十六進制格式 /61
4.3.3 二進制數據的轉義格式 /61
4.4 日期類型和時間類型 /61
∣4.4.1 日期類型和時間類型分類 /61
∣4.4.2 日期類型和時間類型輸入格式 /62
∣4.4.3 日期類型和時間類型輸出格式 /64
∣4.4.4 時區 /64
∣4.4.5 使用日期類型和時間類型運算符 /65
4.5 布爾類型 /66
∣4.5.1 布爾類型簡介 /66
∣4.5.2 布爾類型運算符 /66
4.6 位串類型 /68
∣4.6.1 位串類型簡介 /68
∣4.6.2 實例22:使用位串類型運算符 /68
4.7 枚舉類型 /69
∣4.7.1 聲明枚舉類型 /69
∣4.7.2 排序 /69
∣4.7.3 注意枚舉類型安全性 /70
4.8 幾何類型 /71
∣4.8.1 點(point) /71
∣4.8.2 線(line) /72
∣4.8.3 線段(lseg) /72
∣4.8.4 矩形(box) /73
∣4.8.5 路徑(path) /74
∣4.8.6 多邊形(polygon) /75
∣4.8.7 圓(circle) /75
∣4.8.8 實例23:使用幾何類型運算符 /76
4.9 JSON數據類型 /77
∣4.9.1 JSON數據類型簡介 /77
∣4.9.2 JSON數據類型的輸入/輸出語法 /78
∣4.9.3 實例24:使用json運算符 /79
∣4.9.4 實例25:使用jsonb運算符 /79
4.10 范圍類型 /80
∣4.10.1 內建范圍類型 /80
∣4.10.2 范圍類型的邊界 /81
∣4.10.3 范圍值的輸入 /81
∣4.10.4 使用范圍類型運算符 /82
∣4.10.5 實例26:定義自己的范圍類型 /83
4.11 數組類型 /83
∣4.11.1 定義數組類型 /84
∣4.11.2 輸入數組 /84
∣4.11.3 訪問數組 /86
∣4.11.4 修改數組 /87
∣4.11.5 查找數組中的內容 /88
∣4.11.6 數組運算符 /89
4.12 小結 /89
-
第5章 函數 /90
5.1 數學函數 /90
∣5.1.1 認識數學函數 /90
∣5.1.2 實例27:使用數學函數對小數取整 /93
5.2 字符串函數 /94
∣5.2.1 認識字符串函數 /95
∣5.2.2 認識二進制字符串函數 /99
∣5.2.3 實例28:使用format()函數格式化輸出 /101
5.3 數據類型格式化函數 /103
5.4 序列函數 /104
∣5.4.1 認識序列函數 /104
∣5.4.2 實例29:創建及使用序列函數 /104
5.5 日期函數和時間函數 /107
∣5.5.1 認識日期函數和時間函數 /107
∣5.5.2 實例30:使用AT TIME ZONE進行時區轉換 /110
∣5.5.3 實例31:獲取當前的日期和時間 /111
∣5.5.4 實例32:設置延時執行 /112
5.6 位串函數 /113
∣5.6.1 認識位串函數 /113
∣5.6.2 實例33:使用bit()函數轉換整數和位串 /113
5.7 枚舉函數 /114
∣5.7.1 認識枚舉函數 /114
∣5.7.2 實例34:使用枚舉函數獲取枚舉類型中的值 /114
5.8 幾何函數 /115
∣5.8.1 認識幾何函數 /115
∣5.8.2 實例35:使用area()函數計算幾何類型的面積 /117
5.9 JSON函數 /117
∣5.9.1 JSON創建函數 /117
∣5.9.2 JSON處理函數 /118
∣5.9.3 實例36:使用to_json()函數將字符串轉換成JSON格式 /122
∣5.9.4 實例37:使用json_array_length()函數統計JSON數據類型中的元素個數 /122
5.10 范圍函數 /123
∣5.10.1 認識范圍函數 /123
∣5.10.2 實例38:用range_merge()函數獲取一個包含給定范圍的最小范圍 /123
∣5.10.3 實例39:用upper_inc()函數判斷上界是否被包含在范圍內 /123
5.11 數組函數 /124
∣5.11.1 認識數組函數 /124
∣5.11.2 實例40:用array_position()函數在數組中檢索數據 /125
∣5.11.3 實例41:用array_to_string()函數將數組轉為字符串 /126
5.12 其他函數 /126
∣5.12.1 聚合函數 /126
∣5.12.2 集合返回函數 /131
∣5.12.3 系統信息函數 /131
∣5.12.4 系統管理函數 /133
5.13 小結 /134
-
第6章 查詢和修改數據 /135
6.1 SELECT語法 /135
6.2 單表查詢 /136
∣6.2.1 實例42:簡單查詢 /136
∣6.2.2 實例43:等值查詢 /137
∣6.2.3 實例44:范圍查詢 /137
∣6.2.4 實例45:去重 /138
∣6.2.5 實例46:排序 /140
∣6.2.6 實例47:分組 /140
∣6.2.7 實例48:分頁 /141
6.3 多表查詢 /142
∣6.3.1 實例49:內連接 /143
∣6.3.2 實例50:外連接 /144
∣6.3.3 實例51:交叉連接 /146
∣6.3.4 實例52:多表關聯復合查詢 /146
6.4 子查詢 /147
∣6.4.1 實例53:IN/NOT IN 子查詢 /147
∣6.4.2 實例54:EXISTS/NOT EXISTS子查詢 /148
∣6.4.3 實例55:ANY/SOME/ALL子查詢 /149
6.5 模糊匹配查詢 /150
∣6.5.1 實例56:LIKE查詢 /150
∣6.5.2 實例57:SIMILAR TO查詢 /152
6.6 查詢運算 /152
∣6.6.1 實例58:聚集運算 /152
∣6.6.2 實例59:分組運算 /154
∣6.6.3 實例60:表達式運算 /156
∣6.6.4 實例61:遞歸查詢 /157
6.7 窗口函數 /158
6.8 高級操作 /162
∣6.8.1 實例62:歸并數據 /162
∣6.8.2 實例63:批量插入 /164
∣6.8.3 實例64:批量更新 /165
∣6.8.4 實例65:關聯更新 /166
∣6.8.5 實例66:批量刪除 /166
∣6.8.6 實例67:關聯刪除 /166
∣6.8.7 實例68:移動數據到歷史表 /167
∣6.8.8 實例69:清空表 /167
6.9 小結 /168
-
-----------------第3篇 進階
-
第7章 索引 /170
7.1 索引簡介 /170
∣7.1.1 索引的含義和作用 /170
∣7.1.2 索引的分類 /171
∣7.1.3 索引的設計原則 /172
7.2 索引操作 /172
∣7.2.1 創建索引 /172
∣7.2.2 修改索引 /174
∣7.2.3 刪除索引 /175
7.3 常用索引方法 /176
∣7.3.1 多列索引 /176
∣7.3.2 組合索引 /177
∣7.3.3 唯一索引 /177
∣7.3.4 表達式索引 /178
∣7.3.5 部分索引 /178
∣7.3.6 索引與排序 /180
7.4 索引類型 /180
∣7.4.1 B-tree索引 /180
∣7.4.2 Hash索引 /181
∣7.4.3 GiST索引 /182
∣7.4.4 SP-GiST索引 /184
∣7.4.5 GIN索引 /185
∣7.4.6 BRIN索引 /186
7.5 索引使用案例 /187
∣7.5.1 實例70:使用GiST索引提升RANGE類型數據的查詢性能 /187
∣7.5.2 實例71:使用SP-GiST索引快速查找幾何空間數據 /189
∣7.5.3 實例72:使用GIN索引快速查找JSON數據 /190
∣7.5.4 實例73:使用BRIN索引快速檢索時間類型數據 /192
7.6 小結 /194
-
第8章 視圖 /195
8.1 為什么使用視圖 /195
8.2 普通視圖 /195
∣8.2.1 創建視圖 /196
∣8.2.2 使用視圖 /198
8.3 物化視圖 /201
∣8.3.1 物化視圖和普通視圖的區別 /201
∣8.3.2 創建和刷新物化視圖 /201
∣8.3.3 實例74:使用物化視圖優化查詢性能 /203
8.4 小結 /205
-
第9章 觸發器 /206
9.1 常規觸發器 /206
∣9.1.1 了解常規觸發器 /206
∣9.1.2 實例75:創建觸發器 /208
∣9.1.3 實例76:修改觸發器 /211
∣9.1.4 實例77:刪除觸發器 /212
∣9.1.5 實例78:注意數據變更的可見性 /213
9.2 事件觸發器 /214
∣9.2.1 事件觸發器支持的事件 /214
∣9.2.2 實例79:創建一個具有數據庫審計功能的事件觸發器 /215
9.3 小結 /217
-第10章 表繼承和表分區 /218
10.1 表繼承 /218
∣10.1.1 表繼承的使用場景 /218
∣10.1.2 實例80:創建表繼承 /219
∣10.1.3 實例81:使用表繼承 /221
∣10.1.4 確定表繼承數據來源 /228
∣10.1.5 表繼承的局限性和注意事項 /230
10.2 表分區 /231
∣10.2.1 表分區的使用場景 /231
∣10.2.2 表分區的實現方式 /232
∣10.2.3 實例82:創建表分區 /233
∣10.2.4 實例83:使用表分區 /235
∣10.2.5 實例84:維護表分區 /237
∣10.2.6 使用約束排除提升查詢性能 /240
∣10.2.7 表分區注意事項 /243
10.3 小結 /243
-
第11章 管理用戶權限和模式 /244
11.1 了解用戶、角色和權限 /244
11.2 管理用戶、角色和權限 /245
∣11.2.1 實例85:創建用戶 /245
∣11.2.2 實例86:刪除用戶 /246
∣11.2.3 實例87:創建角色 /247
∣11.2.4 實例88:刪除角色 /249
∣11.2.5 實例89:給角色授予權限 /250
∣11.2.6 實例90:使用系統默認角色 /251
11.3 管理數據庫模式 /252
∣11.3.1 實例91:使用數據庫模式 /252
∣11.3.2 實例92:設置模式的搜索路徑 /253
∣11.3.3 管理數據庫模式權限 /254
∣11.3.4 pg_catalog模式 /254
11.4 小結 /255
-
第12章 配置和管理數據庫服務器 /256
12.1 使用不同方式進行參數設置 /256
∣12.1.1 了解參數格式 /256
∣12.1.2 實例93:通過配置文件設置參數 /257
∣12.1.3 實例94:通過SQL命令設置參數 /259
∣12.1.4 實例95:通過shell命令設置參數 /261
∣12.1.5 實例96:使用include方式管理配置文件 /262
12.2 配置postgresql.conf文件的參數 /262
∣12.2.1 連接和安全認證參數 /263
∣12.2.2 緩存和存儲參數 /264
∣12.2.3 WAL日志參數 /266
∣12.2.4 錯誤日志參數 /267
∣12.2.5 AUTOVACUUM參數 /274
12.3 配置pg_hba.conf文件的參數 /274
∣12.3.1 了解不同客戶端認證方法 /275
∣12.3.2 實例97:使用trust配置客戶端認證 /276
∣12.3.3 實例98:使用md5配置客戶端認證 /277
∣12.3.4 實例99:使用cert配置客戶端認證 /277
12.4 服務端常用工具 /277
∣12.4.1 實例100:使用initdb初始化數據庫 /277
∣12.4.2 實例101:使用pg_ctl管理數據庫服務 /278
∣12.4.3 實例102:使用pg_controldata查看控制信息 /280
∣12.4.4 實例103:使用pg_rewind同步數據目錄 /282
12.5 小結 /283
-
第13章 備份和恢復數據 /284
13.1 邏輯備份和恢復 /284
∣13.1.1 實例104:使用pg_dump工具備份單庫單表數據 /284
∣13.1.2 實例105:使用pg_restore工具恢復數據 /287
∣13.1.3 實例106:使用pg_dumpall工具備份所有庫表數據 /289
∣13.1.4 實例107:使用psql工具恢復pg_dumpall備份的數據 /289
13.2 物理備份和恢復 /289
∣13.2.1 實例108:使用pg_basebackup工具熱備份 /290
∣13.2.2 實例109:使用基礎備份恢復數據 /292
13.3 增量備份和恢復 /293
∣13.3.1 實例110:使用歸檔日志進行增量備份 /293
∣13.3.2 實例111:將數據庫狀態恢復到指定時間點 /294
∣13.3.3 實例112:恢復到指定事務 /297
13.4 -第三方備份恢復工具 /299
∣13.4.1 認識pg_rman工具 /299
∣13.4.2 實例113:使用pg_rman工具備份數據 /301
13.5 小結 /304
-
-----------------第4篇 高階
-
第14章 事務 /306
14.1 事務的基本特性 /306
∣14.1.1 事務模型要解決的問題 /306
∣14.1.2 事務的四大特性 /307
∣14.1.3 實例114:設置合適的事務隔離級別 /308
14.2 理解事務的實現原理 /310
∣14.2.1 WAL機制 /310
∣14.2.2 MVCC機制 /311
∣14.2.3 Checkpoint機制 /314
∣14.2.4 Crash Recovery機制 /315
∣14.2.5 事務并發與鎖機制 /316
14.3 使用事務 /319
∣14.3.1 理解事務語法 /319
∣14.3.2 實例115:使用ROLLBACK回滾事務 /320
∣14.3.3 實例116:使用COMMIT提交事務 /321
∣14.3.4 實例117:使用SAVEPOINT回滾部分事務 /321
14.4 小結 /323
-
第15章 優化SQL語句 /324
15.1 理解查詢優化器的工作原理 /324
∣15.1.1 SQL語句執行過程 /324
∣15.1.2 了解查詢樹 /325
∣15.1.3 了解邏輯優化 /326
∣15.1.4 邏輯優化:對子查詢進行優化 /326
∣15.1.5 邏輯優化:條件表達式優化及等價謂詞重寫優化 /327
∣15.1.6 邏輯優化:外連接優化 /328
∣15.1.7 了解物理優化 /329
∣15.1.8 代價估算 /332
15.2 查看并分析執行計劃 /334
∣15.2.1 EXPLAIN命令介紹 /334
∣15.2.2 EXPLAIN輸出解讀 /336
∣15.2.3 實例118:使用EXPLAIN分析執行計劃 /338
15.3 常見SQL語句優化 /343
∣15.3.1 實例119:使用索引避免表掃描 /343
∣15.3.2 實例120:子查詢優化 /345
∣15.3.3 實例121:表連接優化 /347
∣15.3.4 實例122:使用UNION ALL代替UNION /349
∣15.3.5 實例123:避免使用“SELECT *” /350
∣15.3.6 實例124:為jsonb字段建立合適的索引 /351
15.4 小結 /352
-
第16章 優化數據庫服務端性能 /353
16.1 了解數據庫性能指標 /353
∣16.1.1 衡量數據庫性能的指標 /353
∣16.1.2 影響數據庫性能的硬件因素 /353
∣16.1.3 實例125:使用nmon工具監控Linux性能 /356
16.2 優化存儲性能 /359
∣16.2.1 物理存儲介質簡介 /359
∣16.2.2 存儲路徑隔離原則 /361
16.3 優化數據庫配置參數 /366
∣16.3.1 優化內存資源類參數 /366
∣16.3.2 優化臟頁刷寫類參數 /368
∣16.3.3 優化空間回收類參數 /369
∣16.3.4 優化WAL日志文件相關參數 /372
∣16.3.5 數據庫性能視圖 /376
16.4 小結 /383
-
第17章 PL/pgSQL服務端編程 /384
17.1 PL/pgSQL編程基礎 /384
∣17.1.1 PL/pgSQL的結構 /384
∣17.1.2 PL/pgSQL的聲明 /386
∣17.1.3 PL/pgSQL的表達式 /389
∣17.1.4 PL/pgSQL的基本語句 /389
∣17.1.5 PL/pgSQL的控制結構 /392
∣17.1.6 PL/pgSQL的游標 /399
∣17.1.7 PL/pgSQL的錯誤和消息 /401
∣17.1.8 PL/pgSQL的觸發器函數 /402
17.2 PL/pgSQL 編程實戰 /405
∣17.2.1 PL/pgSQL開發建議 /405
∣17.2.2 實例126:編寫一個自定義用戶函數 /407
∣17.2.3 實例127:從PL/SQL移植到PL/pgSQL /409
17.3 小結 /411
-
第18章 高可用方案 /412
18.1 如何實現高可用方案 /412
∣18.1.1 基本概念 /412
∣18.1.2 實現自動故障接管(Failover) /414
∣18.1.3 WAL歸檔與流復制 /415
∣18.1.4 防止WAL日志文件被過早刪除 /418
∣18.1.5 巧用級聯復制 /419
∣18.1.6 同步復制與讀寫分離 /420
18.2 實例128:基于Corosync+Pacemaker的方案 /424
∣18.2.1 初識Corosync和Pacemaker /424
∣18.2.2 Corosync和Pacemaker的安裝 /426
18.2.3 基于Corosync+Pacemaker的高可用方案及實現 /430
18.3 實例129:基于Stolon的方案 /436
∣18.3.1 Stolon方案架構及特性 /436
∣18.3.2 Stolon方案安裝配置及實例 /437
18.4 小結 /443