MySQL表的狀態檢查 索引修復 碎片整理

2021-10-06 11:47:35 字數 2805 閱讀 6059

mysql 的optimizer(優化元件)在優化sql語句時,首先需要收集一些相關資訊,其中就包括表的cardinality(可以翻譯為「雜湊程度」),它表示某個索引對應的列包含多少個不同的值,比如性別,正常就有2個值,男/女——如果cardinality大大少於資料的實際雜湊程度,那麼會影響 sql 執行計畫的生成,也就可能導致索引失效了(不走索引)

我們可以使用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(校驗值)

使用myisam引擎的表會把checksum儲存起來,稱為live checksum,當資料發生變化時,checksum會相應變化。

在執行checksum table時,可以在最後指定選項qiuck或是extended:

如果沒有指定選項,則預設使用extended。

經常更新資料的磁碟需要整理碎片,資料庫也是這樣,optimize table語句對myisam和innodb型別的表都有效

如果表經常更新,就應當定期執行optimize table語句,保證效率。

與analyze table一樣,optimize table也可以使用local來取消寫入binlog。

另外索引的碎片整理可以通過下面這條sql重建整張表的索引資料,將表的一些索引空洞一併壓縮進行重新整合。

alter

table t engine

=innodb

;

資料庫經常可能遇到錯誤,譬如資料寫入磁碟時發生錯誤,或是索引沒有同步更新,或是資料庫未關閉mysql就停止了。

遇到這些情況,資料就可能發生錯誤:

incorrect key

file

fortable: ' '

. 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'

;/*tennis是資料庫名*/

結果是

table_name   check_time

---------- -------------------

players 2006-08

-2116:44:25

check table對 myisam 和 innodb 儲存引擎的表有作用,另外還可以指定其它選項:

upgrade:用來測試在更早版本的mysql中建立的表是否與當前版本相容。

fast:只檢查表是否正常關閉,如果在系統掉電之後沒有遇到嚴重問題,可以使用這個選項。

changed:只檢查上次檢查時間之後更新的資料。

extended:最慢的選項,會進行全面的檢查。

用於修復表,只對myisam和archive型別的表有效

這條語句同樣可以指定選項:

與analyze table一樣,repair table也可以使用local來取消寫入binlog。

參考:

MySQL使用explain檢查索引執行計畫

執行計畫分析 作用將優化器 選擇後的執行計畫 擷取出來.便於管理管判斷語句得執行效率.獲取執行 desc sql語句 explain sql 語句 這裡desc和explain的效果是一樣的 mysql explain select from test where name tom g 1.row ...

mysql的ISAM表的檢查和修復

我們知道,mysql資料庫的每乙個資料庫對應乙個子目錄,每個子目錄中包含了對應於這個資料庫中的資料表的檔案。每乙個資料表對應三個檔案,它們和表名相同,但是具有不同的副檔名。tblname.frm檔案是表的定義,它儲存了表中包含的資料列的內容和型別。tblname.myd檔案包含了表中的資料。tbln...

mysql 資料庫檢查與修復的辦法

mysql 自帶了專門使用者資料表檢查和修復的工具 myisamchk,當 repair.php 多次修復均無法成功時,可以在伺服器終端使用 myisamchk 進行修復。在 mysql 的程式檔案目錄 見 資料備份與恢復 中的說明 可以找到這個工具。常用的修復命令為 myisamchk r 資料檔...