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