在MYSQL表上删除并重新创建索引,是否会提高性能?

在MYSQL表上删除并重新创建索引,是否会提高性能?,mysql,Mysql,我已经在新导入的MySQL数据库中执行了查询,但需要68秒才能完成。然后我在两个主表上删除并重新创建了相同的索引,只需24秒 为什么会这样?这是不是一个好的做法 提前感谢您误解了结果和原因。删除和重新创建索引并不是让它运行得更快的原因。可能会发生两件事: 1) DB不适合RAM,因此当您重新创建两个索引时,在运行查询时,这两个索引使它们中的大多数都保留在缓冲池中 2) 表是碎片或有非常轻的填充块。重新创建索引可能会重建表,这可能会提高页面占用率如果您的查询需要进行完整的表扫描,这将意味着要扫描的

我已经在新导入的MySQL数据库中执行了查询,但需要68秒才能完成。然后我在两个主表上删除并重新创建了相同的索引,只需24秒

为什么会这样?这是不是一个好的做法


提前感谢

您误解了结果和原因。删除和重新创建索引并不是让它运行得更快的原因。可能会发生两件事:

1) DB不适合RAM,因此当您重新创建两个索引时,在运行查询时,这两个索引使它们中的大多数都保留在缓冲池中

2) 表是碎片或有非常轻的填充块。重新创建索引可能会重建表,这可能会提高页面占用率如果您的查询需要进行完整的表扫描,这将意味着要扫描的表的GBs更少,并且可能碎片更少(这可能会影响到性能)


一般来说,你不应该这样做。如果禁用查询缓存(MySQL<8上的查询缓存类型=0,查询缓存大小=0),并运行两次查询,第二次是命中缓冲池的预期速度。

是的,我同意你的意见,我运行了多次查询,但只用了68秒,这就是我重新创建索引的原因。你的第二件事很可能是我的案子我有两个问题要问你为什么会发生。1) 与导入或导出过程相关的任何内容。2) 在删除和重新创建索引时会出现任何副作用。1)如果使用插入恢复,这可能会导致碎片,因为空间是逐页分配的(16KB页),InnoDB在切换到新页之前不会等待100%的页占用率。重建表的方式不同,如果执行
altertable\u name ENGINE=InnoDB(我假设您正在使用InnoDB,因为它已经不是20世纪了。)2)没有副作用,但速度很慢。我还想补充一点,如果您的查询需要24-68秒才能完成,那么可能会有大量磁盘被搅动,您的索引并没有达到最佳状态,而且你的内存大小并不像应该的那样适合任务。我想到的是,重建索引将更新索引统计信息,这可能会影响执行计划。因此,您需要检查索引重建前后的执行计划是否实际上相同(请使用
EXPLAIN
)。如果索引统计数据更新是原因,您应该能够在不使用
分析表
重建的情况下更新它。