诊断并避免MySQL cpu峰值

spr*_*aff 5 mysql

我试图发现为什么mysqld有时会使cpu和摊位饱和.

我怀疑它与更新索引或其他此类维护有关.我想证明这个假设并考虑避免它的选择.

这是情况.我有几十个表,但根据活动,似乎至少有两个表一直受此影响.让我们把它们BigSmall.Big包含总共1Mb的大约6,000行(所以不是那么大)并且Small有几十行,每行大约50个字节.Big有一个外键Small(InnoDB,删除级联,不为null).

有两种情况似乎会引发问题:a)修改Big.small_id值,或b)添加行Small.

我会直觉地期望a)非常快,O(log(size of Big))并且b)几乎是即时的,因为它Small是如此之小并且没有任何Big对它的引用发生了变化.

在每种情况下,后续的SELECT都需要二十个gigacycles(!); 之后的那个根本没有时间.还有其他表具有这两个表的外键,但是所有表都相当小,我认为它们不对这个峰值负责.

如何找出MySQL正在更新哪些索引以及每个索引需要多长时间?

或者,如果它没有更新索引,我怎么能找出其他的东西需要这么长时间?

最后,我可以设置mysqld来为这项工作提供较低的线程优先级,和/或临时禁用索引以允许非索引(非阻塞)选择与维护任务同时发生吗?

kma*_*ks2 1

可能有更好的解决方案,但我以前遇到过这样的情况:我需要查找哪些数据库/表偶尔使用大量 CPU。我执行了“显示进程列表”并将输出附加到滚动日志中。我每秒都在这样做,并保持 6 小时的滚动窗口。