兩種簡單分析和優化MySQL資料庫表的方法

南風TaT發表於2020-10-13

兩種簡單分析和優化MySQL資料庫表的方法

題外話

mysql版本為5.7.27,隔離級別為RR。

一、分析表和檢查表

1)alalyze

alalyze [local|no_write_to_binlog] table table_name1[,table_name2]...

用於分析和儲存表的關鍵字分佈,分析後可以使系統等到更準確的統計資訊,使得SQL能夠生成正確的執行計劃。在分析表期間,使用一個讀取鎖定對錶進行鎖定。對於MyISAM、BDB、和InnoDB表有用。
alalyze table xxx;

2)check

check table table_name[,table_name2]...[option]...option={QUICK|FAST|MEDIUM|EXTENDED|CHANGED}

檢查表的作用是檢查一個或者多個表是否有錯誤。也可以檢查檢視是否有錯誤。check table 對MyISAM和InnoDB有作用。

check table xxx;

二、優化表

1)optimize

optimize [local|no_write_to_binlog] table table_name1[,table_name2]...

如果刪除了表的一大部分,或者對含有可變長度列的表(含有varchar、blob、text列的表)進行了很多更改,
則應該使用optimize table 命令來進行表優化。optimize 可以合併表中的空間碎片,消除由於刪除或者更新造成的空間浪費。該命令只對MyISAM、BDB、InnoDB表起作用。
optimize table xxx;

2)alter table xxx engine=innodb;
對於InnoDB表來說,可以設定innodb_file_per_table引數,設定InnoDB為獨立表空間模式,這樣每個資料庫的的每個表都會生成一個獨立的ibd檔案,使用者儲存表的資料可和索引。這樣可以一定程度上減輕InnoDB表空間的回收問題。刪除大量資料後,InnoDB可以通過alter table 但不修改儲存引擎的方式回收不用的空間。alter table xxx engine=innodb;

**optimize優化原理**

對mysql進行大量增刪改操作,磁碟上的空間沒有被立即收回(資料空間、索引位),而是等待新的資料來填充空缺.這些空間可以被後續的insert操作利用,但如果記錄是變長的,那麼不是所有的空間都能被充分利用,形成碎片,影響磁碟IO.

optimize可以把分散(fragmented)儲存的資料重新挪到一起(defragmentation),清除碎片,回收閒置的資料庫空間.
    
對於MyISAM表,OPTIMIZE TABLE按如下方式操作:
1. 如果表已經刪除或分解了行,則修復表。
2. 如果未對索引頁進行分類,則進行分類。
3. 如果表的統計資料沒有更新(並且通過對索引進行分類不能實現修復),則進行更新。

三、總結

analyze、check、optimize、alter table 執行期間都會鎖表,因此要根據實際情況在資料庫不繁忙的時候執行相關操作。

哎喲,不錯噢! - - - - - - 歡迎指出有誤的地方以及補充更好的方法

相關文章