OPTIMIZE TABLE 小解


首先看一下語法: 
OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ...
我們知道mysql存儲引擎里面的數據和索引數據都是物理存儲的,所以說為了減少空間使用和訪問表的時候能有更好的IO表現,所以說當表執行OPTIMIZE TABLE的時候,是會發生切實的變化的.
一般以下集中情況下,我們會使用OPTIMIZE TABLE來進行優化:
1:在大量的插入,更新,或者刪除INNODB表以后,我們再執行是很有必要的.此時如果執行OPTIMIZE TABLE的話,整表和表上所有的索引都會重組,而且不使用的表空間會被回收給操作系統.
2:在大量的插入,更新,或者刪除有全文索引的INNODB表的字段以后,不過要首先設置innodb_optimize_fulltext_only=1,也可以通過指定innodb_ft_num_word_optimize 的值來指定能在索引里面更新多少記錄.記錄數滿的時候就要通過OPTIMIZE TABLE來優化表.
3:在 MyISAM和 ARCHIVE 表做大量的刪除的時候就需要執行OPTIMIZE TABLE,或者是 MyISAM和 ARCHIVE 表做了字段長度的更改,如果此時表中有大字段的話,就更需要執行OPTIMIZE TABLE 來優化表了.因為被刪除的記錄的位置還是會保存,並不會進行回收,等待新紀錄插入,或者OPTIMIZE TABLE 進行重組才回回收.而且最重要的一點是OPTIMIZE TABLE以后性能會得到很大的提升,特別是表做過較大的變更以后在執行,性能提升會非常的明顯.
OPTIMEZE TABLE 需要的權限:
對表insert 和 select權限.
而且OPTIMIZE TABLE 對分區表也是支持的,具體的語法是
ALTER TABLE t1 OPTIMIZE PARTITION p0, p1;
從上面就可以看出來OPTIMEZE TABLE對於INNODB,MyISAM和 ARCHIVE 的表都是適用的,對於其他引擎的數據表都是不適用的,如果想要使用OPTIMIZE TABLE 優化表,就要在啟動mysqld的時候使用--skip-new參數啟動.
OPTIMIZE TABLE 可以在線DDL,通過指定(ALGORITHM=INPLACE) ,不過這個只支持INNODB表,普通表和分區表都是支持的.表重建的方式有兩種,OPTIMIZE TABLE 和 ALTER TABLE ... FORCE兩種方式都可以觸發表重建.
OPTIMIZE TABLE 也有適用於 ALGORITHM=COPY的一些條件:
1:當old_alter_table參數設置為ON的時候,OPTIMIZE並不會重建,而是使用一個臨時表先把記錄插進去來做處理.這個時候就要使用ALGORITHM=COPY來處理了.
2:當mysqld以--skip-new 為方式啟動的時候
3:當INNODB表含有全文索引的時候 ,就只能夠使用ALGORITHM=COPY來進行優化了
INNODB的數據存儲是按照page-allocation的方式存儲的,這和MYASIM引擎是不相同的,所以當我們考慮要OPTIMEZE一張表的時候,一定要先考慮以下的幾個問題:
1:INNODB表的索引碎片是有所保留的,一般情況下是最多只能夠占用93%的,剩余的一些是要保留起來用於update更新時候的頁分裂來分配空間
2:刪除操作會留下一部分的空間,只有當OPTIMIZE TABLE的時候才會重新的回收.
3:update的記錄等於是對原有的數據頁進行重新的寫入,這和數據類型和行格式是有很大關系的.這個是有前提條件的,就是原有的頁有足夠的空間能夠書寫新數據.
4:高並發的情況下,會造成索引的間隙,這個產生的主要原因就是因為MySQL的事物是基於MVCC來實現的.
 
OPTIMIZE TABLE 對於MYASIM表的支持:
1:如果表有刪除或者行拆分的話,就要repair table
2:如果索引頁沒有划分,就會重新划分索引頁
3:統計信息如果不准確的話,就會重新更新統計信息
 
OPTIMIZE TABLE 返回信息尅看一下:
Column Value
Table The table name
Op Always optimize
Msg_type status, error, info, note, or warning
Msg_text An informational message
但是還要記住一點就是5.7.4以前的版本OPTIMIZE TABLE的時候會鎖定全表,之后版本的INNODB表就就可以在線OPTIMIZE 了.而且更重要的是OPTIMIZE TABLE 會記錄二進制日志,所以說對於復制的機器是會傳送到slave上的.而且他對R-TREE結構的索引是不起作用的.
 
快速分析mysql的表信息,MYASIM引擎:
myisamchk --quick --check-only-changed --sort-index --analyze
重新組織表:
ALTER TABLE [tbl_name] TYPE=innodb
修改表行格式:
alter table your_table row_format=compressed
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM