• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 对表进行碎片整理

    随机插入二级索引或从二级索引中删除可能导致索引碎片化。碎片意味着磁盘上索引页的物理排序与页上记录的索引排序不接近,或者64页块中有许多未使用的页已分配给索引。

    碎片的一个症状是表占用的空间超过了它应“占用”的空间。到底有多少是很难确定的。所有InnoDB数据和索引都存储在B树中,它们的填充因子可能在50%到100%之间变化。碎片化的另一个症状是,这样的表扫描花费的时间比“应该”花费的时间更多:

    SELECT COUNT(*) FROM t WHERE non_indexed_column <> 12345;
    

    前面的查询要求MySQL执行全表扫描,这是大型表的最慢查询类型。

    为了加快索引扫描,您可以定期执行“ null ”ALTER TABLE操作,这会导致MySQL重建表:

    ALTER TABLE tbl_name ENGINE=INNODB
    

    您还可以用来执行“ null ”更改操作以重建表。ALTER TABLE tbl_name FORCE

    双方并使用在线DDL。有关更多信息,请参见“ InnoDB和在线DDL”。ALTER TABLE tbl_name ENGINE=INNODBALTER TABLE tbl_name FORCE

    执行碎片整理操作的另一种方法是使用mysqldump将表转储到文本文件,删除表并从转储文件重新加载它。

    如果对索引的插入总是递增的,并且记录仅从末尾删除,则InnoDB文件空间管理算法可确保不会发生索引中的碎片。