MySQL 索引压缩碎片
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 索引压缩碎片的主要内容,如果未能解决你的问题,请参考以下文章