PostgreSQL 務實應用(三/5)分表複製

来源:https://www.cnblogs.com/timeddd/archive/2019/05/16/10874007.html
-Advertisement-
Play Games

問題的提出 在項目中,有些表的記錄增長非常快,記錄數過大時會使得查詢變得困難,導致整個資料庫處理性能下降。此時,我們會考慮按一定的規則進行分表存儲。 常用的分表方式是按時間周期,如每月一張,每天一張等。當每月或每天首條記錄到達時,根據表結構創建該周期為尾碼的表進行存儲。 相關考慮 這其中主要考慮兩個 ...


問題的提出

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

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

相關考慮

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

(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 $$
DECLARE
    lv_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 語法,我想都是應運而生,簡單就是美。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DELETEFROM boll_paramWHERE id in ( SELECT a.id FROM ( SELECT id FROM boll_param WHERE (symbol, time_frame, ma, k, std, N, 回測起始日期, 回測結束日期, 交易方向) IN ( S ...
  • 有這麼一個需求,滿足只有一個輸入框的條件下,支持不同數據列的搜索結果。 說白了,就是這個 輸入框 既可以用來 搜索姓名,也可以搜索 年齡,地址等。 分析: 一般情況下,我們的一個輸入框對應 資料庫 的某一列信息的搜索,比如,要搜索姓名為 ‘李’ 姓開頭的,那麼對應的 sql 就是 where nam ...
  • 先用SYS登陸SQLPLUS,即: 再給scott授權: ...
  • 一、文件下載: MySQL:官網:https://www.mysql.com/downloads/(現在最新的是5.7版) 下載路徑:"Downloads" ==>> "Community" ==>> "MySQL Community Server" ==>>"Looking for previou ...
  • JSON 可謂風靡互聯網,在數據交換使用上,其優勢特別明顯,其結構簡潔、可讀易讀、形式靈活。很多 API 介面的數據都採用 JSON 來表示。 PostgreSQL 對 JSON 提供了良好的支持。具體的相關函數可參考: "JSON類型和函數" 從使用的角度而言,個人覺得常見的應用場景為: 1. 讀 ...
  • 當然首先要裝好Oracle 11g 然後還要有sqlplus,這個在Oracle11g的時候應該都會配上的 進入正題,如果oracle/plsql沒scott賬戶,如何創建 先找到Oracle安裝目錄下的soctt.sql 我的是在: E:\app\91959\product\11.2.0\dbho ...
  • (1)連接資料庫時報錯 錯誤原因是和轉義字元有關。連接字元串使用的URL格式,所以其中的密碼中的% 需要轉義。 知識擴展: 連接mongo使用URI有特殊字元 '@' 或者":"或者‘%’, 連接會報錯,需要進行轉義。 解決方法: 把 @ 換成 %40 把 : 換成 %3A 把 % 換成 %25 ( ...
  • 1. 現象與問題 ORDER BY排序後,用LIMIT取前幾條,發現返回的結果集的順序與預期的不一樣 下麵是我遇到的問題: 可以看到,帶LIMIT與不帶LIMIT的結果與我預期的不一樣,而且“很不可思議”,真是百思不得其解 後來百度了一下,如果order by的列有相同的值時,mysql會隨機選取這 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...