優化表的數據類型
表需要使用何種數據類型,是需要根據應用來判斷的。雖然應用設計的時候需要考慮字段的長度留有一定的冗余,但是不推薦讓很多字段都留有大量的冗余,這樣即浪費存儲也浪費內存。
我們可以使用PROCEDURE ANALYSE()對當前已有應用的表類型的判斷,該函數可以對數據表中的列的數據類型提出優化建議,可以根據應用的實際情況酌情考慮是否實施優化。
語法:
SELECT * FROM tbl_name PROCEDURE ANALYSE();
SELECT * FROM tbl_name PROCEDURE ANALYSE(16,256);
輸出的每一列信息都會對數據表中的列的數據類型提出優化建議。第二個例子告訴PROCEDURE ANALYSE()不要為那些包含的值多於16 個或者256 字節的ENUM 類型提出建議。如果沒有這樣的限制,輸出信息可能很長;ENUM 定義通常很難閱讀。
在對字段類型進行優化時,可以根據統計信息並結合應用的實際情況對其進行優化。
12.2 通過拆分,提高表的訪問效率
這裡我們所說的拆分,主要是針對Myisam 類型的表,拆分的方法可以分成兩種情況:
1. 縱向拆分:
縱向拆分是只按照應用訪問的頻度,將表中經常訪問的字段和不經常訪問的字段拆分成兩個表,經常訪問的字段盡量是定長的,這樣可以有效的提高表的查詢和更新的效率。
2. 橫向拆分:
橫向拆分是指按照應用的情況,有目的的將數據橫向拆分成幾個表或者通過分區分到多個分區中,這樣可以有效的避免Myisam 表的讀取和更新導致的鎖問題。
12.3 逆規范化
數據庫德規范化設計強調數據的獨立性,數據應該盡可能少地冗余,因為存在過多的冗余數據,這就意味著要占用了更多的物理空間,同時也對數據的維護和一致性檢查帶來了問題。
但是對於查詢操作很多的應用,一次查詢可能需要訪問多表進行,如果通過冗余紀錄在相同表中,更新的代價增加不多,但是查詢操作效率可以有明顯提高,這種情況就可以考慮通過冗余數據來提高效率。
12.4 使用冗余統計表
使用create temporary table 語法,它是基於session 的表,表的數據保存在內存裡面,當session 斷掉後,表自然消除。
對於大表的統計分析,如果統計的數據量不大,利用insert。。。select 將數據移到臨時表中比直接在大表上做統計要效率更高。
12.5 選擇更合適的表類型
1、如果應用出現比較嚴重的鎖沖突,請考慮是否更改存儲引擎到innodb,行鎖機制可以有效的減少鎖沖突的出現。
2、如果應用查詢操作很多,且對事務完整性要求不嚴格,則可以考慮使用Myisam存儲引擎。