當我們對于一個資料量非常大的表進行大量的删除操作後,這個表将會存在非常多的碎片,導緻資料庫伺服器性能下降,這個時候就要求我們對這些表要定期的進行碎片整理以保證資料庫的性能。其中一個指令可以幫助我們完成這個——OPTIMIZETABLE [tablename],當然這種方式隻适用于多表空間的存儲方式。這裡以InnoDB的多表空間存儲為例(最後附上修改資料庫表存儲方式的方法)。
1. 首先建立表
SETFOREIGN_KEY_CHECKS=0;--(不檢查外鍵關聯)
DROP TABLE IF EXISTS `department_info`;
CREATETABLE `department_info` (
`departmentid`int(11) NOT NULL,
`departmentname` varchar(30) NOT NULL,
`departmentdesc`text
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. 向表中插入大量資料
insertinto department_info values(1,'test',repeat('haha',100));
insertinto department_info values(2,'test',repeat('haha1',100));
insertinto department_info values(3,'test',repeat('haha1',100));
insertinto department_info select * from department_info;
insertinto department_info select * from department_info;
…………執行多次…………
3. 檢視存儲的資料檔案目錄(通過檢視mysql安裝目錄下的my.ini檔案可以知道資料存儲路徑),看到這時對應的資料表資訊有多大,然後執行删除操作

執行DELETE FROM department_info再次檢視資料存儲檔案,發現大小沒變,這就是引起我們日常說的表碎片的起因了。

執行碎片整理操作,OPTIMIZE TABLE department_info

至此表碎片整理完成。
附:
該變表空間存儲方式為多表空間存儲方式過程:
關閉Mysql服務,打開MYSQL安裝目錄,記事本打開my.ini檔案,加入語句innodb_per_table=1儲存,重新開機Mysql服務即可(之前建立的表仍按照原來的存儲方式存儲)
檢視表空間存儲方式是否為多表空間存儲方式:
show variables like "innodb_file_per_table";