mysql optimize 作用_mysql optimize table
mysql 數據文件的使用是只擴展,不回收。對表執行delete之后,磁盤上數據文件是不會縮小的。
通常的做法,是先邏輯導出,然后truncate 原表(或者刪除重建),再導入。
另外還有一種方法是optimize table ,但是有一定的限制。
同事問我在innodb 上一張200G+ 的表,使用了optimize table 整理碎片,回收空間時,執行了快3個小時,空間不僅沒有減少,還增加了200多個G,磁盤空間都用光了。問我怎么處理。
這個問題之前也沒有遇到過。所以今天學習并整理了下。
關于optimize table 回收空間的效果這里不做演示,網上一大把。
1. 適用范圍
OPTIMIZE TABLE只對MyISAM, BDB和InnoDB表起作用。
三種不同的存儲引擎,optimize table 的處理邏輯是不一樣的。最關鍵的就是這個處理邏輯:
MyISAM:
1.如果表已經刪除或分解了行,則修復表。
2.如果未對索引頁進行分類,則進行分類。
3.如果表的統計數據沒有更新(并且通過對索引進行分類不能實現修復),則進行更新。
BDB:
OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。
INNODB:
OPTIMIZE TABLE被映射到ALTER TABLE ... FORCE ,這會重建表。重建操作能更新索引統計數據并釋放成簇索引中的未使用的空間。
在5.6.17之前,optimize table 會鎖表,從5.6.17開始,optimize table 變成在線操作,表鎖只會發生在解析和提交兩個階段, 這兩個過程是極短的,可以忽略。
也就是說,對DML操作基本不會引起堵塞。
當滿足以下兩個條件時,mysql 會使用copy 方法復制數據(copy的速度比insert要快):
開啟mysqld?--skip-new 選項
old_alter_table 系統變量設置為enable狀態
需要注意的是,如果表上包含fulltext索引,optimize table 操作使用的是copy method ,而不會選擇online在線的方式
2. 不在binlog中記錄optimize table 操作
OPTIMIZE NO_WRITE_TO_BINLOG TABLE
3. 遇到的問題
如果在使用optimize的時候遇到如下錯誤:
root@rac1 : test 22:10:22> optimize table tab;
+----------+----------+----------+-------------------------------------------------------------------+
| Table ? ?| Op ? ? ? | Msg_type | Msg_text ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
+----------+----------+----------+-------------------------------------------------------------------+
| test.tab | optimize | note ? ? | Table does not support optimize, doing recreate + analyze instead |
| test.tab | optimize | status ? | OK ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?|
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (29.88 sec)
使用--skip-new或--safe-mode選項可以啟動mysqld。通過啟動mysqld,您可以使OPTIMIZE TABLE對其它表類型起作用。
總結
以上是生活随笔為你收集整理的mysql optimize 作用_mysql optimize table的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 增值税票和普票的区别 普通发票和增值税票
- 下一篇: python子类定制_在Python中实