19.Mysql優化資料庫物件
19.優化資料庫物件
19.1 優化表的資料型別
應用設計時需要考慮欄位的型別和長度,並留有一定長度冗餘。
procedure analyse()函式可以對錶中列的資料型別提出優化建議。
procedure analyse()函式用法:
select * from 表名 procedure analyse(); -- 對所有列提出優化建議
select * from 表名 procedure analyse(16,256); -- 不對包含16至256取值的列舉列提出建議
分析的結果是針對每個列,輸出該列的最小值、最大值、最小值長度、最大值長度、空字串或0的個數、null的個數、平均值、方差、優化建議。
注意:該函式只對已存在的表,且包含大量記錄時分析有效,這樣的表對型別修改時一定要注意DDL鎖表的問題。
該函式不能在設計階段給出型別和長度建議。
19.2 通過拆分提高表的訪問效率
對錶拆分分為:垂直拆分和水平拆分。
垂直拆分指將主鍵和常用列放在一張表中(主表),將主鍵和非常用列放在另一張表中(從表)。
如果從表中除主鍵列意外所有列都是無效取值(空字串、null、0),則不需要儲存該行資訊,所以從表的記錄量比主表少,從而優化儲存空間。
在查詢時如果只從主表查詢,則優化查詢速度;如果要從主表和從表連線查詢,則產生了left join。
並且拆表後主鍵同時儲存在兩張表中,增加的冗餘,即增加了程式對冗餘的管理和事務的管理。
水平拆分指根據一個列或多個列的資料值將資料存放到兩個同構且獨立的表中。
水平拆分適用場景:表很大,表中資料有獨立性,需要把資料存放在多個介質上。
如果查詢與分表的依據一致,則只需要在一個分表中執行,優化了速度。
如果查詢與分表的依據不一致,則只需要在多個分表中執行並將結果union all在一起,增加了業務複雜度。
水平拆分需要考慮資料量的增長速度。
19.3 逆規範化
規範化保證資料的一致性、完整性,避免資料的冗餘,不一致等。
規範化帶來的問題是查詢時可能產生多表關聯,影響查詢速度。
逆規範化指通過增加冗餘列、派生列或重組表、分割表來提升查詢速度,但需要應用程式來保證資料的一致性和完整性。
冗餘列:指在多個表中具有相同的列,常用來避免連線查詢。例如:給emp表增加dname列,則dname同時存在於emp表和dept表。
派生列:指該列可由其它列計算生成,常用來避免在查詢中實時計算。例如:年齡=當前日期-出生日期,年薪=月薪*12。
重組表:指將使用者需要檢視的多個表連線的結果構造成一張表,常用來避免連線查詢,缺點需要實時或定時從查詢的多張表向該表同步資料。
分割表:指垂直分割和水平分割。
規範化帶來的問題是資料的一致性、完整性不能保證,維護的方法分為:批處理儲存過程實現、應用邏輯實現、觸發器實現。
批處理儲存過程實現:是指定期呼叫儲存過程來更新冗餘列、派生列、重組表、拆分表等資訊。缺點:實時性不高。
應用邏輯實現:指應用程式在同一個事務內完成本業務和冗餘列、派生列、重組表、拆分表的DML操作。缺點:業務邏輯複雜、開發難度大、容易遺漏、資料完整性風險大。
觸發器實現:對資料的DML操作立即出發對冗餘列、派生列、重組表、拆分表的DML操作,業務邏輯擴充套件簡單、實時性高。缺點:資料庫維護難度大,專案資料庫遷移難度大。
19.4 使用中間表提高統計查詢速度
指先複製業務表及其資料,然後在複製的表(中間表)上進行統計操作。
優點:不影響業務。
缺點:增加儲存空間,有一個表和資料的複製過程。
19.5 小結
資料庫設計是應用程式的基礎,前期設計的好壞影響應用程式的整個生命週期及資料質量。
越到後期的資料庫設計調整,對業務影響越大。