資料庫表設計--備份記錄的表設計優化

来源:http://www.cnblogs.com/TeyGao/archive/2017/06/29/7095901.html
-Advertisement-
Play Games

## ## 需求場景: 由於MySQL沒有類似於SQL SERVER那樣的系統表來存放備份記錄,且大規模的MySQL伺服器需要集中管理和查看。 伺服器出現性能問題或複製延遲時,需要先判斷是否由數據備份引起。 ## ## 第一版 按照需求,考慮到需要記錄的備份信息有備份伺服器信息、備份開始結束時間、備 ...


##================================================================##

需求場景:

由於MySQL沒有類似於SQL SERVER那樣的系統表來存放備份記錄,且大規模的MySQL伺服器需要集中管理和查看。

伺服器出現性能問題或複製延遲時,需要先判斷是否由數據備份引起。

##================================================================##

第一版

按照需求,考慮到需要記錄的備份信息有備份伺服器信息、備份開始結束時間、備份是否成功等消息,於是設計出第一版表:

create table full_backup_log
(
    id bigint auto_increment primary key, ## 自增主鍵,業務無關
    host_ip varchar(50), ## 備份機IP
    host_port int, ## 備份機埠
    backup_type varchar(50), ## 備份類型,mysqldump和xtrabackup
    start_time datetime, ## 備份開始時間
    end_time datetime, ## 備份結束時間
    is_success int, ## 備份是否成功
    backup_message varchar(5000), ## 備份消息
    check_time datetime ##寫入或更新記錄的時間
);

##================================================================##

第二版

將backup_message弄得比較大, 主要是先把備份過程中的一些信息寫進去,但仔細想想,該表不能很好地記錄備份過程中的每一步,將所有信息放入到backup_message列中不利於查看,於是新增一個詳細信息表:

create table full_backup_log_detail
(
    id bigint auto_increment primary key, ## 自增主鍵,業務無關
    full_backup_log_id bigint, ##關聯full_backup_log表主鍵
    host_ip varchar(50), ## 備份機IP
    host_port int, ## 備份機埠
    backup_type varchar(50), ## 備份類型,mysqldump和xtrabackup
    backup_message varchar(5000), ## 備份消息
    check_time datetime ##寫入或更新記錄的時間
);

雖然full_backup_log表中存放有備份機和備份類型數據,可以通過full_backup_log_id關聯來獲取到,但是考慮full_backup_log_detail表數據數據日誌性數據,寫入後不會發生變化,因此通過冗餘來減少關聯,僅查詢full_backup_log_detail即可看某台伺服器的備份詳情。

 

##================================================================##

第三版

通常DBA關心每個資料庫最後一次備份成功時間,而表full_backup_log中存有is_success欄位用來標識備份成功,可以通過以下SQL來獲取:

select t1.* from full_backup_log as t1
inner join (
select host_ip,host_port,max(id) as max_id from full_backup_log
where is_success=1
group by host_ip,host_port
) as t2 on t1.id=t2.max_id

如果full_backup_log表數據量較大時,比如存放幾千個實例的幾年數據,表中數據幾百萬上千萬時,上面查詢即使有合適索引也不能高效執行。

由於DBA並不關心早前數據,可以通過數據結轉來實現,但如果偶爾查詢早前數據則需要當前表和歷史表進行UNION,程式實現上還得判斷數據是否結轉,於是新增一表來存放最後一次成功備份記錄:

## full_backup_info用來存放備份機最後一次成功備份的記錄
create table full_backup_info
(
    id bigint auto_increment primary key, ## 自增主鍵,業務無關
    host_ip varchar(50), ## 備份機IP
    host_port int, ## 備份機埠
    backup_type varchar(50), ## 備份類型,mysqldump和xtrabackup
    start_time datetime, ## 備份開始時間
    end_time datetime, ## 備份結束時間
    backup_message varchar(5000), ## 備份消息
    check_time datetime ##寫入或更新記錄的時間
);

同樣數據容易來減少表關聯,雖然最後一次成功的備份記錄肯定和full_backup_log表中的備份記錄對應,但是因為保存數據已經全部冗餘,就無需在表full_backup_info中增加欄位與表full_backup_log進行關聯

 

##================================================================##

第四版

當備份進程過度使用CPU和IO資源導致性能問題並報警後,DBA需要第一時間判斷報警伺服器是否處於備份過程中,需要查看那些伺服器正在進行備份:

