最近,我的任务是在 myisam 表上删除并重新插入大约 1500 万行,该表有大约 1.5 亿行这样做,而表/数据库仍然可用于插入/读取。
为了做到这一点,我启动了一个进程,该进程获取小块数据并通过 insert select 语句将其重新插入到具有相同结构的克隆表中,并在运行之间休眠以不使服务器超载,跳过要删除的数据并插入替换数据。
这样,当克隆表处于构建过程中(耗时 8 小时以上)时,新数据就会进入源表。最后,我必须将表与在 8 小时内添加的新数据同步,并对表进行重命名。
一切都很好,除了一件事。克隆表上的索引的基数很差,针对它执行的查询的执行计划很糟糕(其中一些从几秒到 30+ 分钟)。
我知道这可以通过在其上运行分析表来解决,但这也需要很多时间(目前我正在从服务器上运行一个,并且现在已执行超过 10 小时)而且我买不起在执行分析时让该表脱机写入。这也会给服务器的 IO 带来压力,给服务器带来压力并减慢它的速度。
有人可以解释为什么通过插入选择语句构建 myisam 表会导致表的索引内部统计信息如此差吗?
还有一种方法可以逐步构建表并最终使索引保持良好状态吗?
提前致谢。