我做了很多有关如何在MySQL中维护索引以防止碎片并以某种方式优化查询执行的研究。
我熟悉该公式,该公式可计算表的最大可用空间与数据和索引使用的空间之间的比率。
但是我的主要问题仍然没有答案。也许这是由于我熟悉SQL Server中的索引维护,并且我倾向于认为在MySQL中它应该在某种程度上相似。
在SQL Server中,您可以具有多个索引,并且每个索引可以具有不同级别的碎片。然后,您可以选择一个并在该特定索引中执行“ REORGANIZE”或“ REBUILD”操作,而不会影响其余的索引。
据我所知,没有这种“表碎片”,并且SQL Server没有提供任何工具来修复“表碎片”。它确实提供了检查索引碎片的工具(可以理解为索引碎片使用的工具,例如索引所使用的页数与该页的填充度和连续性之间的比率),以及内部和外部碎片。
至少对于我来说,所有这些都是很容易理解的。
现在,当轮到在MySQL中维护索引时,如上所述,仅存在“表碎片”的概念。
MySQL中的一个表可以有多个索引,但是当我用那个著名的公式检查“碎片率”时,我看不到每个索引的碎片,而是整个表。
当我想优化MySQL中的索引时,我不选择要操作的特定索引(如SQL Server中一样)。相反,我在整个表中执行“ OPTIMIZE”操作,这大概会影响所有索引。
当在MySQL中优化表时,数据+索引使用的空间与整个空间之间的比率将减小,这表明硬盘驱动器中进行了某种物理重组,这意味着物理空间的减少。但是,索引碎片不仅与物理空间有关,而且与由于插入和更新而随时间变化的树的结构有关。
最后,我在InnoDB / MySQL中得到了一个表。该表具有300万条记录,105列和55个索引。它是1.5GB(不包括索引),后者是2.1GB。
每天都要对该表进行数千次点击以进行更新和插入(实际上,我们并未删除记录)。
该表已经创建多年,我可以肯定没有人维护索引。
我原本希望在那里找到一个巨大的碎片,但是当我按照规定执行碎片计算时
free_space / (data_length + index_length)
事实证明,我的碎片只有0.2%。恕我直言,这是非常不现实的。
因此,主要问题是:
- 如何检查MySQL中特定索引的碎片,而不是整个表格
- OPTIMIZE TABLE是否像SQL Server一样实际修复了索引的内部/外部碎片?
- 当我在MySQL中优化表时,它实际上会重建表上的所有索引吗?
- 认为减少索引的物理空间(而不重建树本身)实际上转化为更好的性能是否现实?