方法1:通過full_backup_log表的start_time和end_time來獲取當前正在備份的伺服器,需要對end_time來建索引,如果end_time預設為NULL,則WHERE end_time is null or end_time >now, 性能很容易因OR而受影響,可以考慮給end_time設置一個預設值如2199-01-01啥的,將查詢改為 where end_time >now

方法2:將full_backup_log表中is_success列擴展來標識備份狀態,如果1表示成功0表示失敗-1表示正在備份,查詢條件為where is_success=-1,需要為is_success列建索引,但是is_success列選擇性太低,而MySQL又不支持過濾索引,容易生成不高效的執行計劃。

解決辦法:

新建一個表,專門存放正在備份的伺服器記錄,這樣只需要查詢該表便可以獲取到所有正在備份的伺服器列表,備份成功後立即刪除該表記錄。

## full_backup_in_process用來存放正在備份的伺服器信息
create table full_backup_in_process
(
    id bigint auto_increment primary key, ## 自增主鍵,業務無關
    host_ip varchar(50), ## 備份機IP
    host_port int, ## 備份機埠
    backup_type varchar(50), ## 備份類型,mysqldump和xtrabackup
    start_time datetime, ## 備份開始時間
    check_time datetime ##寫入或更新記錄的時間
);

 

##================================================================##

總結:

部分研發同事在進行設計時,隨著需求變化不停地修改表,通過在原表上新增欄位來解決新需求,導致表欄位過多,同一表處理不同需求,或通過複雜的SQL來實現,逼著DBA去優化SQL或創建一堆的低效索引,且美名其曰“業務需求”。但很多需求其實可以曲線處理,往往優化業務需求和優化實現方式才能最終解決性能問題。

曾經有研發同事讓幫其優化SQL,發現其業務需求是對幾千萬數據進行排序分頁然後取TOP,幾十秒都無法返回結果,建議其去除排序,被告知部分數據需要優先處理,而這部分需要優先處理的數據極少極少,最終解決辦法是將優先處理的數據分拆出來讓單獨的程式進行處理,其他普通數據不排序查詢正常處理,完美解決。

雖然開個拖拉機,可以拉貨,可以耕田,也能代步,家裡沒電還能當個發電機,但是人生不能一個拖拉機就解決了吧!

##================================================================##

 依舊是妹子鎮壓帖子!

推女郎艾慄慄,拿走不謝!


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

-Advertisement-
Play Games
更多相關文章
  • 反編譯apk,在smali中註入一段自己的代碼。 試了幾個工具(apkdb、apktool、apkSign), 發現反編譯都可以,但是回編譯都不相容java1.8,導致回編譯成功,但apk沒有簽名,不能安裝; 在網上找了一些資料,都不行; 無奈只能換回java1.7,實測成功。 如果哪位有更好的方法 ...
  • UITableView這個iOS開發中永遠繞不開的UIView,那麼就不可避免的要在多個頁面多種場景下反覆摩擦UITableView,就算是剛跳進火坑不久的iOS Developer也知道實現UITableView的數據源dataSource和代理delegate,寫出一個UITableView也就 ...
  • 一, 代碼。 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //獲得現在的時間 [self currentTime ...
  • MySQL 5.7 SSL連接最佳實戰 1. 背景 * 在生產環境下,安全總是無法忽視的問題,資料庫安全則是重中之重,因為所有的數據都存放在資料庫中 * 當使用非加密方式連接MySQL資料庫時,在網路中傳輸的所有信息都是明文的,可以被網路中所有人截取,敏感信息可能被泄露。在傳送敏感信息(如密碼)時, ...
  • 1.資料庫優化的目的 2.資料庫優化的方向 ...
  • 參考:http://www.cnblogs.com/WeiGe/p/4903850.html 一對多分為關聯模式和內嵌模式 內嵌與關聯什麼時候用: 存在雙向查詢則用關聯,還需用到索引。 當兩者是包含關係,並且被包含的對象不會經常的變化,並不會進行雙向查詢,被包含對象不會進行其他的關聯查 則用到內嵌模 ...
  • http://dev.mysql.com/doc/refman/5.7/en/resetting-permissions.html親測方法3,已成功重置密碼。(感謝@非常,告訴我官網就有重置方法,網上搜了一堆堆...另外,step1和2來源於http://www.2cto.com/database/ ...
  • 1、查找表中多餘的重覆記錄,重覆記錄是根據單個欄位(Id)來判斷 select * from 表 where Id in (select Id from 表 group byId having count(Id) > 1) 2、刪除表中多餘的重覆記錄,重覆記錄是根據單個欄位(Id)來判斷,只留有ro ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...