我的 (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 重建其索引。
但我不知道你是否需要这样做。索引应该会自动更新。