mysql - 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_keys
、key
、key_len
和ref
都是(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
如何优化性能?
解决方案
不要使用IN ( SELECT ... )
在其他表上有索引。
将 witherDELETE
与LEFT JOIN ... IS NULL
or一起使用WHERE NOT EXISTS ( SELECT ... )
推荐阅读
- c# - VSIX bindingRedirect 不适用于 System.Data.Common
- python - pandas groupby 类别与一些类别组合在一起
- javascript - 表达式绑定以格式化数字值
- django - Associating a model with another model when saving it
- python - 如何将 dict 时间序列数据列表转换为 pandas 系列?
- python-sphinx - 参考的自定义狮身人面像角色
- python - 想要使用 selenium / Python 检索给定 WebElement 的 Xpath
- android-architecture-components - 在导航组件的起始目的地时如何处理后退按钮
- django - 在另一个 Django 应用程序的模板中呈现来自另一个应用程序的表单
- git - 如何在 git 中将 .requireForce 设置为 false?