在 MYSQL 表上选择查询需要很长时间并超时

Posted

技术标签:

【中文标题】在 MYSQL 表上选择查询需要很长时间并超时【英文标题】:Select query on MYSQL table taking long time and getting timed out 【发布时间】:2020-11-18 10:58:53 【问题描述】:

我有一个包含 200 万行的 mysql 表,当我在表上运行任何选择查询时,它需要很长时间才能执行并且最终它不会返回任何结果。

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

下表是:

`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 `key` from object_master;

即使使用limit 1 也需要很长时间并且没有返回结果,它会超时:

select `key` from object_master limit 1;

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

另外我想提一下:在我运行这些选择查询之前,在这个表上执行了一个 alter table 语句,它在 10 分钟后超时并且表保持不变。

下面是alter语句:

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

注意:使用 MYSQL 版本 5.7.24 和在 Linux Docker 容器上运行的 Mysql。

【问题讨论】:

只是那张桌子吗? SELECT 1 FROM dual; 是否返回一行?可能是任何事情,从您的桌子上未释放的锁到网络问题 keymysql dev.mysql.com/doc/refman/8.0/en/… 的保留字...你不能通过键命名任何列。 @ash:你可以如果你在它周围加上刻度,就像 OP 所做的那样。但你是对的,你可能不应该,因为它只会让处理它变得比它需要的更难。 @all:我解决了这个问题。有一个 Java 批处理程序在同一个表上执行了很长时间的查询并持有该表的锁。我通过 information_schema 的“processlist”表找到了这个。不得不通过终端终止长时间运行的查询。然后它释放了对该表的锁定,一切都得到了解决。 【参考方案1】:

所以我解决了这个问题:

有一个 Java 批处理程序在同一个表上执行了很长时间的查询并持有该表的锁。我是通过 information_schema 的“processlist”表找到的。

不得不通过终端终止长时间运行的查询:

mysql> kill <processlist_id> ; 

然后它释放了对该表的锁定,一切都解决了。

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

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

【讨论】:

以上是关于在 MYSQL 表上选择查询需要很长时间并超时的主要内容,如果未能解决你的问题,请参考以下文章

在子表上选择查询

在没有唯一键的两个表上选择查询

SQL Server - 在视图上选择列的内部查询是啥

在 Azure SQL 上运行非常缓慢的外部表上选择

MYSQL 在一列上选择两个值

MySQL 查询返回 JSON 数据需要很长时间