日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

PostgreSQL 务实应用(三/5)分表复制

發布時間:2025/3/21 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PostgreSQL 务实应用(三/5)分表复制 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

問題的提出

在項目中,有些表的記錄增長非常快,記錄數過大時會使得查詢變得困難,導致整個數據庫處理性能下降。此時,我們會考慮按一定的規則進行分表存儲。

常用的分表方式是按時間周期,如每月一張,每天一張等。當每月或每天首條記錄到達時,根據表結構創建該周期為后綴的表進行存儲。

相關考慮

這其中主要考慮兩個問題:

(1)如何復制表

采用分表機制,通常會建立一個模板表。所謂模板表,是只定義結構不存儲數據的,也可稱之為類表,而分表,通常會以增加后綴的方式命名,如 log_201901,分表實際存儲數據,可稱之為實例表。

表存在關聯、鍵、索引、約束等,這讓表的復制聽起來比較繁瑣,即便通過元數據得到這些信息,還需要自己考慮如索引的命名沖突等問題。而 PostgreSQL 為我們提供了極其便捷的方式。

CREATE TABLE [IF NOT EXISTS] 實例表 (LIKE 模板表 [INCLUDING ALL]);

其中 [ ] 內表示可選項,INCLUDING 除了 ALL 還要其它細分的選項,具體可參考幫助文檔。

(2)數據存儲的邏輯過程

首先得知道表存不存在,不存在則要創建,然后執行數據操作語句。

由于表名是動態的,在應用系統中可以先取得表名形成 SQL 語句再執行,在數據庫存儲過程中則可以使用 EXECUTE 執行動態SQL語句。

分表實例

下邊,本文以日志記錄表為例來完整地實踐分表處理過程。

功能描述:日志數量大,當前日志查詢頻繁,歷史日志需要全部保存。要求每天一個分表,日志主鍵要求全局保持唯一性(即多個分表間不重復),日志到達自動根據當前的時間進行分表存儲。

首先創建日志模板表,命名為 log_template,并為其建立相關索引,主鍵序列。

-- 創建模板表,log_id 主鍵,log_at 日志時間, log_content 日志內容 CREATE TABLE log_template (log_id bigint PRIMARY KEY, log_at timestamp, log_content varchar(1000)); -- 對日志時間索引 CREATE INDEX idx_log_at on log_template (log_at); -- 用于主鍵的序列(各分表使用同一序列) CREATE SEQUENCE seq_log_id;

我們通過一個過程來完成日志的自動分表存儲。

CREATE OR REPLACE FUNCTION func_log(v_conent varchar) RETURNS bool LANGUAGE 'plpgsql' AS $$ DECLARElv_log_at timestamp := current_timestamp;lv_suffix_tname varchar; -- 帶后綴的分表名lv_dsql text; -- 動態SQL BEGIN-- 根據時間得到應使用的分表名稱lv_suffix_tname := 'log_' || to_char(lv_log_at, 'YYYYMMDD');-- 判斷是否存在,不存在時復制模板創建分表lv_dsql := 'CREATE TABLE IF NOT EXISTS ' || lv_suffix_tname || ' (LIKE log_template INCLUDING ALL)';EXECUTE lv_dsql; -- 將數據保存至分表lv_dsql := 'INSERT INTO ' || lv_suffix_tname || '(log_id, log_at, log_content) VALUES($1, $2, $3)';EXECUTE lv_dsql USING nextval('seq_log_id'), lv_log_at, v_conent;RETURN true; END $$;

執行以下語句來看看預期的結果。

SELECT func_log('hello, the first log!'); SELECT func_log('toady is a nice day!'); SELECT func_log('每天都有新的開始,不再擔心爆表!');

結束語

分表能夠避免單表記錄過于龐大,提高查詢性能。但同時,分表也會給部分查詢或數據處理帶有復雜性,因此是否分表應該根據業務需要來,同時應盡早規劃,后期更改相對繁瑣。

在 MySQL 中也有類似的 CREATE TABLE LIKE 語法,我想都是應運而生,簡單就是美。

轉載于:https://www.cnblogs.com/timeddd/p/10874007.html

總結

以上是生活随笔為你收集整理的PostgreSQL 务实应用(三/5)分表复制的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。