Select 对 MYSQL table 的查询花费很长时间并超时

Select query on MYSQL table taking long time and getting timed out

我有一个包含 200 万行的 mysql table,当我在 table 上 运行 任何 select 查询时,它需要很长时间执行并最终没有 return 任何结果。

我已经尝试 运行 select 从 Mysql Workbench 和终端查询,这是同样的问题。

下面是table:

`object_master` 
  `key` varchar(300) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  `bucket` varchar(255) DEFAULT NULL,
  `object_name` varchar(300) DEFAULT NULL,
  `object_type` varchar(50) DEFAULT NULL,
  `last_modified_date` datetime DEFAULT NULL,
  `last_accessed_date` datetime DEFAULT NULL,
  `is_deleted` tinyint(1) DEFAULT '0',
  `p_object` varchar(300) DEFAULT NULL,
  `record_insert_time` datetime DEFAULT CURRENT_TIMESTAMP,
  `record_update_time` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`key`)
ENGINE=InnoDB DEFAULT CHARSET=latin1

下面是 select 查询,我是 运行 :

select `key` from object_master;

即使 limit 1 也需要很长时间而不是 return 结果,它会超时 :

select `key` from object_master limit 1;

谁能告诉我真正的原因是什么?

我还想提一下:在我 运行 这些 select 查询之前,有一个 alter table 语句在这个 table 上执行,它超时了10 分钟后 table 保持不变。

以下是更改语句:

alter table object_master
modify column object_name varchar(1096) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;

注意:在[上使用MYSQL版本5.7.24和Mysql运行 =45=] Docker 容器.

所以我解决了这个问题:

有 Java 个批处理程序长时间在同一个 table 上执行查询,并在 table 上持有锁。我通过 information_schema.

的“processlist”table 找到了这个

必须终止通过终端的长 运行 查询:

mysql> kill <processlist_id> ; 

然后它释放了那个 table 上的锁,一切都解决了。

从以下 SO 答案中获得帮助:

  1. Unlocking tables if thread is lost
  2. How do I find which transaction is causing a "Waiting for table metadata lock" state?