1. 程式人生 > >MySQL 索引壓縮碎片

MySQL 索引壓縮碎片

技術 格式 創建 註意 找到 bsp 定義 mys table

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‘;,可以得到下圖:

技術分享

字段解釋:

  1. Data_length : 數據的大小。
  2. Index_length: 索引的大小。
  3. 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 索引壓縮碎片