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

  • 相关阅读:
    CF492B
    CF570B
    CF401C
    CF1190B
    CF413C
    CF486B
    CF976B
    NOIP 2020 解题报告
    状态压缩DP
    区间DP
  • 原文地址:https://www.cnblogs.com/zhexy/p/7750350.html
Copyright © 2020-2023  润新知