在 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;
是否返回一行?可能是任何事情,从您的桌子上未释放的锁到网络问题
key
是mysql
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 表上选择查询需要很长时间并超时的主要内容,如果未能解决你的问题,请参考以下文章