我有一个用例,根据table 2中id的值更新table 1中的列。我可以在几分之一秒内执行一条SELECT
语句,但是更新查询却花费了不合理的时间(大约30多分钟)。
下面是SELECT
语句:
-- 0.02 seconds
SELECT id FROM table_1
WHERE table_1.other_id = 1
AND EXISTS (
SELECT col_1
FROM table_2
WHERE table_2.table_1_id = table_1.id)
下面是UPDATE
语句:
-- 30 minutes and counting
UPDATE table_1
SET isactive = TRUE
WHERE table_1.other_id = 1
AND EXISTS (
SELECT col_1
FROM table_2
WHERE table_2.table_1_id = table_1.id)
在table_1.id
、table_1.other_id
和table_2.table_1_id
上存在btree
索引。这里提到的所有id都是整数。布尔值table_1.isactive
中没有索引。table_1
是~ 16 K记录。table_2
约为1.2亿条记录。
任何帮助都是非常欢迎的。
我已经运行了EXPLAIN
,但到目前为止无法理解结果。选择的执行计划实际上与更新的执行计划相同。仍在等待查询完成以获取EXPLAIN ANALYZE
。
1条答案
按热度按时间bejyjqdl1#
正如评论中所指出的,这个查询不应该这么慢。这只是一个交易受阻的问题。我应该更注意查询状态:
Lock:transactionid
,并检查数据库本身中的阻塞查询。事实证明,这是一个确保先前连接关闭的问题。