【MySQL】mysql optimize table
維護mysql 對錶空間的回收策略是隻擴充,不回收。對錶執行delete之後,表空間是不回收的,空閒的空間可以被insert 繼續使用,通常執行truncate,重新邏輯匯出,再匯入或者執行optimize table 三種都可以重新使用未使用的表空間。
本文介紹一下optimize table OPTIMIZE TABLE可以重新利用未使用的空間,並整理資料檔案的碎片。
1 演示回收空間
刪除之前:
[root@rac1 test]# ll tab.ibd
-rw-rw---- 1 mysql mysql 150994944 10-16 22:15 tab.ibd
對錶進行刪除操作:
root@rac1 : test 21:12:00> optimize table tab;
Query OK, 0 rows affected (0.01 sec)
Records: 0 Duplicates: 0 Warnings: 0
刪除之後:
[root@rac1 test]# ll tab.ibd
-rw-rw---- 1 mysql mysql 98304 10-16 22:15 tab.ibd
顯然 ibd檔案經過optimize之後 明顯的減小了。
2 使用範圍
OPTIMIZE TABLE只對MyISAM, BDB和InnoDB表起作用。
對於MyISAM表,OPTIMIZE TABLE按如下方式操作:
1.如果表已經刪除或分解了行,則修復表。
2.如果未對索引頁進行分類,則進行分類。
3.如果表的統計資料沒有更新(並且透過對索引進行分類不能實現修復),則進行更新。
對於BDB表,OPTIMIZE TABLE目前被對映到ANALYZE TABLE上。
對於InnoDB表,OPTIMIZE TABLE被對映到ALTER TABLE上,這會重建表。重建操作能更新索引統計資料並釋放成簇索引中的未使用的空間。
3 對於 M-S,M-M 架構的資料庫
如果不想把optimize table 寫入從資料庫,可以執行
OPTIMIZE NO_WRITE_TO_BINLOG TABLE
這樣命令就不會寫入binglog 並且不被從庫執行。
4 遇到的問題
如果在使用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對其它表型別起作用。
注意,在OPTIMIZE TABLE執行過程中,MySQL會鎖定表。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22664653/viewspace-746740/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql之 OPTIMIZE TABLE整理碎片MySql
- Mysql用optimize table 最佳化MySql
- MySQL關於表碎片整理OPTIMIZE TABLE操作的官方建議MySql
- MySQL之mysqlcheck、check、optimize和analyzeMySql
- Mysql optimize、Analyze、check、repair維護操作MySqlAI
- MySQL table into a golang strucMySqlGolang
- create table of mysql databaseMySqlDatabase
- 【MySQL】5.6.x InnoDB Error Table mysql.innodb_table_stats not foundMySqlError
- 【MySQL】再說MySQL中的 table_idMySql
- 【mysql】table中新增列MySql
- mysql的ALTER TABLE命令MySql
- Mysql---show table statusMySql
- MYSQL TABLE CHANGE STORAGE ENGINEMySql
- 【MySQL】七、再說MySQL中的 table_idMySql
- MySQL rename table方法大全MySql
- MySQL 5.6 Table cache 簡介MySql
- MySQL 的Rename Table語句MySql
- MySQL:Analyze table導致'waiting for table flush'MySqlAI
- MySQL報錯Table 'plugin' is read only [ERROR] Can't open the mysql.plugin table.MySqlPluginError
- MySQL 啟動報錯 Table 'mysql.plugin' doesn't existMySqlPlugin
- MySQL 關於Table cache設定MySql
- MySQL5.6 create table原理分析MySql
- 關於MYSQL flush table的作用MySql
- MySQL的create table as 與 like區別MySql
- MySQL5.7 Waiting FOR TABLE FLUSHMySqlAI
- [ERROR] Can't open the mysql.plugin tableErrorMySqlPlugin
- mysql partition table use to_days bugMySql
- mysql lower-case-table-names引數MySql
- 利用mysql slave 修復master MyISAM tableMySqlAST
- Java OptimizeJava
- MySQL:Table_open_cache_hits/Table_open_cache_misses/Table_open_cache_overflowsMySql
- 'mysql.column_stats' doesn't exist and Table 'mysql.index_stats' doesn't existMySqlIndex
- MySQL Shell import_table資料匯入MySqlImport
- MySQL資料災難挽救之truncate tableMySql
- MySQL資料災難挽救之drop tableMySql
- MySQL InnoDB File-Per-Table表空間MySql
- mysql 大小寫敏感 lower_case_table_namesMySql
- MySQL中innodb_file_per_table引數MySql