索引也叫“键”(key),是存储引擎用于快速找到记录的一种数据结构。mysql
索引对于良好的性能很是关键。数据量愈来愈大的时候,索引的重要性也会体现出来。sql
例以下面的sql:数据结构
Select * from user where userid=123;性能
若是没有建立索引,此时查询会全表扫描优化
若是在userid字段建立了索引,会根据索引来进行查询。 blog
下面对于一样的语句使用explain 进行执行计划分析。 索引
下图是未建立索引时的执行计划,能够看到type是all,key对应的内容为空,说明没有索引或者未命中索引。table
下图是建立了userid的索引的执行计划,能够看到type是ref,possible_keys 是推测的索引名称,Key是索引名称。这样会减轻不少查询的压力。效率
在数据表使用很长时间后,表上的B-Tree索引可能会碎片化,会下降查询的效率。碎片化的索引可能会以不好或者无序的方式存储在磁盘上。im
以下图,是未经优化的数据表的使用状况。
执行语句:show table status like 'tables';,能够获得下图:
字段解释:
若是遇到上述状况,须要及时清理碎片,以便清理碎片,提高效率。
在清理碎片前,查看数据表的文件大小,作个参考。以下图:
能够看到mysql 的数据文件通常有两种:ibd,frm。
frm文件是数据表定义与格式。好比字段的类型。
Ibd文件是数据表的数据内容,主要是由数据内容与索引内容组成。能够看到当前须要整理的数据表的ibd文件是240MB。
执行命令:OPTIMIZE table tablename;能够进行压缩索引碎片。
须要注意的是,这个操做不该常常使用,以月左右的时间段为基数进行一次清理便可。
在执行optimize命令时,会锁定该表,相关操做会受到必定影响。
查看压缩后的参数,以下图:
能够看到data_free为0,说明无留存空间了。Index_length 也少了不少。
查看数据文件,一样获得了验证:
能够看到此表的ibd文件降到了160MB。较以前的240MB容量,释放了不少空间。