我有一个有200万行的mysql表,当我在表上运行任何选择查询时,它都需要很长时间才能执行,最终不会返回任何结果。
我已经尝试过从Mysql工作台和终端运行select查询,这是同样的问题。
下表:
`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 table object_master
modify column object_name varchar(1096) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL;
注意:使用在Linux Docker容器上运行的MYSQL 5.7.24版本和MYSQL。
所以我解决了这个问题:
有一个Java批处理程序在同一个表上执行查询很长一段时间,并在表上持有一个锁。我是通过";进程列表";信息表_方案。
不得不通过终端终止长期运行的查询:
mysql> kill <processlist_id> ;
然后它松开了那张桌子上的锁,一切都解决了。
从下面得到帮助SO答案:
- 如果线程丢失则解锁表
- 我如何找到哪个交易正在引起";等待表元数据锁定";州