Analyze Table MySQL 的Optimizer(優化元件)在優化SQL語句時,首先需要收集一些相關資訊,其中就包括表的cardinality(可以翻譯為“散列程度”),它表示某個索引對應的列包含多少個不同的值——如果cardinality大大少于資料的實際散列程度,那麼索引就基本失效了。 我們可以使用SHOW INDEX語句來檢視索引的散列程度: SHOW INDEX FROM PLAYERS; TABLE KEY_NAME COLUMN_NAME CARDINALITY ------- -------- ----------- ----------- PLAYERS PRIMARY PLAYERNO 14 因為此時PLAYER表中不同的PLAYERNO數量遠遠多于14,索引基本失效。 下面我們通過Analyze Table語句來修複索引: ANALYZE TABLE PLAYERS; SHOW INDEX FROM PLAYERS; 結果是: TABLE KEY_NAME COLUMN_NAME CARDINALITY ------- -------- ----------- ----------- PLAYERS PRIMARY PLAYERNO 1000 此時索引已經修複,查詢效率大大提高。 需要注意的是,如果開啟了binlog,那麼Analyze Table的結果也會寫入binlog,我們可以在analyze和table之間添加關鍵字local取消寫入。 Checksum Table 資料在傳輸時,可能會發生變化,也有可能因為其它原因損壞,為了保證資料的一緻,我們可以計算checksum(校驗值)。 使用MyISAM引擎的表會把checksum存儲起來,稱為live checksum,當資料發生變化時,checksum會相應變化。 在執行Checksum Table時,可以在最後指定選項qiuck或是extended;quick表示傳回存儲的checksum值,而extended會重新計算checksum,如果沒有指定選項,則預設使用extended。 Optimize Table 經常更新資料的磁盤需要整理碎片,資料庫也是這樣,Optimize Table語句對MyISAM和InnoDB類型的表都有效。 如果表經常更新,就應當定期運作Optimize Table語句,保證效率。 與Analyze Table一樣,Optimize Table也可以使用local來取消寫入binlog。 Check Table 資料庫經常可能遇到錯誤,譬如資料寫入磁盤時發生錯誤,或是索引沒有同步更新,或是資料庫未關閉MySQL就停止了。 遇到這些情況,資料就可能發生錯誤: Incorrect key file for table: ' '. Try to repair it. 此時,我們可以使用Check Table語句來檢查表及其對應的索引。 譬如我們運作 CHECK TABLE PLAYERS; 結果是 TABLE OP MSG_TYPE MSG_TEXT -------------- ----- -------- -------- TENNIS.PLAYERS check status OK MySQL會儲存表最近一次檢查的時間,每次運作check table都會存儲這些資訊: 執行 SELECT TABLE_NAME, CHECK_TIME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'PLAYERS' AND TABLE_SCHEMA = 'TENNIS'; 結果是 TABLE_NAME CHECK_TIME ---------- ------------------- PLAYERS 2006-08-21 16:44:25 Check Table還可以指定其它選項: UPGRADE:用來測試在更早版本的MySQL中建立的表是否與目前版本相容。 QUICK:速度最快的選項,在檢查各列的資料時,不會檢查連結(link)的正确與否,如果沒有遇到什麼問題,可以使用這個選項。 FAST:隻檢查表是否正常關閉,如果在系統掉電之後沒有遇到嚴重問題,可以使用這個選項。 CHANGED:隻檢查上次檢查時間之後更新的資料。 MEDIUM:預設的選項,會檢查索引檔案和資料檔案之間的連結正确性。 EXTENDED:最慢的選項,會進行全面的檢查。 Repair Table 用于修複表,隻對MyISAM和ARCHIVE類型的表有效。 這條語句同樣可以指定選項: QUICK:最快的選項,隻修複索引樹。 EXTENDED:最慢的選項,需要逐行重建索引。 USE_FRM:隻有當MYI檔案丢失時才使用這個選項,全面重建整個索引。 與Analyze Table一樣,Repair Table也可以使用local來取消寫入binlog。 |