何时重新编制我的MySQL数据库?

我的(MySQL)数据库正在经历间歇性locking超时。 我还没有一个根本原因,我们还没有任何build议。 回到当天,我将不得不重新索引我的SQL Server和Oracle索引,因为他们需要它。 从来没有人谈论过这个和MySQL。

任何build议?

除非在崩溃或突然断电的情况下,您不应该重新索引MySQL。 如果您遇到locking问题,您可能需要考虑将您的MyISAM表(或者至less具有最大锁争用问题的表)转换为InnoDB。 它需要更多的RAM,但它支持行级locking,而不仅仅是表级locking(还有许多改进)。

您还将希望继续并运行“显示完整进程列表” 以确保它不是故意显式locking表,如某种备份。

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

如果在你的情况下,SELECTs很快就可以完成,而且对DB没有太多的写操作,MyISAM一点也不坏。 但是,如果您还有一些中等写入活动和一些长时间运行的SELECT,请注意,MyISAM仅支持表级锁。 在慢速SELECT期间,所有写入活动都将排队等待,很快就会导致各种令人讨厌的问题。

InnoDB支持行级locking,事务和多版本操作,所以即使是非常混杂的读/写操作也不会像MyISAM那样降低速度。

还要确保无论存储引擎在使用什么,它都被正确地调整。 对于MyISAM来说, key_buffer_sizetable_cache是调整的最重要的值,InnoDB首先要调整的是innodb_buffer_pool_size

但是这两个存储引擎都有自己的陷阱:例如,只有MyISAM支持全文索引,InnoDB表空间不会缩小,所以在一个积极更新的表中,有大量的删除/更新/插入操作,您需要转储到表格内容,然后把它们吸回来。

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

如果我们正在谈论实际的锁,就像死锁/超时那样,你应该检查任何可疑的LOCK TABLES命令。

听起来像索引统计的问题。

如果你正在使用MyISAM,INSERT的突然高峰会抛出MySQL查询优化器的统计数据。 这将导致MySQL查询优化器在SELECT查询的EXPLAIN计划中采用非常糟糕的猜测。

如果您使用的是InnoDB,则ANALYZE TABLE将变得毫无用处。

只要表格相当小,ANALYSE TABLE就是MyISAM所能做的。 重build索引可以定期帮助InnoDB表。

只要表格没有大量写入,索引统计将保持稳定,查询EXPLAIN计划将保持更一致。

只要记住:一旦你有大量的插入,更新和删除,所有的赌注closures可信赖的索引统计,直到下一个重build或分析表。

关于间歇性locking超时,可以考虑以下事项:InnoDB表上的SELECT可能在死锁时超时。

SELECT查询可以在gen_clust_index上执行locking,也就是Clustered Index。

这里有三个DBA Stack Exchange的问题,我用@RedBlueThing看这个问题的人。 @RedBlueThingfind解决他的问题。

请仔细阅读这些链接。 我希望这有帮助。

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

在使用myisampack压缩表之后,应该使用myisamchk -rq来重build其索引。

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

我有类似的问题,并在Sql Server的“旧时代”,我会更改查询selectNOLOCK()。

我解决了这个问题在MySQL存储过程使用:

 SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ; -- execute select command here such as (this works in stored procs as well): SELECT LAST_NAME FROM TEMP WHERE NAME LIKE 'SMITH%' ; SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ; 

– 蛤蜊维拉