Mysql 为什么删除外键会导致InnoDB上的元数据锁定?

Mysql 为什么删除外键会导致InnoDB上的元数据锁定?,mysql,innodb,Mysql,Innodb,我有一个高流量数据库(InnoDB,Mysql 5.7.11),其中有一个表,parent\u table,其中一些表使用外键引用: my_dbchild1(约531行) my_dbchild2(约470行) my_dbchild3(约37807375行) my_dbchild4(大约10行) 这给我带来了大量迁移方面的麻烦,元数据锁甚至在非常简单的表更改(如向父表添加列)上也会阻碍通信量。最后,我决定去掉外键,并将该逻辑转移到应用程序逻辑中,以消除令人头痛的问题。但是,由于一些我完全无法理解的

我有一个高流量数据库(InnoDB,Mysql 5.7.11),其中有一个表,
parent\u table
,其中一些表使用外键引用:

my_db
child1
(约531行)
my_db
child2
(约470行)
my_db
child3
(约37807375行)
my_db
child4
(大约10行)

这给我带来了大量迁移方面的麻烦,元数据锁甚至在非常简单的表更改(如向
父表添加列)上也会阻碍通信量。最后,我决定去掉外键,并将该逻辑转移到应用程序逻辑中,以消除令人头痛的问题。但是,由于一些我完全无法理解的原因,即使是这样,也似乎挂起并导致其后面的查询挂起,并使用
等待表元数据锁
。我测试了在一个精确的副本数据库上删除外键,每次删除都需要200毫秒,所以这些操作甚至都不繁重。它们只有在交通繁忙时才会悬挂

我两个都试过了:

ALTER TABLE child3删除外键some_ibfk
并添加
ALGORITHM=INPLACE,LOCK=NONE。没什么帮助

因此,有两个问题:

  • 什么可能导致元数据锁定?我们刚刚丢了一把外键。那为什么还要锁呢
  • 什么可能会导致操作在更高流量的数据库上花费如此长的时间