mysql - 在具有 1.28 亿行的表上重建索引

标签 mysql sql sql-server indexing rebuild

我有一个包含超过 1.28 亿行的数据库表。

我必须处理的问题是索引,随着时间的推移,数据库性能非常糟糕,我将其部分归因于索引变得支离 splinter 。大表上的当前索引之一是大约 50% 的总碎片。

重组在 1 小时内完成了大约 1%,因此需要很长时间。

在这么大的表上,重建索引可能需要 5 个小时甚至更多,而且我还没有找到监控进度的真正方法。在如此大的表上重建索引的最佳和最快方法是什么?我应该将数据库设置为“离线”吗?

数据库还运行着一个非常庞大且繁忙的网站,因此我安排了最多 6 小时的停机时间来完成这项工作,但需要尽可能最快和最好的方法来完成这项工作。

我还需要更新数据库中的所有其他索引,但这张表是最难的。

最佳答案

如果您尚未针对此特定指标衡量以下两点,您可能还没有重建的理由。

  1. 您的查询在重建后立即实际改善了多少(如果有)。
  2. 改进会持续多长时间(即,您的索引在重建后需要多长时间才能恢复到稳定的 50% 碎片状态。

B-Tree 索引被设计为具有碎片/膨胀/空闲空间。索引通常会迅速恢复到稳定的碎片化状态。他们通常在这种状态下表现不错,往往想回到稳定状态。

关于mysql - 在具有 1.28 亿行的表上重建索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24695342/

相关文章:

mysql - 在 SQL 中以分钟为单位动态生成时间间隔之间的时间序列

mysql - 两个值之间的 SQL 标准

c# - SqlDataAdapter 是否在 Fill() 函数后关闭 SqlConnection?

java - SQL Server JDBC 的驱动程序类名称是什么

php - Web 应用程序转换为桌面应用程序

mysql - 在 web.py DB INSERT 中使用 SQLLiteral ("NOW()") 的可移植性如何?

mysql - 表类型 CSV 未创建

mysql - 即将发生的事件的日期更改的 SQL 查询

sql - 带有 TimescaleDB 的 PostgreSQL 在索引创建期间仅使用单个核心

sql-server - 如果 SQL Server 2008 r2 中存在,则删除列