【发布时间】:2021-10-15 16:45:26
【问题描述】:
我有一个包含一组表的 MySQL 5.7,我使用以下查询。
SET innodb_lock_wait_timeout = 900;
DROP TABLE IF EXISTS aggregated_table;
CREATE TABLE aggregated_table AS
SELECT
itbl.u AS u,
LEFT(itbl.e, 10) AS e,
itbl.b AS b,
itbl.c AS c,
itbl.d AS d,
itbl.ee AS ee,
h,
p,
s,
SUM(time_column) AS total_time
FROM
input_table AS itbl
WHERE
s = 1
AND b = 0
GROUP BY
u,
e,
b,
c,
d,
ee,
h,
p,
s;
80% 的查询执行正常,但有时CREATE 会失败并显示 ERROR __main__: (1205, 'Lock wait timeout exceeded; try restarting transaction'),这可能取决于在特定时刻在数据库中找到的特定数据。在相同的数据库状态下,总是会重现错误。
我想了解为什么它可能会失败以及如何保护查询免受无限锁定。
更新:EXPLAIN SELECT... 提供答案(由我的数据库客户端格式化为 JSON):
[
{
"id": 1,
"select_type": "SIMPLE",
"table": "itbl",
"partitions": null,
"type": "ALL",
"possible_keys": null,
"key": null,
"key_len": null,
"ref": null,
"rows": 56035815,
"filtered": 1,
"Extra": "Using where; Using temporary; Using filesort"
}
]
SHOW ENGINE INNODB STATUS 输出:https://pastebin.com/ZNeRi6AY
【问题讨论】:
-
哪个查询失败 - DROP 或 CREATE?
-
当然是创建。
-
你能发布
EXPLAIN SELECT...的输出吗? -
您是说 EXPLAIN SELECT 还是 EXPLAIN CREATE SELECT? @PeterKoltai
-
EXPLAIN SELECT
标签: mysql sql database-design