我什么时候重新索引我的 MySQL 数据库?

我什么时候重新索引我的 MySQL 数据库?

我的 (MySQL) 数据库正在经历间歇性锁定超时。我还没有找到根本原因,我们也没有任何建议。以前我必须重新索引我的 SQL Server 和 Oracle 索引,因为它们需要它。从来没有人谈论过这件事和 MySQL。

有什么建议吗?

答案1

除非发生崩溃或突然断电导致损坏,否则您不需要重新索引 MySQL。如果您遇到锁定问题,您可能需要考虑将 MyISAM 表(或至少是锁争用问题最大的表)转换为 InnoDB。它需要更多 RAM,但它支持行级锁定而不仅仅是表级锁定(以及许多其他改进)。

您还需要继续运行“show full processlist;”以确保它不是故意明确锁定表的操作,例如某种备份。

答案2

如前所述,所选的存储引擎是影响 MySQL 性能的主要因素。您应该使用 MyISAM 还是 InnoDB,这取决于您的工作负载。

如果您的情况是 SELECT 执行速度很快,并且对 DB 的写入活动不多,那么 MyISAM 一点也不差。但是,如果您有中等程度的写入活动和一些长时间运行的 SELECT,请注意 MyISAM 仅支持表级锁定。在缓慢的 SELECT 期间,所有写入活动都将排队,这很快就会导致各种严重的问题。

InnoDB 支持行级锁、事务和多版本控制,因此即使大量混合的读/写操作也不会像 MyISAM 那样减慢其速度。

此外,无论使用哪种存储引擎,都要确保它经过适当调整。对于 MyISAM密钥缓冲区大小表缓存是需要调整的最重要的值,对于 InnoDB 来说,首先要调整的是innodb_buffer_pool_size

但是这两种存储引擎都有各自的缺陷:例如,只有 MyISAM 支持全文索引,而 InnoDB 表空间不会缩小,因此在发生大量删除/更新/插入操作的主动更新表中,您需要不时地转储到表内容并将它们吸回来。

答案3

锁超时?MySQL 在这方面设计得相当好,特别是如果你使用 InnoDB 引擎。
索引不需要重新索引……但它们需要正确索引首先。

如果我们谈论的是实际的锁,例如死锁/超时,您应该检查任何可疑的LOCK TABLES命令。

答案4

http://dev.mysql.com/doc/refman/5.0/en/myisamchk.html

使用 myisampack 压缩表后,应该使用 myisamchk -rq 重建其索引。

但我不知道你是否需要这样做。索引应该会自动更新。

相关内容