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 答案中获得帮助:
- Unlocking tables if thread is lost
- How do I find which transaction is causing a "Waiting for table metadata lock" state?
我有一个包含 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 答案中获得帮助:
- Unlocking tables if thread is lost
- How do I find which transaction is causing a "Waiting for table metadata lock" state?