MySQL碎片整理方法

jopen 9年前發布 | 7K 次閱讀 MySQL 數據庫服務器
 

對于一個表如果經常插入數據和刪除數據,則會產生很多不連續的碎片,這樣久而久之,這個表就會占用很大空間,但實際上表里面的記錄數卻很少,這樣不但會浪費空間,并且查詢速度也更慢,因此為了解決這個問題,可以有心下解決方案

1、myisam存儲引擎清理碎片方法

OPTIMIZE TABLE  table_name

2、innodb存儲引擎清理碎片方法

ALTER TABLE tablename ENGINE=InnoDB

3、查看表碎片的方法

mysql> select ROW_FORMAT,TABLE_ROWS,DATA_LENGTH,INDEX_LENGTH,MAX_DATA_LENGTH,DATA_FREE,ENGINE from TABLES where TABLE_SCHEMA='test_db' and TABLE_NAME='test_table' limit 1;

+------------+------------+-------------+--------------+-----------------+------------+--------+

| ROW_FORMAT | TABLE_ROWS | DATA_LENGTH | INDEX_LENGTH | MAX_DATA_LENGTH | DATA_FREE  | ENGINE |

+------------+------------+-------------+--------------+-----------------+------------+--------+

| Dynamic    |    2250014 |  4042158980 |   2338186240 | 281474976710655 | 3901819476 | MyISAM |

+------------+------------+-------------+--------------+-----------------+------------+--------+

1 row in set (0.00 sec)

從上面的DATA_FREE字段可以看出碎片空間很大

Engine不同,OPTIMIZE 的操作也不一樣的,MyISAM 因為索引和數據是分開的,所以 OPTIMIZE 可以整理數據文件,并重排索引.

OPTIMIZE 操作會暫時鎖住表,而且數據量越大,耗費的時間也越長,它畢竟不是簡單查詢操作.所以把 Optimize 命令放在程序中是不妥當的,不管設置的命中率多低,當訪問量增大的時候,整體命中率也會上升,這樣肯定會對程序的運行效率造成很大影響.比較好的方式就是做個shell,定期檢查mysql中 `information_schema`.`TABLES`字段,查看 DATA_FREE 字段,大于0話,就表示有碎片

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!