MySQL 索引壓縮碎片
MySQL 索引簡介
索引也叫“鍵”(key),是存儲引擎用於快速找到記錄的一種數據結構。
索引對於良好的性能非常關鍵。數據量越來越大的時候,索引的重要性也會體現出來。
例如下面的sql:
Select * from user where userid=123;
如果沒有創建索引,此時查詢會全表掃描
如果在userid字段創建了索引,會根據索引來進行查詢。
下面對於同樣的語句使用explain 進行執行計劃分析。
下圖是未創建索引時的執行計劃,可以看到type是all,key對應的內容為空,說明沒有索引或者未命中索引。
下圖是創建了userid的索引的執行計劃,可以看到type是ref,possible_keys 是推測的索引名稱,Key是索引名稱。這樣會減輕很多查詢的壓力。
MySQL 索引碎片
在數據表使用很長時間後,表上的B-Tree索引可能會碎片化,會降低查詢的效率。碎片化的索引可能會以很差或者無序的方式存儲在磁盤上。
如下圖,是未經優化的數據表的使用情況。
執行語句:show table status like ‘tables‘;,可以得到下圖:
字段解釋:
- Data_length : 數據的大小。
- Index_length: 索引的大小。
- Data_free :數據在使用中的留存空間,如果經常刪改數據表,會造成大量的Data_free。
如果遇到上述情況,需要及時清理碎片,以便清理碎片,提升效率。
在清理碎片前,查看數據表的文件大小,做個參考。如下圖:
可以看到mysql 的數據文件一般有兩種:ibd,frm。
frm文件是數據表定義與格式。比如字段的類型。
Ibd文件是數據表的數據內容,主要是由數據內容與索引內容組成。可以看到當前需要整理的數據表的ibd文件是240MB。
MySQL 壓縮索引碎片
執行命令:OPTIMIZE table tablename;可以進行壓縮索引碎片。
需要註意的是,這個操作不應經常使用,以月左右的時間段為基數進行一次清理即可。
在執行optimize命令時,會鎖定該表,相關操作會受到一定影響。
查看壓縮後的參數,如下圖:
可以看到data_free為0,說明無留存空間了。Index_length 也少了很多。
查看數據文件,同樣得到了驗證:
可以看到此表的ibd文件降到了160MB。較之前的240MB容量,釋放了很多空間。
MySQL 索引壓縮碎片