MySQL 索引压缩碎片

MySQL 索引简介

索引也叫“键”(key),是存储引擎用于快速找到记录的一种数据结构。mysql

索引对于良好的性能很是关键。数据量愈来愈大的时候,索引的重要性也会体现出来。sql

例以下面的sql:数据结构

Select * from user where userid=123;性能

若是没有建立索引,此时查询会全表扫描优化

若是在userid字段建立了索引,会根据索引来进行查询。 blog

下面对于一样的语句使用explain 进行执行计划分析。 索引

下图是未建立索引时的执行计划,能够看到type是all,key对应的内容为空,说明没有索引或者未命中索引。table

  

下图是建立了userid的索引的执行计划,能够看到type是ref,possible_keys 是推测的索引名称,Key是索引名称。这样会减轻不少查询的压力。效率

 

 

MySQL 索引碎片

在数据表使用很长时间后,表上的B-Tree索引可能会碎片化,会下降查询的效率。碎片化的索引可能会以不好或者无序的方式存储在磁盘上。im

以下图,是未经优化的数据表的使用状况。

执行语句: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容量,释放了不少空间。

相关文章
相关标签/搜索