有什么方法可以减少 MySQL 数据库文件夹中的“FTS_*_*_INDEX_1.ibd”文件大小?

SAV*_*AFA 3 mysql database innodb full-text-search

我有一个大型数据库,其中包含大约 240Gb 的数据和索引(从phpMyAdmin- 我的表位于 中读取innodb)。然而,服务器上的数据库文件夹大小接近 400Gb,而我的ibdata1文件大小约为 6Gb,导致 SSD 空间不足。

我调查了一下,似乎有很多文件,FTS_0000000000000f86_00000000000019db_INDEX_1.ibd大小有几十GB。它们看起来(根据它们的文件名)是我的关联表的全文索引,并且每个都有 6 个 (FTS_*_INDEX_1.ibdFTS_*_INDEX_6.ibd)。

我已经完成了搜索并发现了这些帖子:

Howto:清理 mysql InnoDB 存储引擎?

数据库空间与 ibdata1 大小不匹配

我已经在这两个问题/答案的评论中提出了我的问题,但尚未得到回复。所以我决定在这里直接问我的问题。

如果我启用“InnoDB Cleanup” innodb_file_per_table(如上面第一个链接中建议的那样),我还会有很多像FTS_\*_INDEX_1.ibd我的数据库文件夹一样的大文件吗?这种方法仅有助于减小ibdata1文件大小吗?经常OPTIMIZE TABLE在这些巨大的桌子上(按照建议)可以帮助我解决我的问题吗?

谢谢!

更新:

以下是大于 1Gb 的文件列表,按文件大小反向排序(文件名已更改):

-rw-rw----. 1 mysql mysql  1300234240 Jan 30 18:28 FTS_0000000000000fc2_DELETED.ibd
-rw-rw----. 1 mysql mysql  1375731712 Jan  7 21:41 FTS_0000000000000f86_00000000000019db_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  1585446912 Jan 30 23:17 FTS_0000000000001000_0000000000001a68_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  1593835520 Jan  7 21:41 FTS_0000000000000f86_00000000000019bf_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  1673527296 Jan 29 23:41 FTS_0000000000001000_DELETED.ibd
-rw-rw----. 1 mysql mysql  1824522240 Jan  7 21:41 FTS_0000000000000f86_00000000000019cd_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  2172649472 Jan 30 01:16 FTS_0000000000001073_0000000000001b3c_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  2281701376 Jan  7 21:41 FTS_0000000000000f86_00000000000019b1_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  2357198848 Jan 31 02:53 FTS_0000000000000fc2_0000000000001a0f_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  2495610880 Jan 28 13:59 FTS_0000000000000fc2_0000000000001a2b_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  2906652672 Jan 30 23:18 FTS_0000000000001000_0000000000001a76_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  3984588800 Jan 30 23:18 FTS_0000000000001000_0000000000001a6f_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  4135583744 Jan 30 08:03 FTS_0000000000000fc2_00000000000019fa_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  5716836352 Jan 28 13:59 FTS_0000000000000fc2_0000000000001a01_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  6400507904 Jan 31 05:39 my_k.ibd
-rw-rw----. 1 mysql mysql  7449083904 Jan  7 21:41 FTS_0000000000000f86_00000000000019d4_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  8115978240 Jan  7 21:41 FTS_0000000000000f86_00000000000019c6_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  8308916224 Jan 30 08:03 FTS_0000000000000fc2_0000000000001a16_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  8434745344 Jan  7 21:41 FTS_0000000000000f86_00000000000019b8_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  9244246016 Jan  7 21:41 FTS_0000000000000f86_00000000000019aa_INDEX_1.ibd
-rw-rw----. 1 mysql mysql  9714008064 Jan 30 01:16 my_a.ibd
-rw-rw----. 1 mysql mysql 12738101248 Jan 31 05:43 my_s.ibd
-rw-rw----. 1 mysql mysql 14038335488 Jan 31 02:53 FTS_0000000000000fc2_0000000000001a24_INDEX_1.ibd
-rw-rw----. 1 mysql mysql 19906166784 Jan 30 08:03 FTS_0000000000000fc2_0000000000001a1d_INDEX_1.ibd
-rw-rw----. 1 mysql mysql 21185429504 Jan 31 05:43 my_p_s.ibd
-rw-rw----. 1 mysql mysql 29242687488 Jan 31 02:54 FTS_0000000000000fc2_0000000000001a32_INDEX_1.ibd
-rw-rw----. 1 mysql mysql 30131879936 Jan  5 16:35 my_p.ibd
-rw-rw----. 1 mysql mysql 47085256704 Jan 31 05:43 my_a_c.ibd
-rw-rw----. 1 mysql mysql 76499910656 Jan 31 05:43 my_p_c.ibd
-rw-rw----. 1 mysql mysql 76743180288 Jan 30 00:09 my_r.ibd
Run Code Online (Sandbox Code Playgroud)

Ike*_*ker 5

正如您所怀疑的,这些FTS_*.ibd文件是 InnoDBFULLTEXT索引文件。缩小这些文件的最佳方法通常是删除并重新创建FULLTEXT索引。执行此操作OPTIMIZE TABLE可能有帮助,也可能没有帮助,具体取决于您是否已innodb_optimize_fulltext_only启用,但回收空间的最安全选择是删除/添加。

在仅插入工作负载上,删除/添加通常会使文件更小,如果这些表进行大量更新和/或删除,那么删除/添加节省的大小应该更大。大文件的存在FTS_*_DELETED.ibd意味着您已经从这些表中删除了一些数据,因此删除/添加索引将为您节省一些磁盘空间。

您可以使用SHOW CREATE TABLE来查找现有 FULLTEXT 索引的名称和列,以便正确地重新创建它们。

例如:

mysql > show create table your_table\G
*************************** 1. row ***************************
       Table: your_table
Create Table: CREATE TABLE `your_table` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `col1` varchar(255) DEFAULT NULL,
  `col2` varchar(255) DEFAULT NULL,
  ...
  PRIMARY KEY (`id`),
  FULLTEXT KEY `fti_idx` (`col1`,`col2`)
) ENGINE=InnoDB;
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

然后您可以在单个语句中删除和添加索引ALTER TABLE

alter table your_table
  drop index fti_idx,
  add fulltext index fti_idx (col1,col2);
Run Code Online (Sandbox Code Playgroud)