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

  

字段解释:

  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容量,释放了很多空间。

原文地址:https://www.cnblogs.com/zhexy/p/7750350.html