首页 > 解决方案 > MySQL:即使在使用 FORCE INDEX 之后也很慢

问题描述

我有 2 个表: hcpcodesdefn大约250 万条记录tbl_AutounbindHCPcode_valid大约1k 条记录

我需要删除其中hcpcodesdefn存在的记录tbl_AutounbindHCPcode_valid。列:hcpid hcpcodeid

我已经创建了一个 SQL 索引:

CREATE INDEX idx_hcpid_hcpcodeid ON hcpcodesdefn(hcpid, hcpcodeid);

然后执行这个查询:

DELETE FROM hcpcodesdefn FORCE INDEX(idx_hcpid_hcpcodeid)
WHERE hcpid IN (SELECT hcpid FROM tbl_AutounbindHCPcode_valid)
AND hcpcodeid IN (SELECT hcpcodeid FROM tbl_AutounbindHCPcode_valid);

但是,执行时间仍然约为 8 分钟。

解释输出:

选择类型 桌子 类型 额外的
基本的 hcpcodesdefn 全部 2591359 使用哪里
依赖子查询 tbl_AutounbindHCPcode_valid 全部 1028 使用哪里
依赖子查询 tbl_AutounbindHCPcode_valid 全部 1028 使用哪里

(列possible_keyskeykey_lenref都是(NULL)

我尝试使用INNER JOIN,但结果不是我所期望的(使用 SELECT,而不是 DELETE 来测试结果):

SELECT a.* FROM hcpcodesdefn a
INNER JOIN tbl_AutounbindHCPcode_valid b
WHERE a.hcpid = b.hcpid AND a.hcpcodeid = b.hcpcodeid;

记录:0

如何优化性能?

标签: mysqlindexing

解决方案


不要使用IN ( SELECT ... )

在其他表上有索引。

将 witherDELETELEFT JOIN ... IS NULLor一起使用WHERE NOT EXISTS ( SELECT ... )


推荐阅读