【发布时间】: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是mysqldev.mysql.com/doc/refman/8.0/en/… 的保留字...你不能通过键命名任何列。 -
@ash:你可以如果你在它周围加上刻度,就像 OP 所做的那样。但你是对的,你可能不应该,因为它只会让处理它变得比它需要的更难。
-
@all:我解决了这个问题。有一个 Java 批处理程序在同一个表上执行了很长时间的查询并持有该表的锁。我通过 information_schema 的“processlist”表找到了这个。不得不通过终端终止长时间运行的查询。然后它释放了对该表的锁定,一切都得到了解决。
标签: mysql sql mysql-workbench